Стрельба по мишеням - Cocos2D - PullRequest
0 голосов
/ 22 марта 2011

Я проходил учебник которая ведет нас к созданию простой игры, в которой пользователь может стрелять в ниндзя.
В учебном пособии стреляющий снаряд был реализован следующим образом:

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {  

// Choose one of the touches to work with  
UITouch *touch = [touches anyObject];  
CGPoint location = [touch locationInView:[touch view]];  
location = [[CCDirector sharedDirector] convertToGL:location];  

// Set up initial location of projectile  
CGSize winSize = [[CCDirector sharedDirector] winSize];  
CCSprite *projectile = [CCSprite spriteWithFile:@"Projectile.png"   
rect:CGRectMake(0, 0, 20, 20)];  
projectile.position = ccp(20, winSize.height/2);  

// Determine offset of location to projectile  
int offX = location.x - projectile.position.x;  
int offY = location.y - projectile.position.y;  

// Bail out if we are shooting down or backwards  
if (offX <= 0) return;  

// Ok to add now - we've double checked position  
[self addChild:projectile];  

// Determine where we wish to shoot the projectile to  
int realX = winSize.width + (projectile.contentSize.width/2);  
float ratio = (float) offY / (float) offX;  
int realY = (realX * ratio) + projectile.position.y;  
CGPoint realDest = ccp(realX, realY);  

// Determine the length of how far we're shooting  
int offRealX = realX - projectile.position.x;  
int offRealY = realY - projectile.position.y;  
float length = sqrtf((offRealX*offRealX)+(offRealY*offRealY));  
float velocity = 480/1; // 480pixels/1sec  
float realMoveDuration = length/velocity;  

// Move projectile to actual endpoint  
[projectile runAction:[CCSequence actions:  
[CCMoveTo actionWithDuration:realMoveDuration position:realDest],  
[CCCallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)],  
nil]];  

}  

Все, что сбивает с толку в этой части, - это расчет коэффициента и его назначение. Почему мы должны рассчитать коэффициент в приведенном выше случае или позвольте мне выразить это таким образом, что означает коэффициент?

С уважением,
Камень

1 Ответ

2 голосов
/ 22 марта 2011

Если вы посмотрите на диаграмму в руководстве, это может помочь немного прояснить ситуацию.По сути, когда пользователь касается экрана, у вас будет место {x, y}, где это касание имело место.У вас также есть позиция ниндзя.используя смещение между этими точками (xoff и yoff), вы можете создать прямоугольный треугольник, который дает общее расстояние между двумя точками (как его гипотенуза).Вы можете использовать теорему Пифагора для вычисления этого.

Однако;в этом случае точка касания не используется в качестве «целевого значения» - вместо этого цель состоит в том, чтобы звезда ниндзя вылетела в направлении касания и продолжала двигаться, пока не исчезнет с экрана.

(Как правило, вы вычисляете разницу между касанием и положением ниндзя как вектор, но я думаю, что учебник пытается представить функции Cocos2D, поэтому упрощает его).

Как хочет Рэйиспользуйте CCMoveTo на звездном спрайте ниндзя, он не может напрямую задавать вектор / скорость, поэтому должен дать отдельную конечную точку.Звездный спрайт будет двигаться по прямой линии, пока не достигнет этой точки.

Таким образом, в этом случае отношение представляет собой отношение ширины меньшего треугольника к высоте меньшего треугольника (ниндзя на ощупь).Когда он перемещает позицию цели снаряда x к краю экрана

int realX = winSize.width + (projectile.contentSize.width/2);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...