1

わかりました、ここでいくつかの AI を試しています。Ray Wenderlich のチュートリアルに従っています。私はいくつかの奇妙な行動が続いています。たぶん、私はこれをすべて間違ってやっているだけです...しかし、どうぞ。スプライトがターゲットの 75 ピクセル以内にある場合、スプライトは防御側に切り替わり、メソッドを介してAIState呼び出しpauseSchedulerAndActionsて、所定の安全な場所に設定します。getDefensePosition私がやろうとしているのは、2秒後にアクションを再開して、スプライトが再び動き回るようにすることです。だから私は電話しますresumeSchedulerAndActions。今、これはただ通過し、getDefenseMethodこれらの 3 つの場所の間でスプライトを移動しますが、これは奇妙な動作ですgetDefenseMethod。スプライトが画面の中心から飛び回り、新しい spawnPoint に戻る前と後に 2 つの slog 呼び出しがあります。

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


}
4

1 に答える 1

2

FWIW、私はあなたのプレイヤーオブジェクトに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 は実行中のアクションと競合しません。メモリから書かれた、あなたのマイレージは異なる場合があります:)

于 2013-03-05T16:15:07.130 に答える