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

标签 iphone ios cocos2d-iphone game-ai

好吧,我正在尝试一些 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/

相关文章:

objective-c - cocos2d 与 View Controller

cocos2d-iphone - 从 Texture2D 迁移到 CCTexture2D 的问题(设置 CCSprite 纹理)

ios - 从终端构建项目抛出配置文件错误

objective-c - 找出 Objective C 中传递给函数的参数是右值 ( @"something") 还是左值 (foo)

iphone - 为什么我的 CGContext 绘制的圆很糟糕?

ios - 来自浏览器的播放列表/音频文件关联不起作用

ios - 测试静态库中的更改?

ios - NSURLSession 在尝试向我们分配 IP 而不是 localhost 或 home 时失败

iphone - MagicalRecord:如何将值导入相关实体

iphone - 时间间隔自日期问题