1

我正在根据 Ray Wenderlich 的 Cocos 2d 中旋转炮塔教程(参见此处:http ://www.raywenderlich.com/25791/rotating-turrets-how-to-make-a-simple-iphone-game-与-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;

}

谢谢您的帮助!

4

3 回答 3

2

您正在检查 x 轴而不是 Y

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

;

于 2013-04-12T11:07:17.693 回答
0

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

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

如果转换正确,我之前已经回答过这个问题:)

于 2013-05-10T14:53:19.230 回答
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;

请注意,如果分接位置位于炮塔左侧,则 offset.x 将小于 0,因此这是您从 Ray 那里得到的假设,但没有修改。正如 gheesse 所说,出于您的目的,这应该设置为 offset.y,因为您不希望它们在射弹的原始位置以南射击。但这只是问题的一部分。

// Determine where you wish to shoot the projectile to
int realX = winSize.width + (_nextProjectile.contentSize.width/2);

这是你的另一个大问题。你没有修改 Ray 的数学来确定射弹应该去哪里。在 Ray 的代码中,他的射弹总是会落在屏幕右侧之外的位置,因此他使用屏幕的宽度和射弹的大小来确定他想要射弹的真实位置。这导致了您的问题,因为您没有假设您的弹丸将始终朝右 - 您的弹丸将始终向上(提示,类似于此的代码应该用于您的真实)

float ratio = (float) offset.y / (float) offset.x;
int realY = (realX * ratio) + _nextProjectile.position.y;

再一次,雷在他的比赛中做出了他的数学假设,而你实际上并没有更正它。您的代码使炮塔转动的方式会影响 realX 坐标而不是 realY,这是 Ray 总是射击右炮塔需要影响的坐标。

你需要坐下来重新计算。

于 2013-05-11T21:24:43.670 回答