gpt4 book ai didi

java - 矩形不动

转载 作者:太空宇宙 更新时间:2023-11-04 11:10:12 24 4
gpt4 key购买 nike

您好,我正在尝试创建一款打砖 block 游戏。有一个名为 Real_Main 的主类和另一个扩展 JPanel 的名为 Real_Create 的类。我觉得我的代码是正确的,但我似乎无法用左右箭头键 move 我的矩形。谁能告诉我有什么问题吗?为什么我们需要一个计时器来 move 矩形?

import javax.swing.JFrame;
public class Real_Main {

public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame jf= new JFrame();

Real_Create panel=new Real_Create();

jf.setSize(500, 500);
jf.setVisible(true);
jf.setResizable(false);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.add(panel);

}

}

Real_Create:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;
import javax.swing.Timer;

public class Real_Create extends JPanel implements KeyListener,ActionListener {

int baseX=200;

int ballX=250;
int ballY=250;
int delay=20;

Timer tim;


Boolean play=false;


public Real_Create(){

addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);

tim=new Timer(delay,this);

tim.start();

}


public void paint(Graphics g){

//background
g.setColor(Color.black);
g.fillRect(1,1,500,500 );

//baseplayer

g.setColor(Color.white);
g.fillRect(baseX, 430, 80, 10);

//ball
g.setColor(Color.green);
g.fillOval(ballX, ballY, 20, 20);


g.dispose();




}



@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
tim.start();
repaint();

}

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

if(e.getKeyCode()== KeyEvent.VK_RIGHT){

if(baseX >=420){

baseX=420;
}

else{

moveRight();
}

}

if(e.getKeyCode()== KeyEvent.VK_LEFT){

if(baseX <=0){

baseX=0;
}

else{

moveLeft();
}

}


}




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

}

@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub

}

public void moveRight(){

play=true;
baseX+=10;
}

public void moveLeft(){

play=true;
baseX-=10;
}
}

游戏中的图片:

Image from the game

最佳答案

由于缺乏线程安全性,您正在处理的是不可预测的 Swing 行为。根据文档,“创建 Swing 组件或与 Swing 组件交互的所有代码都必须在事件调度线程上运行”。要实现这一点,您应该像这样重写 GUI 创建:

public class Real_Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}

private static void createAndShowGUI() {
JFrame jf = new JFrame();
Real_Create panel = new Real_Create();
jf.setSize(500, 500);
jf.setVisible(true);
jf.setResizable(false);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.add(panel);
}
}

您可以阅读有关该主题的更多信息 here

关于java - 矩形不动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46103383/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com