2013-04-12 3 views
1

Я работаю над учебником 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Проблемы с смещениями в портретном режиме Cocos2d

Револьвер управляет стрельбой вправо, но не влево. Вот мой код:

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

Действительно ли вы установили приложение для работы в портретном режиме или просто повернули симулятор и переместили башню?

Если вы не указали явное приложение для работы в портрете, ваши координаты x и y будут заменены (x будет запускаться с кнопки iOS на верхнюю часть телефона, а не так, как вы ожидали).

Если он преобразуется правильно I have answered this question before :)

+0

Привет.Я использовал ваш ответ из вашего связанного ответа, и он отлично работает, за исключением случаев, когда вы стреляете прямо вверх, скорость снаряда идет невероятно быстрее, чем остальные. Любые идеи для +50? – 2013-05-12 10:27:59

+0

Вам нужно увидеть значение realMoveDuration, когда он стреляет прямо вверх. Это скорость снаряда и рассчитывается на расстоянии от конечной точки снаряда. NSLog вне переменной длины и realMoveDuration, и вы должны обнаружить проблему. – davbryn

2

Вы проверяете оси х вместо Y

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

;

+0

Если я изменю это, башня смотрит вниз, а затем стреляет, а не стреляет, где я постучал. – 2013-04-12 11:09:45

+1

попробуйте изменить координату y - в отличие от других макетов cocos2d имеет y0 внизу – gheese

0

Эта проблема здесь в том, что у Вас есть копия вставили математику вместо редактирования правильно для ваших целей. В коде Рэя есть некоторые предположения, которые полагаются на то, что вы стреляете всегда справа от башни, а не вверх, вниз или влево.

Вот математический код, который вы должны смотреть на:

// 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, если место кран слева от башни, так что это предположение, которое вы взяли у Рэя, но не пересматривали. Как сказал гейзе, для ваших целей это должно быть настроено на смещение. Как вы не хотите, чтобы они стреляли к югу от исходного места снаряда. Но это только часть проблемы.

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

Опять же, Рэй делает предположения в его математике для его игры, и вы не исправили ее в этом реальном. Ваш код имеет турель, поворачивающуюся таким образом, что будет влиять на координату realX вместо realY, которая является координатой, которую Ray всегда стреляет в правую башню, необходимую для выполнения.

Вам нужно сесть и переделать математику.

+0

Мне жаль, что вы нашли мой код полным мусором. Но я попытался изменить координаты, но все, что я нахожу, - ничто. Я подумал, что было бы хорошо, если бы вы начали с самого начала, чтобы люди могли указать, в каких областях работать. Мне нужен только тот, кто меняет координаты. – 2013-05-12 10:08:43

Смежные вопросы