我正在研究Ray Wenderlich关于在Cocos 2d中旋转炮塔的教程(见这里:http://www.raywenderlich.com/25791/rotating-turrets-how-to-make-a-simple-iphone-game-with-cocos2d-2-x-part-2)。我需要我的游戏处于纵向模式,所以我设法正确地获得了炮塔的位置:
炮塔设法向右射击,但没有离开。这是我的代码:
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
if (_nextProjectile != nil) return;
// Choose one of the touches to work with
UITouch *touch = [touches anyObject];
CGPoint location = [self convertTouchToNodeSpace:touch];
// Set up initial location of projectile
CGSize winSize = [[CCDirector sharedDirector] winSize];
_nextProjectile = [[CCSprite spriteWithFile:@"projectile2.png"] retain];
_nextProjectile.position = ccp(160, 20);
// Determine offset of location to projectile
CGPoint offset = ccpSub(location, _nextProjectile.position);
// Bail out if you are shooting down or backwards
if (offset.x <= 0) return;
// Determine where you wish to shoot the projectile to
int realX = winSize.width + (_nextProjectile.contentSize.width/2);
float ratio = (float) offset.y / (float) offset.x;
int realY = (realX * ratio) + _nextProjectile.position.y;
CGPoint realDest = ccp(realX, realY);
// Determine the length of how far you're shooting
int offRealX = realX - _nextProjectile.position.x;
int offRealY = realY - _nextProjectile.position.y;
float length = sqrtf((offRealX*offRealX)+(offRealY*offRealY));
float velocity = 480/1; // 480pixels/1sec
float realMoveDuration = length/velocity;
// Determine angle to face
float angleRadians = atanf((float)offRealY / (float)offRealX);
float angleDegrees = CC_RADIANS_TO_DEGREES(angleRadians);
float cocosAngle = -1 * angleDegrees;
float rotateDegreesPerSecond = 180 / 0.5; // Would take 0.5 seconds to rotate 180 degrees, or half a circle
float degreesDiff = _player.rotation - cocosAngle;
float rotateDuration = fabs(degreesDiff / rotateDegreesPerSecond);
[_player runAction:
[CCSequence actions:
[CCRotateTo actionWithDuration:rotateDuration angle:cocosAngle],
[CCCallBlock actionWithBlock:^{
// OK to add now - rotation is finished!
[self addChild:_nextProjectile];
[_projectiles addObject:_nextProjectile];
// Release
[_nextProjectile release];
_nextProjectile = nil;
}],
nil]];
// Move projectile to actual endpoint
[_nextProjectile runAction:
[CCSequence actions:
[CCMoveTo actionWithDuration:realMoveDuration position:realDest],
[CCCallBlockN actionWithBlock:^(CCNode *node) {
[_projectiles removeObject:node];
[node removeFromParentAndCleanup:YES];
}],
nil]];
_nextProjectile.tag = 2;
}
感谢您的帮助!
答案 0 :(得分:2)
您正在检查x轴而不是Y
// Bail out if you are shooting down or backwards
if (offset.x <= 0) return
答案 1 :(得分:0)
您是否确实将应用程序设置为以纵向模式运行,或者您是否只是旋转了模拟器并重新定位了炮塔?
如果你没有明确地将应用程序设置为纵向运行,那么x和y坐标将被交换(x将从ios按钮运行到手机顶部,而不是像你期望的那样)。
答案 2 :(得分:0)
这个问题是您已经复制粘贴数学而不是为了您的目的正确编辑它。 Ray的代码中有一些假设依赖于你总是在炮塔右侧而不是向上,向下或向左射击。
这是你应该看的数学代码:
// Determine offset of location to projectile
CGPoint offset = ccpSub(location, _nextProjectile.position);
// Bail out if you are shooting down or backwards
if (offset.x <= 0) return;
请注意,如果攻击位置位于炮塔的左侧,您将有一个小于0的offset.x,因此这是您从Ray获取但没有修改的假设。正如gheesse所说,为了你的目的,这应该设置为offset.y,因为你不希望它们射向射弹的原始位置以南。但这只是问题的一部分。
// Determine where you wish to shoot the projectile to
int realX = winSize.width + (_nextProjectile.contentSize.width/2);
这是你的另一个大问题。你并没有修改Ray的数学来确定弹丸应该去哪里。在雷的代码中,他的射弹总是会出现在屏幕右侧的位置,所以他利用屏幕的宽度和射弹的大小来确定他想要弹丸的真实位置。去。这导致了你的问题,因为你没有假设你的射弹永远是正确的 - 你的射程总是会上升(提示,类似的代码应该用于你的实际)
float ratio = (float) offset.y / (float) offset.x;
int realY = (realX * ratio) + _nextProjectile.position.y;
再一次,雷在他的比赛中对他的比赛进行了假设,你还没有在这个实际中纠正它。你的代码使炮塔转动的方式会影响realX坐标,而不是真实的Y,这是Ray总是射击右炮塔所需要的坐标。
你需要坐下来重新做数学。