2015-05-11 10 views
0

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

В настоящее время это мой код. для изменения направления, не выполняет точно заданную задачу.

void change_direction(Sprite * sprite) { 

sprite->x += sprite->dx;//these two lines basically tell the sprite to move in whatever direction the button presses tell it to. by default it moves in a straight line in a northern direction. 
sprite->y += sprite->dy; 

if (pressed(SW1)) { 
sprite->dx = (sprite->dy) ? -sprite->dy : 1;//this code is very broken, what it does is it moves it either diagonally upwards, or right. it should turn the sprite 90 degrees left everytime the switch is pressed. 
sprite->dy = (sprite->dy) ? 0 : -sprite->dx; 
} 

else if(pressed(SW0)) {//this code turns the sprite right once from the default direction, but not again. what is should do is turn the sprite 90 degrees everytime. 
sprite->dx = -1; 
sprite->dy = 0; 
} 

} 

У меня было представление о том, как подойти к этому; нажатие на переключатель не изменяет новое направление, изменяя значения dx dy локально, но вместо этого увеличивает или уменьшает целое число, которое управляет направлением. Я не знаю, как бы реализовать такую ​​вещь.

+0

Привет извини, я нарисовал картинку, чтобы описать желаемое движение спрайта, потому что моя формулировка была странной. Он должен меняться на 90 градусов каждый раз. http://imgur.com/1Wi3RjP Joachim; да, потому что он всегда движется. LP; действительно? x, y - это просто местоположение, а dx/dy - направление, в которое оно направляется. –

ответ

1

повернуть направо на 90 градусов:

tmp = -sprite->dx; 
sprite->dx = sprite->dy; 
sprite->dy = tmp; 

Поверните налево на 90 градусов:

tmp = sprite->dx; 
sprite->dx = -sprite->dy; 
sprite->dy = tmp; 

Edit:

Если вы хотите только временный сдвиг (при нажатии кнопки), вам необходимо применить модификатор при обновлении x/y вместо:

if (LEFT_BUTTON_PRESSED) { 
    sprite->x -= sprite->dy; 
    sprite->y += sprite->dx; 
} 
else if (RIGHT_BUTTON_PRESSED) { 
    sprite->x += sprite->dy; 
    sprite->y -= sprite->dx; 
} 
else { 
    sprite->x += sprite->dx; 
    sprite->y += sprite->dy; 
} 
+0

Кажется, что перемещение спрайта по диагонали вверх, а затем в противоположном направлении после другого нажатия клавиши. Выглядит круто, хотя. –

+0

Я иду с обоими, просто выясняя, где объявить темп. программа не скомпилирует ее. –

+0

Объявите его внутри функции, в которой он используется. Дайте ему тот же тип, что и 'sprite-> dx'. –

0

Мое решение будет так

typedef enum 
{ 
    north, 
    south, 
    east, 
    west 
}DIRECTIONS; 

typedef struct 
{ 
    uint8_t x; 
    uint8_t y; 
    uint8_t dx; 
    uint8_t dy; 
    DIRECTIONS currentDir; 
}Sprite; 


void change_direction (Sprite * sprite) 
{ 
    sprite->x += sprite->dx; 
    sprite->y += sprite->dy; 

    if (pressed (SW0)) 
    { 
     switch(sprite->currentDir) 
     { 
      case north: 
        sprite->dx = 1; 
        sprite->dy = 0; 
        break; 
      case south: 
        sprite->dx = -1; 
        sprite->dy = 0; 
        break; 
      case east: 
        sprite->dx = 0; 
        sprite->dy = 1; 
        break; 
      case west: 
        sprite->dx = 0; 
        sprite->dy = -1; 
        break; 
     } 
    } 
} 
+0

проверить это сейчас, просто имея немного проблем с перечислением и структурой –

+0

Struct только для моего примера, используйте ваш тип Sprite. Enum должен сделать код более читаемым, не стесняйтесь изменять его по мере необходимости. – LPs