警告:此问题使用RPG的类比作为示例.
假设我正在使用C#制作这个我梦寐以求的角色扮演游戏.当玩家进入战斗时,会出现某种战场,其中包含与战斗相关的每个元素的参考,例如战场上可用的各种对手和物品.
现在所有这些元素只有一个但有几个角色:例如,Ally(通过直接继承的战斗机)能够在战场上移动,发出命令或被敌人作为目标.
现在,石头中的强大剑也在战斗中扮演了一些角色.显然它不能移动也不能发出命令,但它仍然可以成为目标,它可以(希望)被解除或使用.
所有这些行为都由我的代码中的接口表示,因此无论实现它的对象如何,都可以使用具有相同行为的所有对象.
代码示例:
public class Ally : Fighter, IMovable, IActor, ITarget
{
// IMovable implementation
public void Move(...) { ... }
// IActor implementation
public bool HasInitiative { get { ... } }
public ICommand IssueCommand(...) { ... }
// ITarget implementation
public void OnTarget(...) { ... }
// other code ...
}
public class MightySword : ITarget, ILiftable, IUsable
{
// ITarget implementation
public void OnTarget(...) { ... }
// ... other interface implementation
// other …Run Code Online (Sandbox Code Playgroud) 这个问题与这个问题有关(使用C#5异步来等待在多个游戏帧上执行的事情).
当Miguel de Icaza在Alt-Dev-Conf 2012上首次为游戏提供C#5异步框架时,我真的很喜欢使用async和await处理"脚本" 的想法(可以这么说,因为它们在c#中,在我的情况下,编译---在时间上,但无论如何编译)在游戏中.
即将推出的Paradox3D游戏引擎似乎也依赖于异步框架来处理脚本,但从我的角度来看,这个想法和实现之间存在着真正的差距.
在链接的相关问题中,有人使用awaitNPC执行一系列指令,而游戏的其余部分仍在运行.
我想更进一步,允许NPC同时执行多个操作,同时以顺序方式表达这些操作.有点像:
class NonPlayableCharacter
{
void Perform()
{
Task walking = Walk(destination); // Start walking
Task sleeping = FallAsleep(1000); // Start sleeping but still walks
Task speaking = Speak("I'm a sleepwalker"); // Start speaking
await walking; // Wait till we stop moving.
await sleeping; // Wait till we wake up.
await speaking; // Wait till …Run Code Online (Sandbox Code Playgroud) 我正在使用STM32F401VCT6U"发现"板,我需要为用户提供一种在运行时在内存中写入地址的方法.
我写了可以简化为以下功能的内容:
uint8_t Write(uint32_t address, uint8_t* values, uint8_t count)
{
uint8_t index;
for (index = 0; index < count; ++index) {
if (IS_FLASH_ADDRESS(address+index)) {
/* flash write */
FLASH_Unlock();
if (FLASH_ProgramByte(address+index, values[index]) != FLASH_COMPLETE) {
return FLASH_ERROR;
}
FLASH_Lock();
} else {
/* ram write */
((uint8_t*)address)[index] = values[index]
}
}
return NO_ERROR;
}
Run Code Online (Sandbox Code Playgroud)
在上面,address是基址,values是一个至少大小的缓冲区,count它包含要写入内存count的字节和要写入的字节数.
现在,我的问题如下:当address在flash中使用base调用上述函数时count=100,它在前几次正常工作,将传递的values缓冲区写入flash.然而,在那些前几次调用之后,我不能再写任何值了:我只能复位flash中的值中的位,例如,尝试将0xFF写入0x7F将在闪存中留下0x7F,而将0xFE写入0x7F将留下0x7E,并且任何值的0x00都将成功(但之后其他任何值都不会写入该地址).
我仍然可以通过改变基数来正常写入闪存中的其他地址address,但是再次只能写几次(两次或三次调用count=100).
此行为表明已达到闪存的最大写入次数,但我无法想象它会如此之快.在用尽之前,我预计至少有10,000次写入.那么我做错了什么?