对于那些对数学和编程有所了解的人(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;
被注释掉的东西是我一直在尝试的一些东西(虽然还有很多其他的东西)。
我试图将射弹添加到一个新图层并使用玩家精灵移动图层,但是当玩家精灵移动(因此该图层)时,我的射弹消失了。我尝试过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;
现在我只需要弄清楚如何获得范围内的半径。
答案 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);
我的情况是使用Box2D做很多事情,所以最后两行与此有关。
我希望这有助于某人:)