Java中的精灵运动
不久前,我开始把学习java作为一种爱好,因为我想做一个小游戏。我学习了java的基础知识,我决定尝试处理game-dev。我的JFrame和一切都很好,技术上我没有bug,但我的小矩形不会在屏幕上移动。这是我的密码: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.
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();
}
}
有几个问题:
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)在哪里使用/startMove
线程?首先,开始养成注释代码的习惯是一个非常好的主意。必要时,每两行都应该有一些关于你正在做/想做什么的说明。使他人更容易理解。在根据输入调整x和y坐标后,程序是否再次调用Paint?如果不是,那可能就是问题所在。我知道我的KeyListener正在工作,因为我让它打印到控制台。我认为问题出在搬家课上,但我看不出是什么问题,所以更多的建议会有帮助!