Skip to content

Latest commit

 

History

History
410 lines (338 loc) · 14.2 KB

7.新建输入类.md

File metadata and controls

410 lines (338 loc) · 14.2 KB

GameEngine Java 3D V2.0

7.新建输入类

首先定义按键的数量与鼠标的控制数量

并且建好抬起 按下 正在按下三种状态的键盘与鼠标队列

public class Input {
    /*
    * 键盘与鼠标的状态数
    * */
    public static final int NUM_KEYCODES = 256;
    public static final int NUM_MOUSEBUTTONS = 5;

    /*
    * 当前 键盘按下 当前键盘值 键盘抬起的值
    * */
    private static ArrayList<Integer> currentKeys = new ArrayList<Integer>();
    private static ArrayList<Integer> downKeys = new ArrayList<Integer>();
    private static ArrayList<Integer> upKeys = new ArrayList<Integer>();
    /*
     * 当前 鼠标按下 当前鼠标值 鼠标抬起的值
     * */
    private static ArrayList<Integer> currentMouse = new ArrayList<Integer>();
    private static ArrayList<Integer> downMouse = new ArrayList<Integer>();
    private static ArrayList<Integer> upMouse = new ArrayList<Integer>();
}

定义键盘按下时 判断是否抬起 与 按下键盘的方法

    /*
    * 获取键盘传来的key值
    * */
    public static boolean getKey(int keyCode){
        return Keyboard.isKeyDown(keyCode);
    }
    /*
    * 获取按下键盘获得的值
    * */
    public static boolean getKeyDown(int keyCode){
        return downKeys.contains(keyCode);
    }
    /*
    * 获取抬起键盘获得的值
    * */
    public static boolean getKeyUp(int keyCode){
        return upKeys.contains(keyCode);
    }

鼠标同理

    /*
    * 鼠标事件同理
    * */
    public static boolean getMouse(int mouseButton) {
        return Mouse.isButtonDown(mouseButton);
    }

    public static boolean getMouseDown(int mouseButton) {
        return downMouse.contains(mouseButton);
    }

    public static boolean getMouseUp(int mouseButton) {
        return upMouse.contains(mouseButton);
    }

再编写更新事件 对鼠标与键盘进行更新

/*
    * 更新事件
    * */
    public static void update() {
        //是否正在按下鼠标 是则压入队列
        currentMouse.clear();
        for(int i = 0; i < NUM_MOUSEBUTTONS;i++){
            if(getMouse(i)){
                currentMouse.add(i);
            }
        }
        //是否按下鼠标 是则压入队列
        downMouse.clear();
        for (int i = 0;i<NUM_MOUSEBUTTONS;i++){
            if (getMouse(i) && !currentMouse.contains(i)){
                downMouse.add(i);
            }
        }
        //是否已经抬起鼠标 是则压入队列
        upMouse.clear();
        for (int i=0;i<NUM_MOUSEBUTTONS;i++){
            if(!getMouse(i) && currentMouse.contains(i)){
                upMouse.add(i);
            }
        }
        //键盘功能同理
        upKeys.clear();

        for(int i = 0; i < NUM_KEYCODES; i++)
            if(!getKey(i) && currentKeys.contains(i))
                upKeys.add(i);

        downKeys.clear();

        for(int i = 0; i < NUM_KEYCODES; i++)
            if(getKey(i) && !currentKeys.contains(i))
                downKeys.add(i);

        currentKeys.clear();

        for(int i = 0; i < NUM_KEYCODES; i++)
            if(getKey(i))
                currentKeys.add(i);


    }

既然我们已经建好了Input类 那么就可以为 Game的接口里加入input

public interface CyberGame {

    /*
     * 开始
     * */

    void start();

    /*
     * 更新
     * */
    void update();

    /*
     * 渲染
     * */
    void render();

    /*
    * 输入
    * */
    void input();

}

在类里写入测试

    /*
    * 输入事件
    * */

    public void input(){
        if(Input.getKeyDown(Keyboard.KEY_UP))
            System.out.println("Up键已经被按下");
        if (Input.getKeyUp(Keyboard.KEY_UP)){
            System.out.println("Up建已经被抬起");
        }
        if(Input.getMouseDown(1)) {
            System.out.println("右键被按下");
        }
        if(Input.getMouseUp(1)){
            System.out.println("右键被抬起");
        }
    }

在入口类更新逻辑

更新

结果:

更新

后面可以换成这样

public class Input {
    /*
    * 键盘与鼠标的状态数
    * */
    public static final int NUM_KEYCODES = 256;
    public static final int NUM_MOUSEBUTTONS = 5;

    /*
    * 上次的按键与鼠标
    * */
    private static ArrayList<Integer> lastKeys = new ArrayList<Integer>();
    private static ArrayList<Integer> lastMouse = new ArrayList<Integer>();



