gpt4 book ai didi

iphone - 当我使用 resumeSchedulerAndActions 时 Sprite 跳来跳去

转载 作者:行者123 更新时间:2023-11-29 11:02:33 25 4
gpt4 key购买 nike

好吧,我正在尝试一些 AI 的东西,我一直在关注 Ray Wenderlich 的一些教程。我有一些奇怪的行为。也许我只是做错了......但是你去吧。当 Sprite 距离目标 75 像素以内时,它会切换到防御 AIState,我会调用 pauseSchedulerAndActions 并通过 getDefensePosition 将其设置到预定的安全点> 方法。我想做的是在 2 秒后恢复 Action ,这样 Sprite 就会再次移动。所以我调用 resumeSchedulerAndActions。现在这只是通过 getDefenseMethod 并在这三个位置之间移动 te sprite 但这是奇怪的行为我有两个 slog 调用,一个在 getDefenseMethod 之前,一个在 sprite 之后从屏幕中心跳来跳去,然后回到新的生成点:

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");
}


}

最佳答案

FWIW,我怀疑你的玩家对象有一些 CCMove 类型的 Action (你正在暂停)。即使您在暂停时更改了位置,当 Action 恢复时, Action 会将位置设置为其当前状态(startPosition、endPosition、持续时间、自开始以来耗时),这可能与您在暂停期间设置的位置有很大不同。

不确定你的对象模型/类结构,但像这样:

    [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 不与正在运行的 Action 争用。根据内存写的,你的里程可能会有所不同:)

关于iphone - 当我使用 resumeSchedulerAndActions 时 Sprite 跳来跳去,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15215806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com