如何检查飞船精灵和外星精灵是否在同一x轴上?我做了以下事情。他们的x位置在某个时候不符合要求。注意:敌人从右向左移动,舰船从左向右移动。

    if(enemy2.visible) {
    NSLog(@"enemy x %f", enemy2.position.x);
    NSLog(@"ship x %f", _ship.position.x);
if( enemy2.position.x < _ship.position.x)
{

        CCSprite *laser =  [_enemiesLasers objectAtIndex:_nextEnemyLaser];
        if (_nextEnemyLaser >= _enemiesLasers.count) _nextEnemyLaser = 0;
        _nextEnemyLaser++;
        [laser stopAllActions];
        laser.position=enemy2.position;
        // laser.rotation=45;
        laser.visible=YES;
        [laser runAction:[CCSequence actions:[CCMoveTo actionWithDuration:5 position:ccp(_ship.position.y, laser.position.x)], [CCCallFuncN actionWithTarget:self selector:@selector(setInvisible:)] , nil]];
    }
   }


这是NSLog输出:

    2013-12-26 23:54:24.300 SpaceGame[3559:907] enemy x 540.000000
    2013-12-26 23:54:24.301 SpaceGame[3559:907] ship x 291.999969
    2013-12-26 23:54:27.301 SpaceGame[3559:907] enemy x 540.000000
    2013-12-26 23:54:27.302 SpaceGame[3559:907] ship x 109.999985
    2013-12-26 23:54:30.366 SpaceGame[3559:907] enemy x 540.000000
    2013-12-26 23:54:30.366 SpaceGame[3559:907] ship x 269.999969

最佳答案

如果您想知道它们是否位于完全相同的x位置(例如在《太空侵略者》游戏中),则可以使用以下方法:

int enemyPosX = (int)enemy.position.x;
int shipPosX = (int)_ship.position.x;
if( enemy2.position.x < _ship.position.x)
{
  // Do Something
}


您会注意到,浮点值已强制转换为“ ints”。这是因为一旦开始在操作中使用它们,很难获得完全相同的两个浮点数。最低位可能关闭,然后它们不相等。

您还可以检查它们是否彼此“真正接近”,其中“接近度”由游戏中的公差值定义:

if(fabs(enemy2.position.x - _ship.position.x) < NEAR_IN_X)
{
   // Do Something
}


请注意,这是检查它们是否在x维度中“重叠”的检查。根据它们每次移动的距离,它们可能会在第一次之后继续重叠,因此您可能需要跟踪类似碰撞的事物的“状态”(例如{NOT_OVERLAPPING,BEGIN_OVERLAPPING,OVERLAPPING,END_OVERLAPPING})。这与使用物理引擎碰撞对象几乎一样。

即使您采用第一个解决方案仅执行“ int”转换,您仍可能必须处理多个“重叠”状态。

这个有帮助吗?

10-06 03:12