    public static void update(){
        lastKeys.clear();

        for(int i = 0; i < NUM_KEYCODES; i++)
            if(getKey(i))
                lastKeys.add(i);

        lastMouse.clear();

        for(int i = 0; i < NUM_MOUSEBUTTONS; i++)
            if(getMouse(i))
                lastMouse.add(i);
    }
    /*
    * 创建键盘与鼠标的抬起与按下的判断
    * */
    public static boolean getKey(int keyCode)
    {
        return Keyboard.isKeyDown(keyCode);
    }

    public static boolean getKeyDown(int keyCode)
    {
        return getKey(keyCode) && !lastKeys.contains(keyCode);
    }

    public static boolean getKeyUp(int keyCode)
    {
        return !getKey(keyCode) && lastKeys.contains(keyCode);
    }

    public static boolean getMouse(int mouseButton)
    {
        return Mouse.isButtonDown(mouseButton);
    }

    public static boolean getMouseDown(int mouseButton)
    {
        return getMouse(mouseButton) && !lastMouse.contains(mouseButton);
    }

    public static boolean getMouseUp(int mouseButton)
    {
        return !getMouse(mouseButton) && lastMouse.contains(mouseButton);
    }
    /*
    * 获取鼠标当前位置
    * */
    public static Vector2f getMousePosition()
    {
        return new Vector2f(Mouse.getX(), Mouse.getY());
    }


}

