Движение игрока Objective-C ccKeyDown

В настоящее время я работаю над игрой Cocos2D для Mac в Objective-C.

У меня работает движение, но у меня есть еще один вопрос ..

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

Событие клавиатуры:

- (void)ccKeyDown:(NSEvent*)keyDownEvent
{
 // Get pressed key (code)
 NSString * character = [keyDownEvent characters];
        unichar keyCode = [character characterAtIndex: 0];

 // Player movement
 if (keyCode == 119) {
  playerMoveUp = TRUE;
 } else if (keyCode == 115) {
  playerMoveDown = TRUE;
 }
 if (keyCode == 100) {
  playerMoveLeft = TRUE;
 } else if (keyCode == 97) {
  playerMoveRight = TRUE;
 }
}

- (void)ccKeyUp:(NSEvent*)keyUpEvent
{
 // Get pressed key (code)
 NSString * character = [keyUpEvent characters];
        unichar keyCode = [character characterAtIndex: 0];

 // Player movement
 if (keyCode == 119) {
  playerMoveUp = FALSE;
 } else if (keyCode == 115) {
  playerMoveDown = FALSE;
 }
 if (keyCode == 100) {
  playerMoveLeft = FALSE;
 } else if (keyCode == 97) {
  playerMoveRight = FALSE;
 }
}

Цикл игрового времени:

-(void) tick: (ccTime) dt
{
 // Get player current position
 NSInteger playerPositionX = player.position.x;
 NSInteger playerPositionY = player.position.y;

 // Player movement
 if (playerMoveUp == TRUE) {
  player.position = ccp(playerPositionX, playerPositionY + 1);
 }
 if (playerMoveDown == TRUE) {
  player.position = ccp(playerPositionX, playerPositionY - 1);
 }
 if (playerMoveLeft == TRUE) {
  player.position = ccp(playerPositionX + 1, playerPositionY);
 }
 if (playerMoveRight == TRUE) {
  player.position = ccp(playerPositionX - 1, playerPositionY);
 }
}

Моя проблема в том, что когда мой игрок движется влево, невозможно одновременно добавить клавишу вверх, поэтому игрок будет двигаться влево и вверх. Каков наилучший способ добиться этого?


person Justin Dijkshoorn    schedule 09.12.2010    source источник


Ответы (1)


Есть простой-простой трюк: объявить массив bool типа bool arrows[4], где каждый элемент — это состояние кнопки со стрелкой и true == нажато. Теперь вы устанавливаете элемент массива в true в событии keyDown и в false в keyUp. Последнее, что вам нужно — это таймер для проверки этого массива и перемещения объектов.

На самом деле, таймер — лучшее решение, чем обычная обработка событий, потому что вы можете контролировать «скорость обработки ключей».

person Gobra    schedule 09.12.2010