2016-07-23 7 views
-1

Я новичок в разработке игр и решил начать работу над 2D-спринклером. Я использую библиотеку Slick2D для этой игры.Ввод Java 2D-игры (лучшая практика?)

Мой вопрос о наилучшей практике для принятия множественного ввода направления для перемещения спрайтов (UP + RIGHT = Diagonal)

В настоящее время у меня есть довольно уродливый глядя, если/ElseIf цепи для чтения на входе с клавиатуры, затем проверяется в классе «Mob», чтобы определить, как спрайт будет двигаться. Текущая настройка работает нормально, но мой вопрос заключается в том, что есть другой, лучший способ использовать несколько входов для диагоналей (или любой комбинации клавиш, если на то пошло)

Вот метод обновления основного класса, который читает вход (ляп является экземпляром «Mob»):

public void update(GameContainer container, StateBasedGame arg1, int delta) throws SlickException { 
    Input input = container.getInput(); 


    if(input.isKeyDown(Input.KEY_RIGHT)) {   //RIGHT 
     if(input.isKeyDown(Input.KEY_UP)){   //RIGHT + UP 
      blooper.direction = 2; 
     } else if(input.isKeyDown(Input.KEY_DOWN)){ //RIGHT + DOWN 
      blooper.direction = 3; 
     } 
     else { 
      blooper.direction = 1; 
     } 
    } else if(input.isKeyDown(Input.KEY_LEFT)){  //LEFT 
     if(input.isKeyDown(Input.KEY_UP)){   //LEFT + UP 
      blooper.direction = 5; 
     } else if(input.isKeyDown(Input.KEY_DOWN)){ //LEFT + DOWN 
      blooper.direction = 6; 
     } else{ 
      blooper.direction = 4; 
     } 
    } else if(input.isKeyDown(Input.KEY_UP)){  //UP 
     if(input.isKeyDown(Input.KEY_RIGHT)){  //UP + RIGHT 
      blooper.direction = 8; 
     } else if(input.isKeyDown(Input.KEY_LEFT)){ //UP + LEFT 
      blooper.direction = 9; 
     } else{ 
      blooper.direction = 7; 
     } 
    } else if(input.isKeyDown(Input.KEY_DOWN)){  //DOWN 
     if(input.isKeyDown(Input.KEY_RIGHT)){  //DOWN + RIGHT 
      blooper.direction = 11; 
     } else if(input.isKeyDown(Input.KEY_LEFT)){ //DOWN + LEFT 
      blooper.direction = 12; 
     } else{ 
      blooper.direction = 10; 
     } 
    } else{ 
     blooper.direction = -1; 
    } 

    blooper.update(delta); 

} 

а вот как этот вход обрабатывается в классе Mob:

public class Mob { 

private final int RIGHT  = 1; 
private final int RIGHTUP = 2; 
private final int RIGHTDOWN = 3; 
private final int LEFT  = 4; 
private final int LEFTUP = 5; 
private final int LEFTDOWN = 6; 
private final int UP  = 7; 
private final int UPRIGHT = 8; 
private final int UPLEFT = 9; 
private final int DOWN  = 10; 
private final int DOWNRIGHT = 11; 
private final int DOWNLEFT = 12; 
private final int IDLE  = -1; 

int direction = IDLE; 

int x, y; 
Image sprite; 

public Mob() throws SlickException{ 
    x = 20; 
    y = 20; 
    sprite = new Image("res/blooper.png"); 
} 

public void update(int delta){ 
    move(); 
} 

public void draw(){ 
    sprite.draw(x, y); 
} 

public void move(){ 

    switch(direction){ 
     case RIGHT: 
      x += 1; 
      break; 
     case RIGHTUP: 
      x += 1; 
      y -= 1; 
      break; 
     case RIGHTDOWN: 
      x += 1; 
      y += 1; 
      break;   
     case LEFT: 
      x -= 1; 
      break; 
     case LEFTUP: 
      x -= 1; 
      y -= 1; 
      break; 
     case LEFTDOWN: 
      x -= 1; 
      y += 1; 
      break; 
     case UP: 
      y -= 1; 
      break; 
     case UPRIGHT: 
      y -= 1; 
      x += 1; 
      break; 
     case UPLEFT: 
      y -= 1; 
      x -= 1; 
      break; 
     case DOWN: 
      y += 1; 
      break; 
     case DOWNRIGHT: 
      y += 1; 
      x += 1; 
      break; 
     case DOWNLEFT: 
      y += 1; 
      x -= 1; 
      break; 
     case IDLE: 
      //nothing 
     } 
    } 
} 

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

ответ

1

Сделать движение влево/вправо и вверх/вниз независимым. Вы (или структура - я незнаком с ним), похоже, работают с координатами x/y, которые являются математически независимыми. Таким образом, создайте одну функцию, которая обрабатывает движение вверх/вниз и одну функцию, которая обрабатывает движение влево/вправо, и вы можете избавиться от своих «комбинаций». Есть ли причина, по которой направления являются положительными целыми числами? Попробуйте сделать left = -1, right = 1, и нет движения x в направлении 0, а затем сделать то же самое для y. Это, надо надеяться, сделает его более интуитивным.

Счастливый кодирования

+0

Спасибо за совет - не знаю, почему я был пытаясь объединить их с одним методом move(). Это должно сработать - я выработаю изменения и дам вам обновление! Еще раз спасибо! – pocket86

0

Сделать blooper.direction побитовое, как:

blooper.direction=0; 
if(input.isKeyDown(Input.KEY_RIGHT)) blooper.direction|=1; 
if(input.isKeyDown(Input.KEY_LEFT)) blooper.direction|=2; 
if(input.isKeyDown(Input.KEY_UP)) blooper.direction|=4; 
if(input.isKeyDown(Input.KEY_DOWN)) blooper.direction|=8; 

затем в move сделать движение, как:

if ((blooper.direction&1)!=0) x+=1; 
if ((blooper.direction&2)!=0) x-=1; 
if ((blooper.direction&4)!=0) y-=1; 
if ((blooper.direction&8)!=0) y+=1; 
+0

Мне нравится этот более минималистический подход. Я посмотрю, смогу ли я реализовать это и дать вам обновление. Благодаря! – pocket86