小编dur*_*ill的帖子

通过接口引用多个集合中的同一对象

警告:此问题使用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# interface

11
推荐指数
1
解决办法
981
查看次数

C#游戏中NPC的异步行为

这个问题与这个问题有关(使用C#5异步来等待在多个游戏帧上执行的事情).

上下文

当Miguel de Icaza在Alt-Dev-Conf 2012上首次为游戏提供C#5异步框架时,我真的很喜欢使用asyncawait处理"脚本" 的想法(可以这么说,因为它们在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)

.net c# mono asynchronous c#-5.0

9
推荐指数
1
解决办法
1154
查看次数

stm32f4中的写周期很少

我正在使用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次写入.那么我做错了什么?

stm32 flash-memory stm32f4discovery

0
推荐指数
1
解决办法
3690
查看次数