首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java 2D游戏开发:多键输入

Java 2D游戏开发:多键输入
EN

Stack Overflow用户
提问于 2013-04-08 00:57:06
回答 1查看 997关注 0票数 1

我正在尝试让一个用Java编写的2D游戏的控件工作。然而,我在移动中遇到了一个奇怪的bug。每当我在射击(空格键)时尝试使用向上和向左控制,或者在射击时使用向下和向右控制时,游戏都无法检测到按下空格键。以下是相关代码摘录:

代码语言:javascript
运行
复制
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.ImageIcon;

public class Player {
    private String playerPath = "images/craft.png";
    private int x, y, dx, dy;
    private Image image;
    private ArrayList missiles;
    private final int CRAFT_SIZE = 20;

    public Player() {
        ImageIcon ii = new ImageIcon(playerPath);
        image = ii.getImage();
        missiles = new ArrayList();
        x = 20;
        y = 20;
    }
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        if (key == KeyEvent.VK_SPACE) {
            fire();
        }
        if (key == KeyEvent.VK_LEFT) {
            dx = -1;
        }
        if (key == KeyEvent.VK_RIGHT) {
            dx = 1;
        }
        if (key == KeyEvent.VK_UP) {
            dy = -1;
        }
        if (key == KeyEvent.VK_DOWN) {
            dy = 1;
        }
    }
    public void keyReleased(KeyEvent e) {
        int key = e.getKeyCode();
        if (key == KeyEvent.VK_LEFT) {
            dx = 0;
        }
        if (key == KeyEvent.VK_RIGHT) {
            dx = 0;
        }
        if (key == KeyEvent.VK_UP) {
            dy = 0;
        }
        if (key == KeyEvent.VK_DOWN) {
            dy = 0;
        }
    }
    public void fire() {
        missiles.add(new Projectile(x + CRAFT_SIZE, y + CRAFT_SIZE/2));
    }
}//end class Player

代码语言:javascript
运行
复制
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Game extends JPanel implements ActionListener {
    private Player player;
    private Timer timer;

    private int winHeight;
    private int winWidth;
    private final int UP = KeyEvent.VK_UP;
    private final int DOWN = KeyEvent.VK_DOWN;
    private final int LEFT = KeyEvent.VK_LEFT;
    private final int RIGHT = KeyEvent.VK_RIGHT;
    private final int SPACE = KeyEvent.VK_SPACE;

    public Game(int w, int h) {
        addKeyListener(new TAdapter());
        setBackground(Color.BLACK);
        addKeyListener(new TAdapter());
        setFocusable(true);
        setDoubleBuffered(true);

        player = new Player();

        winHeight = h;
        winWidth = w;

        timer = new Timer(5, this);
        timer.start();
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);

        Graphics2D g2d = (Graphics2D) g;
        g2d.drawImage(player.getImage(), player.getX(), player.getY(), this);

        ArrayList proj = player.getMissiles();

        for (Object p : proj) {
            Projectile b = (Projectile) p;
            g2d.drawImage(b.getImage(), b.getX(), b.getY(), this);
        }

        Toolkit.getDefaultToolkit().sync();
        g.dispose();
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        // Update projectile locations
        ArrayList ms = player.getMissiles();

        for (int i = 0; i < ms.size(); i++) {
            Projectile p = (Projectile) ms.get(i);
            if (p.getX() <= winWidth) {
                p.move();
            } else {
                ms.remove(p);
            }
        }
        player.move();
        repaint();
    }

    private class TAdapter extends KeyAdapter {
        @Override
        public void keyReleased(KeyEvent e) {
            player.keyReleased(e);
        }

        @Override
        public void keyPressed(KeyEvent e) {
            player.keyPressed(e);
        }
    }// end class TAdapter
}// end class Game
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-08 01:28:01

每当我尝试在射击(空格键)时使用向上和向左控制,或者在射击时向下和向右移动时,游戏都无法检测到按下空格键。

仅为最后一次按下的键生成KeyEvents。如果你想同时处理多个按键,那么你需要:

  1. 跟踪已按下/释放的键
  2. 使用Swing计时器安排动画。

然后,每当计时器触发时,您将检查当前按下了哪些键,并对该键执行操作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15865087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档