之后将一些常用的Input常量写入

    public static final int KEY_NONE            = 0x00;
    public static final int KEY_ESCAPE          = 0x01;
    public static final int KEY_1               = 0x02;
    public static final int KEY_2               = 0x03;
    public static final int KEY_3               = 0x04;
    public static final int KEY_4               = 0x05;
    public static final int KEY_5               = 0x06;
    public static final int KEY_6               = 0x07;
    public static final int KEY_7               = 0x08;
    public static final int KEY_8               = 0x09;
    public static final int KEY_9               = 0x0A;
    public static final int KEY_0               = 0x0B;
    public static final int KEY_MINUS           = 0x0C; /* - on main keyboard */
    public static final int KEY_EQUALS          = 0x0D;
    public static final int KEY_BACK            = 0x0E; /* backspace */
    public static final int KEY_TAB             = 0x0F;
    public static final int KEY_Q               = 0x10;
    public static final int KEY_W               = 0x11;
    public static final int KEY_E               = 0x12;
    public static final int KEY_R               = 0x13;
    public static final int KEY_T               = 0x14;
    public static final int KEY_Y               = 0x15;
    public static final int KEY_U               = 0x16;
    public static final int KEY_I               = 0x17;
    public static final int KEY_O               = 0x18;
    public static final int KEY_P               = 0x19;
    public static final int KEY_LBRACKET        = 0x1A;
    public static final int KEY_RBRACKET        = 0x1B;
    public static final int KEY_RETURN          = 0x1C; /* Enter on main keyboard */
    public static final int KEY_LCONTROL        = 0x1D;
    public static final int KEY_A               = 0x1E;
    public static final int KEY_S               = 0x1F;
    public static final int KEY_D               = 0x20;
    public static final int KEY_F               = 0x21;
    public static final int KEY_G               = 0x22;
    public static final int KEY_H               = 0x23;
    public static final int KEY_J               = 0x24;
    public static final int KEY_K               = 0x25;
    public static final int KEY_L               = 0x26;
    public static final int KEY_SEMICOLON       = 0x27;
    public static final int KEY_APOSTROPHE      = 0x28;
    public static final int KEY_GRAVE           = 0x29; /* accent grave */
    public static final int KEY_LSHIFT          = 0x2A;
    public static final int KEY_BACKSLASH       = 0x2B;
    public static final int KEY_Z               = 0x2C;
    public static final int KEY_X               = 0x2D;
    public static final int KEY_C               = 0x2E;
    public static final int KEY_V               = 0x2F;
    public static final int KEY_B               = 0x30;
    public static final int KEY_N               = 0x31;
    public static final int KEY_M               = 0x32;
    public static final int KEY_COMMA           = 0x33;
    public static final int KEY_PERIOD          = 0x34; /* . on main keyboard */
    public static final int KEY_SLASH           = 0x35; /* / on main keyboard */
    public static final int KEY_RSHIFT          = 0x36;
    public static final int KEY_MULTIPLY        = 0x37; /* * on numeric keypad */
    public static final int KEY_LMENU           = 0x38; /* left Alt */
    public static final int KEY_LALT            = KEY_LMENU; /* left Alt */
    public static final int KEY_SPACE           = 0x39;
    public static final int KEY_CAPITAL         = 0x3A;
    public static final int KEY_F1              = 0x3B;
    public static final int KEY_F2              = 0x3C;
    public static final int KEY_F3              = 0x3D;
    public static final int KEY_F4              = 0x3E;
    public static final int KEY_F5              = 0x3F;
    public static final int KEY_F6              = 0x40;
    public static final int KEY_F7              = 0x41;
    public static final int KEY_F8              = 0x42;
    public static final int KEY_F9              = 0x43;
    public static final int KEY_F10             = 0x44;
    public static final int KEY_NUMLOCK         = 0x45;
    public static final int KEY_SCROLL          = 0x46; /* Scroll Lock */
    public static final int KEY_NUMPAD7         = 0x47;
    public static final int KEY_NUMPAD8         = 0x48;
    public static final int KEY_NUMPAD9         = 0x49;
    public static final int KEY_SUBTRACT        = 0x4A; /* - on numeric keypad */
    public static final int KEY_NUMPAD4         = 0x4B;
    public static final int KEY_NUMPAD5         = 0x4C;
    public static final int KEY_NUMPAD6         = 0x4D;
    public static final int KEY_ADD             = 0x4E; /* + on numeric keypad */
    public static final int KEY_NUMPAD1         = 0x4F;
    public static final int KEY_NUMPAD2         = 0x50;
    public static final int KEY_NUMPAD3         = 0x51;
    public static final int KEY_NUMPAD0         = 0x52;
    public static final int KEY_DECIMAL         = 0x53; /* . on numeric keypad */
    public static final int KEY_F11             = 0x57;
    public static final int KEY_F12             = 0x58;
    public static final int KEY_F13             = 0x64; /*                     (NEC PC98) */
    public static final int KEY_F14             = 0x65; /*                     (NEC PC98) */
    public static final int KEY_F15             = 0x66; /*                     (NEC PC98) */
    public static final int KEY_KANA            = 0x70; /* (Japanese keyboard)            */
    public static final int KEY_CONVERT         = 0x79; /* (Japanese keyboard)            */
    public static final int KEY_NOCONVERT       = 0x7B; /* (Japanese keyboard)            */
    public static final int KEY_YEN             = 0x7D; /* (Japanese keyboard)            */
    public static final int KEY_NUMPADEQUALS    = 0x8D; /* = on numeric keypad (NEC PC98) */
    public static final int KEY_CIRCUMFLEX      = 0x90; /* (Japanese keyboard)            */
    public static final int KEY_AT              = 0x91; /*                     (NEC PC98) */
    public static final int KEY_COLON           = 0x92; /*                     (NEC PC98) */
    public static final int KEY_UNDERLINE       = 0x93; /*                     (NEC PC98) */
    public static final int KEY_KANJI           = 0x94; /* (Japanese keyboard)            */
    public static final int KEY_STOP            = 0x95; /*                     (NEC PC98) */
    public static final int KEY_AX              = 0x96; /*                     (Japan AX) */
    public static final int KEY_UNLABELED       = 0x97; /*                        (J3100) */
    public static final int KEY_NUMPADENTER     = 0x9C; /* Enter on numeric keypad */
    public static final int KEY_RCONTROL        = 0x9D;
    public static final int KEY_NUMPADCOMMA     = 0xB3; /* , on numeric keypad (NEC PC98) */
    public static final int KEY_DIVIDE          = 0xB5; /* / on numeric keypad */
    public static final int KEY_SYSRQ           = 0xB7;
    public static final int KEY_RMENU           = 0xB8; /* right Alt */
    public static final int KEY_RALT            = KEY_RMENU; /* right Alt */
    public static final int KEY_PAUSE           = 0xC5; /* Pause */
    public static final int KEY_HOME            = 0xC7; /* Home on arrow keypad */
    public static final int KEY_UP              = 0xC8; /* UpArrow on arrow keypad */
    public static final int KEY_PRIOR           = 0xC9; /* PgUp on arrow keypad */
    public static final int KEY_LEFT            = 0xCB; /* LeftArrow on arrow keypad */
    public static final int KEY_RIGHT           = 0xCD; /* RightArrow on arrow keypad */
    public static final int KEY_END             = 0xCF; /* End on arrow keypad */
    public static final int KEY_DOWN            = 0xD0; /* DownArrow on arrow keypad */
    public static final int KEY_NEXT            = 0xD1; /* PgDn on arrow keypad */
    public static final int KEY_INSERT          = 0xD2; /* Insert on arrow keypad */
    public static final int KEY_DELETE          = 0xD3; /* Delete on arrow keypad */
    public static final int KEY_LMETA           = 0xDB; /* Left Windows/Option key */
    public static final int KEY_LWIN            = KEY_LMETA; /* Left Windows key */
    public static final int KEY_RMETA           = 0xDC; /* Right Windows/Option key */
    public static final int KEY_RWIN            = KEY_RMETA; /* Right Windows key */
    public static final int KEY_APPS            = 0xDD; /* AppMenu key */
    public static final int KEY_POWER           = 0xDE;
    public static final int KEY_SLEEP           = 0xDF;