Cocos2D устанавливает положение спрайта относительно другого спрайта - PullRequest
2 голосов
/ 28 июня 2011

Я уверен, что это простой вопрос для любого, кто знает что-нибудь о математике и программировании (Cocos2D), но когда дело доходит до математики, я деревенский идиот.

В моей игре есть корабль, который летает в космосе. Корабль остается в центре экрана, и камера движется вместе с кораблем. Я пытаюсь добавить снаряды, которые стреляют с корабля и движутся с одинаковой скоростью, независимо от того, на какой скорости «движется» корабль.

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

Вот что я сейчас делаю:

CGPoint tempStep = ccpAdd(self.position, ccp(10.0, 10.0));
CGPoint tempSubStep = ccpSub(self.position, player.currentLocation);
NSLog(@"Difference:  (%fx, %fy)", tempSubStep.x, tempSubStep.y);
CGPoint finalStep = ccpAdd(tempStep, tempSubStep);
//  CGPoint tempSubStep = ccpSub(tempStep, player.currentLocation);
//  CGFloat diff = ccpDistance(tempStep, player.currentLocation);
//  CGPoint tempSubStep = ccpAdd(tempStep, ccp(diff, diff));

self.position = finalStep;

Вещи, которые закомментированы, - это некоторые из вещей, которые я пробовал (хотя есть много других вещей).

  • self: Subclassed CCSprite
  • player.currentLocation - это свойство сохраненного местоположения спрайта игрока. Свойство атомарно и назначено. Если это не так, пожалуйста, дайте мне знать.

Я попытался добавить снаряды в новый слой и переместить слой со спрайтом игрока, но в тот момент, когда спрайт игрока перемещается (и, следовательно, слой), мои снаряды исчезают. Я пробовал CCLayerColor и CCParallaxNode.

В итоге :

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

Пример: игрок движется к правой верхней части экрана (так сказать) и делает выстрел в том же направлении. Игрок не обгоняет снаряд, независимо от того, как быстро он летит. В качестве альтернативы, если игрок внезапно идет в противоположном направлении, снаряд, кажется, не ускоряется внезапно, а движется с, по-видимому, той же скоростью.

Спасибо за любую помощь, которую вы можете оказать.

EDIT:

Хорошо, я думаю, что получил это. Довольно просто на самом деле.

CGPoint tempStep = ccpAdd(self.position, _direction);
CGPoint playerDiff = ccpSub(player.currentLocation, _lastKnownPlayerLocation);
CGPoint finalStep = ccpAdd(tempStep, playerDiff);

self.position = finalStep;

_lastKnownPlayerLocation = player.currentLocation;

Теперь мне просто нужно выяснить, как получить радиус в пределах диапазона.

1 Ответ

0 голосов
/ 29 июня 2011

Подтверждено, что это полное решение для всех, у кого может возникнуть этот вопрос в будущем:

// Add the direction you want the sprite to move in to it's current position
CGPoint tempStep = ccpAdd(self.position, _direction);
// Subtract the player's current location from it's last known position
CGPoint playerDiff = ccpSub(player.currentLocation, _lastKnownPlayerLocation);
// Add the projectile sprite's desired new position to the change in the player's location
CGPoint finalStep = ccpAdd(tempStep, playerDiff);
// Set the position of the projectile sprite
self.position = finalStep;

// Store the new location of the player in the buffer variable
_lastKnownPlayerLocation = player.currentLocation;

// Move the Box2D body to match the sprite position.
// Not that this will break physics for this body, but I have
// my body set as a sensor so it will still report to the contact
// listener.
b2Vec2 moveToPosition = b2Vec2(self.position.x/PTM_RATIO, self.position.y/PTM_RATIO);
_body->SetTransform(moveToPosition, 0.0);
  • self - это подкласс CCSprite, поэтому self.position - это позиция спрайта наscreen.
  • _lastKnownPlayerLocation должно быть очевидным, но это позиция спрайта игрока во время последней проверки.
  • _direction - это значение, переданное из «аналогового джойстика».Я получаю угол и передаю его классу.Класс использует ccpForAngle (угол плавания), чтобы получить CGPoint, а затем использует ccpMult (CGPoint, float), чтобы умножить его на любой шаг направления, который я хочу (имея в виду, на какую скорость вы хотите, чтобы ваш выстрел двигался).

Моя ситуация использует Box2D для многих вещей, поэтому последние 2 строки относятся к этому.

Надеюсь, это кому-нибудь поможет:)

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