纵向模式Cocos2d中的偏移问题

时间:2013-04-12 11:04:29

标签: ios objective-c cocos2d-iphone

我正在研究Ray Wenderlich关于在Cocos 2d中旋转炮塔的教程(见这里:http://www.raywenderlich.com/25791/rotating-turrets-how-to-make-a-simple-iphone-game-with-cocos2d-2-x-part-2)。我需要我的游戏处于纵向模式,所以我设法正确地获得了炮塔的位置:enter image description here

炮塔设法向右射击,但没有离开。这是我的代码:

- (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;

}

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

您正在检查x轴而不是Y

// Bail out if you are shooting down or backwards
if (offset.x <= 0) return

答案 1 :(得分:0)

您是否确实将应用程序设置为以纵向模式运行,或者您是否只是旋转了模拟器并重新定位了炮塔?

如果你没有明确地将应用程序设置为纵向运行,那么x和y坐标将被交换(x将从ios按钮运行到手机顶部,而不是像你期望的那样)。

如果转换正确I have answered this question before:)

答案 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总是射击右炮塔所需要的坐标。

你需要坐下来重新做数学。