java - 简单的小程序游戏错误

标签 java swing applet keylistener repaint

我的小程序遇到问题。它的目的是创建一个游戏,您可以移动屏幕底部的 block 以穿过从上方掉落的 block 中的孔。我已经实现了该 block ,但当我按下某个键时无法让该 block 移动。 这是我的源代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MathewBorumGame extends JApplet
{
    public void init()
    {
        Dimension dim = getSize();
        MathewBorumGamePanel avoidance = new MathewBorumGamePanel(dim);
        add(avoidance);
        Thread game = new Thread(avoidance);
        game.start();
    }
}// end of the extended JApplet class

class MathewBorumGamePanel extends JPanel implements Runnable{
    protected int x = 225;
    protected int y = 450;
    private int speed = 0;
    private boolean isPlaying = false;
    private boolean hasHit = false;
    private String instructions = "Press 'Enter' to start survive as long as"
        + " as possible.";
    private String keyInstructions = "Use arrow keys to move.";
    private String test;
    private Dimension dim = null;
    private Thread game = null;
    private Timer timer = new Timer(1000, new TimerListener());
    public MathewBorumGamePanel(Dimension paramDimension) {
        this.dim = paramDimension;
        setBackground(new Color(255, 255, 204));
        setForeground(Color.black);
        addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                        switch (e.getKeyCode()) {
                    case KeyEvent.VK_LEFT:
                        if(x >= 10) x = x - 10;
                        repaint();
                        break;
                    case KeyEvent.VK_RIGHT:
                        if(x <= 490) x = x + 10;
                        repaint();
                        break;
                    default:
                        repaint();
                        break;
                }
            }
        });
    }
    public void run() {
        for (;;) {
            repaint();
        }
    }
    public void paintComponent(Graphics paramGraphics) {
        super.paintComponent(paramGraphics);
        paramGraphics.fillRect(x, y, 50, 15);
        paramGraphics.setFont(new Font("Serif", Font.BOLD, 15));
        paramGraphics.drawString(this.instructions, 30, 30);
        paramGraphics.drawString(this.keyInstructions, 30, 50);
        test = test.valueOf(x);
        paramGraphics.drawString(test, 30, 70);
    }

    private class TimerListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            repaint();
        }
    }
}//end of the extended JPanel class

谢谢

最佳答案

请参阅代码中的注释以获取更多提示..

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

// <applet code='MathewBorumGame' width=400 height=400></applet>
public class MathewBorumGame extends JApplet
{
    public void init()
    {
        Dimension dim = getSize();
        MathewBorumGamePanel avoidance = new MathewBorumGamePanel(dim);
        add(avoidance);
        /*
        Thread game = new Thread(avoidance);
        game.start();*/
    }
}// end of the extended JApplet class

class MathewBorumGamePanel extends JPanel { //implements Runnable{
    protected int x = 225;
    protected int y = 450;
    private int speed = 0;
    private boolean isPlaying = false;
    private boolean hasHit = false;
    private String instructions = "Press 'Enter' to start survive as long as"
        + " as possible.";
    private String keyInstructions = "Use arrow keys to move.";
    private String test;
    private Dimension dim = null;
    private Thread game = null;
    private Timer timer = new Timer(1000, new TimerListener());
    public MathewBorumGamePanel(Dimension paramDimension) {
        this.dim = paramDimension;
        setBackground(new Color(255, 255, 204));
        setForeground(Color.black);
        addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                        switch (e.getKeyCode()) {
                    case KeyEvent.VK_LEFT:
                        System.out.println("Go left");
                        if(x >= 10) x = x - 10;
                        repaint();
                        break;
                    case KeyEvent.VK_RIGHT:
                        System.out.println("Go right");
                        if(x <= 490) x = x + 10;
                        repaint();
                        break;
                    default:
                        //repaint();
                        break;
                }
            }
        });
        // Must be focusable!
        setFocusable(true);
        // very important!  Must have focus..
        requestFocusInWindow();
        timer.start();
    }

    /*  THIS IS NOT HOW TO DO ANIMATION!
    @Override
    public void run() {
        for (;;) {
            repaint();
        }
    }*/

    public void paintComponent(Graphics paramGraphics) {
        super.paintComponent(paramGraphics);
        paramGraphics.fillRect(x, y, 50, 15);
        paramGraphics.setFont(new Font("Serif", Font.BOLD, 15));
        paramGraphics.drawString(this.instructions, 30, 30);
        paramGraphics.drawString(this.keyInstructions, 30, 50);
        test = test.valueOf(x);
        paramGraphics.drawString(test, 30, 70);
    }

    private class TimerListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            repaint();
        }
    }
}//end of the extended JPanel class

关于java - 简单的小程序游戏错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16529005/

相关文章:

java - Youtube API集成+RecyclerView(Resources.KEY无法解析)

Java 匹配引号中的内容

java - 将桌面应用程序移植到 Applet 沙箱

java - Applet 可以工作,但 Swing 组件不会出现!

java - 将细节字节数组从小程序发布到服务器

java - 对话API调用

java - 如何在不使用 XPath 的情况下查找表类型元素的地址

java - swing - GridBagLayout 中带有长文本的 JLabel

Java:保持JPanel背景图像的纵横比

java - 如何显示层次结构 (Java)