1

敵のクラス用にAIを作成しようとしていますが、どの敵がプレーヤーに最も近いかを更新するのに問題があります。敵が2人しかない場合は機能しますが、問題が発生した場合は3人以上の場合に機能します。私は最も近い攻撃だけが欲しいのですが、最も遠い敵を除いてすべての敵が攻撃します。3つ以上のスプライトを使用すると、1つが他のスプライトの間にあり、自分の位置をsafePositionとattackPositionにすることができるためだと思いますが、tempEnemyが目の前にある場合、どのようにして中央の敵に気付かせますか?

 CCArray *fellowEnemy = [self allyArray];
for (int i = 0; i<[fellowEnemy count]; i++) {
    Enemy *tempEnemy = [fellowEnemy objectAtIndex:i];
    if (tempEnemy == self) continue;
    CGPoint tempDifference = ccpSub(player.position, tempEnemy.position);
    CGPoint selfDifference = ccpSub(player.position, self.position);
    float tempToPlayer = ccpLength(tempDifference);
    float selfToPlayer = ccpLength(selfDifference);

    if (tempToPlayer > selfToPlayer) {
        newPosition = attackPosition;

    }else if (tempToPlayer < selfToPlayer){
        newPosition = safePosition;

    }else{
        newPosition = safePosition;
    }
}

[self setPosition:newPosition];

ありがとうございました

4

1 に答える 1

0

私があなたの質問を正しく理解しているなら、あなたはプレイヤーに最も近い敵を特定しようとしています。真ん中のものは常にプレイヤーに最も近いものになります。ですから、プレイヤーまでの距離が最小のものを見つける必要があります。

    CCArray *fellowEnemy = [self allyArray];
    if( fellowEnemy.count > 0 )
    {
        Enemy *closestEnemy = nil;
        float minDistance = 0;

        for (int i = 0; i<[fellowEnemy count]; i++) {
            Enemy *tempEnemy = [fellowEnemy objectAtIndex:i];
            if (tempEnemy == self) continue;

            if( closestEnemy == nil )
            {
                closestEnemy = tempEnemy;
                minDistance = ccpDistance(player.position, closestEnemy.position);
                continue;
            }

            float curDistance = ccpDistance(player.position, tempEnemy.position);
            if( curDistance < minDistance )
            {
                minDistance = curDistance;
                closestEnemy = tempEnemy;
            }
        }

        if( closestEnemy != nil )
        {
            // Here you have closest enemy 
            // Write your remaining logic (position, attack... whatever)
        }
    }
于 2013-02-07T20:39:10.030 に答える