Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的精灵运动_Java_Game Physics - Fatal编程技术网

Java中的精灵运动

Java中的精灵运动,java,game-physics,Java,Game Physics,不久前,我开始把学习java作为一种爱好,因为我想做一个小游戏。我学习了java的基础知识,我决定尝试处理game-dev。我的JFrame和一切都很好,技术上我没有bug,但我的小矩形不会在屏幕上移动。这是我的密码: package main; import java.awt.Color; import java.awt.Container; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.

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

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();
}

}

有几个问题:

  • 您没有创建移动实例,因此没有任何内容正在侦听关键点
  • 我认为您甚至不需要在后台线程中运行的Move类。获取KeyListener逻辑并将其放入Race类中,然后通过调用
    addKeyListener(this)来“启用”KeyListener
    因此它开始收听按键

    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问题:获取更多帮助。

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

    public Move move;
    
    然后在Race构造函数下调用它:

    move = new Move();
    
    在Move类中,您创建了如下构造函数:

    public Move()
        {
            run();
        }
    
    这应该会让它移动:)


    对于提示,您需要将按键d改为向右而不是向左。

    1)将
    setVisible(true)设置为可见
    在构造函数的末尾,2)
    重新绘制()
    是一个很好的建议,因此它不能保证重新绘制,3)在哪里使用/start
    Move
    线程?首先,开始养成注释代码的习惯是一个非常好的主意。必要时,每两行都应该有一些关于你正在做/想做什么的说明。使他人更容易理解。在根据输入调整x和y坐标后,程序是否再次调用Paint?如果不是,那可能就是问题所在。我知道我的KeyListener正在工作,因为我让它打印到控制台。我认为问题出在搬家课上,但我看不出是什么问题,所以更多的建议会有帮助!