如何正确地子类化(至少)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
我正在尝试调用我创建的 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