Есть ли способ сделать сочетания клавиш Space Invaders так, чтобы, когда я стрелял, это не останавливало движение? - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть игра Java Space Invaders, использующая привязки клавиш для элементов управления;Как я могу предотвратить остановку движения при съемке?

Первоначально я использовал списки ключей, но где-то читал, что связывание клавиш решит эту проблему (так же, как и у меня задержка в начальном движении), но это не помогло.,Для пояснения, ни один из символов не является JComponent, но сочетания клавиш зарегистрированы в окне JFrame, и они работают.

// создаем окно window = new Window ();

    DataStorageObject data = new DataStorageObject(window);

    //Keybinding code

    Action leftAction = new AbstractAction() 
    {
    @Override
    public void actionPerformed(ActionEvent arg0) 
        {
    if(!data.paused)
            {
    if(data.usership.getXPos() != 0)
    data.usership.setXPos(data.usership.getXPos() - 15);
            }
        }
    };

    Action shootAction = new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent arg0) {
    if(!data.paused) {
    if(data.cooldown == 0)
    {
    // fire a bullet
    PositionObject bullet = new PositionObject();
    bullet.setXPos(data.usership.getXPos() + data.window.usershipimage.getWidth() / 2);// TODO figure out the right number
    bullet.setYPos(data.usership.getYPos());// TODO figure out the right number
    data.userbullets.add(bullet);

    // start cooldown
    data.cooldown = 30; // TODO figure out the right number
    }
    }
    }};

    Action rightAction = new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent arg0) {
    if(!data.paused) {
    if(!(data.usership.getXPos() >= data.window.INVADERSWIDTH - data.window.usershipimage.getWidth()))
    data.usership.setXPos(data.usership.getXPos() + 15);
    }
    }};

    Action pauseAction = new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            data.paused = !data.paused;
        }};



    KeyStroke space = KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,0);
    KeyStroke left = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,0);
    KeyStroke right = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,0);
    KeyStroke p = KeyStroke.getKeyStroke(KeyEvent.VK_P,0);

    //random component solution 
    JLabel listener= new JLabel();
    JFrame frame = new JFrame();
    window.add2Container(listener);
    //figure out where put focus and what parameter for mapname
    window.requestFocus();

    int mapName = JComponent.WHEN_IN_FOCUSED_WINDOW;

    InputMap inputMap = listener.getInputMap(mapName);

    inputMap.put(space, "shoot");
    inputMap.put(left, "left");
    inputMap.put(right, "right");
    inputMap.put(p, "pause");

    ActionMap amap = listener.getActionMap();

    amap.put("shoot", shootAction);
    amap.put("left", leftAction);
    amap.put("right", rightAction);
    amap.put("pause", pauseAction);

1 Ответ

0 голосов
/ 27 декабря 2018

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

...