Cocos2d-iphone:从外星飞船射击激光

时间:2013-12-26 21:23:14

标签: ios cocos2d-iphone

如何检查船只精灵和外星精灵是否在同一个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

1 个答案:

答案 0 :(得分:2)

如果你想知道他们是否处于完全相同的x位置,就像游戏太空入侵者一样,你可以使用这样的东西:

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

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

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

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

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

即使您采用第一个只进行“int”转换的解决方案,您仍可能需要处理多个“重叠”状态。

这有用吗?