Cocos2D设置与另一个精灵相关的精灵位置

时间:2011-06-28 18:03:57

标签: objective-c math cocos2d-iphone

对于那些对数学和编程有所了解的人(Cocos2D),我确信这是一个简单的问题,但在数学方面,我是乡村白痴。

我的游戏中有一艘在太空中飞来飞去的船。船停留在屏幕的中央,摄像机随船一起移动。我试图添加从船上发射的射弹,无论船舶“移动”的速度如何,都以相同的速度移动。

为了弄清楚这一点,我一直试图在每一步中将(10.0,10.0)添加到我的射弹精灵的位置。这是有效的(虽然它总是在左上角),但是如果我试图将船或相机的运动添加到精灵位置以及(10.0,10.0)我完全错了。

以下是我目前正在做的事情:

CGPoint tempStep = ccpAdd(self.position, ccp(10.0, 10.0));
CGPoint tempSubStep = ccpSub(self.position, player.currentLocation);
NSLog(@"Difference:  (%fx, %fy)", tempSubStep.x, tempSubStep.y);
CGPoint finalStep = ccpAdd(tempStep, tempSubStep);
//  CGPoint tempSubStep = ccpSub(tempStep, player.currentLocation);
//  CGFloat diff = ccpDistance(tempStep, player.currentLocation);
//  CGPoint tempSubStep = ccpAdd(tempStep, ccp(diff, diff));

self.position = finalStep;

被注释掉的东西是我一直在尝试的一些东西(虽然还有很多其他的东西)。

  • self:Subclassed CCSprite
  • player.currentLocation是玩家精灵的持有位置属性。属性是原子的并且已分配。如果这是错的,请告诉我。

我试图将射弹添加到一个新图层并使用玩家精灵移动图层,但是当玩家精灵移动(因此该图层)时,我的射弹消失了。我尝试过CCLayerColor和CCParallaxNode。

总结

我想发射一个来自船位的射击。我希望它能以恒定的速度远离船只,无论在击球后射击船的运动如何。

示例:播放器正在向屏幕的右上方移动(可以这么说)并向同一方向发射一个镜头。无论玩家飞得多快,玩家都不会超过射弹。或者,如果玩家突然向相反方向移动,则抛射物似乎不会突然加速,而是以看似相同的速度移动。

感谢您提供任何帮助。

编辑:

好的,我想我可能已经得到了它。非常简单。

CGPoint tempStep = ccpAdd(self.position, _direction);
CGPoint playerDiff = ccpSub(player.currentLocation, _lastKnownPlayerLocation);
CGPoint finalStep = ccpAdd(tempStep, playerDiff);

self.position = finalStep;

_lastKnownPlayerLocation = player.currentLocation;

现在我只需要弄清楚如何获得范围内的半径。

1 个答案:

答案 0 :(得分:0)

确认这是将来可能会遇到此问题的所有人的完整解决方案:

// Add the direction you want the sprite to move in to it's current position
CGPoint tempStep = ccpAdd(self.position, _direction);
// Subtract the player's current location from it's last known position
CGPoint playerDiff = ccpSub(player.currentLocation, _lastKnownPlayerLocation);
// Add the projectile sprite's desired new position to the change in the player's location
CGPoint finalStep = ccpAdd(tempStep, playerDiff);
// Set the position of the projectile sprite
self.position = finalStep;

// Store the new location of the player in the buffer variable
_lastKnownPlayerLocation = player.currentLocation;

// Move the Box2D body to match the sprite position.
// Not that this will break physics for this body, but I have
// my body set as a sensor so it will still report to the contact
// listener.
b2Vec2 moveToPosition = b2Vec2(self.position.x/PTM_RATIO, self.position.y/PTM_RATIO);
_body->SetTransform(moveToPosition, 0.0);
  • self是CCSprite的子类,因此self.position是精灵在屏幕上的位置。
  • _lastKnownPlayerLocation应该是显而易见的,但这是上次检查时玩家精灵的位置。
  • _direction是来自“模拟棒”的传入值。我得到了角度并将它传递给了班级。该类使用ccpForAngle(浮点角度)来获取CGPoint,然后使用ccpMult(CGPoint,float)将其乘以我想要的任何方向步长(意味着你希望你的镜头移动速度)。

我的情况是使用Box2D做很多事情,所以最后两行与此有关。

我希望这有助于某人:)