如何正确地子类化(至少)5 个复杂的 NPC,以便以后有多个实例

How to properly subclass (at least) 5 complex NPC's to have multiple instances of later

我正在尝试调用我创建的 NPC class 的实例(随机数量:3-7 之间)。我有 5 个(计划制作更多)这样不同的 NPC classes,它们都低于 class SKSpriteNode。不幸的是,每个 class 的粗略布局都很简单:一个定义 NPC 的 SKPhysicsBody 的方法和一些简短的方法(1 是 public)帮助在将 class 导入 GameScene 时对其进行动画处理(SKScene 子class)。我在 GameScene 中写了很多代码,其中 90% 与 NPC 与世界的行为方式有关。所有这些东西都没有写在各自的 NPC classes 中的原因是 A)我还不太擅长编程和 B)GameScene 中的大部分代码都依赖于更新方法:

-(void)update:(NSTimeInterval)currentTime
{
}

NPC的每一个随机移动方法之类的东西都在(void)update方法里面,但是这些方法是写在GameScene里面的,而不是在各自的NPC里面classes。因此,我不能调用同一个 NPC 的多个实例 class。如果我这样做了,我需要的任何数量都会被创建,但它们与一种随机移动方法相关联,因此在同步移动时相互重叠,使其看起来好像是一个 NPC 单元。所以问题是:我可以只复制 GameScene 中的 NPC 方法并将它们粘贴到它们各自的 class 中(显然解决了问题),然后将一个单独的更新方法粘贴到每个 class 中吗?这是因为它们在 GameScene 中调用时可以单独运行,而不必依赖 GameScene 的 (void)update 方法。如果有关于如何处理此类事情的建议、方法或教程,我将不胜感激。

你可以使用主更新方法,并将更新方法放在你的NPC子类中。

这是一个简单的例子,说明如何在 GameScene 之外跟踪时间

class NPC: SKSpriteNode {
    var delta = NSTimeInterval(0)


    // this update gets called from the GameScene class, 
    // put all the NPC movement logic in here
    func update(delta: NSTimeInterval){
        self.delta = delta
    }

}

class GameScene: SKScene {

    // time values
    var delta:NSTimeInterval = NSTimeInterval(0)
    var last_update_time:NSTimeInterval = NSTimeInterval(0)

    let NPCs: [NPC] = [NPC(), NPC(), NPC()]

    func update(currentTime: NSTimeInterval){

        if self.last_update_time == 0.0 || catchUp {
            self.delta = 0
        } else {
            self.delta = currentTime - self.last_update_time
        }

        self.last_update_time = currentTime

        for npc in self.NPCs {
            npc.update(delta)
        }
    }
}

编辑,对象 C 中的相同代码

@interface NPC : SKSpriteNode
    -(void)update:(NSTimeInterval)delta;
@end

@implementation NPC
NSTimeInterval _delta;

-(void)update:(NSTimeInterval)delta {
    _delta = delta;
}
@end


#import "GameScene.h"
#import "NPC.h"

@implementation GameScene
// time values
NSTimeInterval _delta;
NSTimeInterval _last_update_time;
NSMutableArray *_NPCs;

-(void)didMoveToView:(SKView *)view {
    _NPCs = [[NSMutableArray alloc]initWithCapacity:3];

    for(int i = 0; i < 3; i++){
        NPC *npc = [[NPC alloc]init];

        [_NPCs addObject:npc];
    }

}


-(void)update:(CFTimeInterval)currentTime {

    if (_last_update_time) {
        _delta = currentTime - _last_update_time;
    } else {
        _delta = 0;
    }
    _last_update_time = currentTime;

    for(NPC *npc in _NPCs){
        [npc update:_delta];
    }

}

@end