好的,我在这里尝试了一些人工智能的东西,并且我一直在关注一些Ray Wenderlich教程。我有一些奇怪的行为。也许我做的这一切都错了。但这是你的。当sprite距离目标不到75个像素时,它会切换到防御AIState
,我调用pauseSchedulerAndActions
并通过getDefensePosition
方法将其设置到预定的安全位置。我尝试做的是在2秒后恢复动作,这样精灵就会再次移动。所以我打电话给resumeSchedulerAndActions
。现在这只是通过getDefenseMethod
,它在这三个地方移动精灵,但这是奇怪的行为,我有两个slog调用,一个在getDefenseMethod
之前,一个在精灵从屏幕中心跳来跳去,然后回到新的spawnPoint:
2013-03-04 20:08:14.897 10-8[2629:c07] before: {217.533, 177.32}
2013-03-04 20:08:14.898 10-8[2629:c07] spawnPoint 1
2013-03-04 20:08:14.899 10-8[2629:c07] after: {100, 100}
我不明白它为什么要这么做。为什么它不从它所处的位置开始呢?
- (void)execute:(GangMembers *)player {
// Check if should change state
NSArray * enemies = [player.layer enemiesOutsideRange:75 ofPlayer:player];
if (enemies.count > 0) {
NSLog(@"outside range 75");
[player changeState:[[Attacking alloc] init]];
return;
}
[player.layer setPlayer:player attacking:NO];
// Make build decision
[player.layer unschedule:@selector(shoot:)];
[player pauseSchedulerAndActions];
NSLog(@"before: %@", NSStringFromCGPoint(player.position));
[self getDefensePosition];
player.position = spawnPoint;
NSLog(@"after: %@", NSStringFromCGPoint(player.position));
[player performSelector:@selector(resumeSchedulerAndActions) withObject:player afterDelay:2];
}
- (void)getDefensePosition {
// CGSize winSize = [CCDirector sharedDirector].winSize;
int spawnChoice = arc4random() % 3;
spawnPoint = ccp(100, 100);
if(spawnChoice == 0){
spawnPoint = ccp(100, 100);
NSLog(@"spawnPoint 1");
}
else if(spawnChoice == 1){
spawnPoint = ccp(100, 200);
NSLog(@"spawnPoint 2");
}
else {
spawnPoint = ccp(100, 300);
NSLog(@"spawnPoint 3");
}
}
发布于 2013-03-06 00:15:07
顺便说一句,我怀疑你的player对象有一些CCMove类型的动作(你正在暂停)。即使您在暂停时更改了位置,当动作恢复时,该动作也会将位置设置为其当前状态(startPosition、endPosition、duration、自启动以来经过的时间),这可能与您在暂停期间设置的位置完全不同。
不确定您的对象模型/类结构,但类似于:
[player stopAllActions];
player.position = spawnPoint;
[player runAction: [CCSequence actions:
[CCDelayTime actionWithDuration:2.0],
[CCMoveTo actionWithDuration:arc4random()%5+1 position: randomPoint],
[CCCallBlock actionWithBlock:^{ [self performSelector:@selector(moveRandom:) withObject:s afterDelay:0.5]; }],
nil]
];
这样,您可以重新创建将从spawnPoint执行的moveto操作,并且您的player.position不会与正在运行的操作争用。从内存中写入,您的里程可能会有所不同:)
https://stackoverflow.com/questions/15215806
复制相似问题