0

不久前我开始把学习java作为一种爱好,因为我想做一个小游戏。我学习了java的基础知识,我决定尝试解决game-dev。我的 JFrame 和一切都很好,从技术上讲我没有错误,但我的小矩形家伙不会在屏幕上移动。这是我的代码:

package main;

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

public class Race extends JFrame {

public int speed=5;
public int up=1;
public int left=2;
public int down=3;
public int right=4;
public int direction=0;

Rectangle p1 = new Rectangle (500,400,20,40);

public Race()
{
    super("Race");
    setSize(1000,800);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container cont=getContentPane();
    cont.setBackground(Color.orange);
    setResizable(false);
}

public void paint(Graphics g)
{
    super.paint(g);
    g.setColor(Color.red);
    g.fillRect(p1.x, p1.y, p1.width, p1.height);
}


public class Move extends Thread implements KeyListener
{
    public void run()
    {
        addKeyListener(this);
        
        while(true)
        {
            try
            {
                repaint();
                
                if(direction==up)
                {
                    p1.y-=(int)speed;
                }
                if(direction==down)
                {
                    p1.y+=(int)speed;
                }
                if(direction==right)
                {
                    p1.x+=(int)speed;
                }
                if(direction==left)
                {
                    p1.x-=(int)speed;
                }   
                    Thread.sleep(75);
            }
                catch (Exception e)
                {
                    break;
                }
            }
        }

    @Override
    public void keyPressed(KeyEvent event) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void keyReleased(KeyEvent event) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void keyTyped(KeyEvent event) {
        // TODO Auto-generated method stub
        if(event.getKeyChar()=='w')
        {
            direction = up;
        }
        if(event.getKeyChar()=='d')
        {
            direction = left;
        }
        if(event.getKeyChar()=='s')
        {
        direction = down;   
        }
        if(event.getKeyChar()=='a')
        {
            direction = left;
        }
    }
    
    }
    




public static void main(String[] args)
{
    new Race();
}

}
4

2 回答 2

1

有几个问题:

  1. 您没有创建 Move 实例,因此没有任何东西在听键。
  2. 我认为您甚至不需要在后台线程中运行的 Move 类。获取 KeyListener 逻辑并将其放入您的 Race 类中,然后通过调用“启用”keyListener addKeyListener(this);以便它开始监听按键。

    Race extends JFrame implements KeyListener{
    
        Race(){
            ...
            addKeyListener(this);
        }
    
    @Override
    public void keyTyped(KeyEvent event) {
    
    if(event.getKeyChar()=='w')
       {
            direction = up;
        }
        if(event.getKeyChar()=='d')
        {
            direction = left;
        }
        if(event.getKeyChar()=='s')
        {
        direction = down;   
        }
        if(event.getKeyChar()=='a')
        {
            direction = left;
        }
        repaint();
    }
    

另请参阅此 SO 问题:Unresponsive KeyListener for JFrame以获得更多帮助。

于 2013-08-22T15:56:39.703 回答
0

如果你在 Race 类中这样调用 Move 类:

public Move move;

然后在 Race 构造函数下调用它:

move = new Move();

在你的 Move 类中,你创建了一个这样的构造函数:

public Move()
    {
        run();
    }

这应该使它移动:)

对于抬头,您需要将按键 d 更改为向右而不是向左。

于 2019-02-15T07:15:46.243 回答