Java 2D游戏键输入(最佳实践?)

时间:2016-07-23 23:14:41

标签: java input keypress slick2d 2d-games

我是游戏开发的新手,并选择开始制作2D自上而下的滚动游戏。我在这个游戏中使用Slick2D库。

我的问题是关于为精灵运动采取多个方向输入的最佳实践(UP + RIGHT =对角线)

目前,我有一个相当难看的if / elseif链来读取键盘的输入,然后在' Mob'用于确定精灵如何移动的类。目前的设置工作得很好,但我的问题是,是否有另一种更好的方法可以为对角线(或任何组合的键)提供多个输入

以下是主要类的更新方法,它读取输入(blooper是' 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
        }
    }
}

就像我说的......这是有效的,但似乎并不是最好的方法。有什么提示吗?

2 个答案:

答案 0 :(得分:1)

使左/右和上/下运动独立。你(或框架 - 我不熟悉它)似乎使用x / y坐标,这在数学上是独立的。 因此,制作一个处理上/下运动的功能,以及一个处理左/右运动的功能,你可以摆脱它们的“组合”。有没有理由说明方向是正整数?尝试使left = -1,right = 1,并且没有x方向移动0,然后对y执行相同操作。这应该有希望使它更直观。

快乐编码

答案 1 :(得分: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;