Cocos2D弹丸速度

时间:2014-01-31 00:24:48

标签: ios objective-c cocos2d-iphone

我是cocos2d和游戏开发的新手。目前我正在关注这个tutorial,到目前为止一直很好,基本上是:

  • 怪物在屏幕上产生并从右向左移动并再次移出屏幕。
  • 玩家处于固定位置且无法移动。
  • 玩家在触摸时拍摄忍者明星。(仍然没有碰撞)

问题:弹丸速度变化(越接触屏幕的上边界或下边界越快(游戏水平放置,如代码下方的图像所示)。我相信这是因为目标点距离我最远接近我的角色和上/下边缘,星星需要在给定时间内到达那一点(参见代码)。无论我触摸到哪里,我都希望速度恒定。我怎样才能达到如果我对我的解释感到茫然,我很抱歉。

这是明星/抛射物代码:

- (void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
    // 1
    CGPoint touchLocation = [touch locationInNode:self];

    // 2
    CGPoint offset    = ccpSub(touchLocation, _player.position);
    float   ratio     = offset.y/offset.x;
    int     targetX   = _player.contentSize.width/2 + self.contentSize.width;
    int     targetY   = (targetX*ratio) + _player.position.y;
    CGPoint targetPosition = ccp(targetX,targetY);

    // 3
    CCSprite *projectile = [CCSprite spriteWithImageNamed:@"projectile.png"];
    projectile.position = _player.position;
    [self addChild:projectile ];

    // 4
    CCActionRotateBy *actionRotate = [CCActionRotateBy actionWithDuration: 0.5f angle:360];
    [projectile runAction:[CCActionRepeatForever actionWithAction:actionRotate]];
    CCActionMoveTo *actionMove   = [CCActionMoveTo actionWithDuration: 1.5f position:targetPosition];
    CCActionRemove *actionRemove = [CCActionRemove action];
    [projectile runAction:[CCActionSequence actionWithArray:@[actionMove,actionRemove]]];
 }

正如您在actionMove行中所看到的,射弹速度取决于到达targetPosition所需的时间(此图像可能有助于[没有足够的声誉来发布图像]): http://cdn5.raywenderlich.com/wp-content/uploads/2014/01/Cocos2D_MonsterMath.png

提前致谢,我们非常感谢任何帮助或阅读材料。

1 个答案:

答案 0 :(得分:0)

如果您的射弹只是以恒定速度沿直线移动,那么:

distance = speed * time

因此,如果你想为你的忍者星设定一个恒定的速度,时间将根据行进的距离而变化。

像这样计算距离:

float distance = sqrtf(powf(targetPosition.x - projectile.position.x, 2.0f) + powf(targetPosition.y - projectile.position.y, 2.0f));

设定速度并计算时间:

ccTime flightTime = distance / speed;

flightTime

中使用CCAction
CCActionMoveTo *actionMove = [CCActionMoveTo actionWithDuration:flightTime 
                                                       position:targetPosition];