我正在制作汽车游戏,我刚刚遇到屏幕大小的问题,它不允许汽车移动(它应该能够在所有屏幕上移动),也许jpanel的大小不是大小合适。
Main和JPanel:
public class MyCarGame extends JPanel implements Runnable {
CarPlayer Player;
public MyCarGame(GUI frame) {
Player = new CarPlayer(0, 0);
this.setSize(WidthFrame,HeightFrame);
this.addKeyListener(new KeyListener());
}
public void draw(Graphics g) {
Player.draw(g);
repaint();
}
/**
* @param args the command line arguments
*/
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.
draw(g);
}
@Override
public void run() {
while (true) {
Player.move();
try {
Thread.sleep(10);
} catch (InterruptedException ex) {
Logger.getLogger(MyCarGame.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
private class KeyListener extends KeyAdapter{
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_RIGHT:
Player.xVel = 3;
break;
case KeyEvent.VK_LEFT:
Player.xVel = -3;
break;
case KeyEvent.VK_UP:
Player.yVel = -3;
break;
case KeyEvent.VK_DOWN:
Player.yVel = 3;
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_LEFT:
Player.xVel = 0;
break;
case KeyEvent.VK_UP:
case KeyEvent.VK_DOWN:
Player.yVel = -1;
break;
}
}
}
public static int WidthFrame = 0;
public static int HeightFrame = 0;
public static void main(String[] args) {
// TODO code application logic here
new GUI().setVisible(true);
}
}
玩家类:
public class CarPlayer {
int x;
int y;
Image img;
public int xVel;
public int yVel;
public CarPlayer(int x,int y){
img= new ImageIcon("images/PlayerCar.png").getImage();
this.x=x;
this.y=y;
xVel=0;
yVel=-1;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public void move(){
if(x+xVel<(MyCarGame.WidthFrame-50) && x+xVel>0)
x+=xVel;
if(y+yVel<(MyCarGame.HeightFrame-100) && y+yVel>0)
y+=yVel;
if(x<0){
xVel=0;
}
if(y<0){
yVel=0;
}
if(y>(MyCarGame.HeightFrame-100)){
yVel=0;
}
if(x>(MyCarGame.WidthFrame-50)){
xVel=0;
}
}
public void draw(Graphics g){
g.drawImage(img, x, y,50,100, null);
}
}
框架类:
public class GUI extends javax.swing.JFrame {
/**
* Creates new form GUI
*/
MyCarGame g;
public GUI() {
this.setFocusable(false);
this.setResizable(false);
this.setExtendedState(JFrame.MAXIMIZED_BOTH);
MyCarGame.WidthFrame=this.getWidth();
MyCarGame.HeightFrame=this.getHeight();
g=new MyCarGame(this);
this.add(g);
g.setLocation(0, 0);
g.requestFocusInWindow();
Thread t= new Thread(g);
t.start();
}
}
答案 0 :(得分:1)
你依赖&#34;魔法&#34;价值,或试图......
public GUI() {
this.setFocusable(false);
this.setResizable(false);
this.setExtendedState(JFrame.MAXIMIZED_BOTH);
MyCarGame.WidthFrame = this.getWidth();
MyCarGame.HeightFrame = this.getHeight();
此时,相框尺寸仍为0x0
,因为在您尝试将其显示之前,相框并不真正知道它将在哪个屏幕上显示。
这些值也没有考虑框架边框可能具有的插图,并且它们在平台和外观之间发生变化(甚至可以在同一平台的不同实例之间进行更改)
简单的解决方案,摆脱它。 static
对此不是一个好的选择,更好的解决方案是更改move
方法,要求调用者传递可用空间的宽度和高度......
例如......
public void move(int width, int height) {
然后,当你需要调用它时,你可以使用类似......
的东西Player.move(getWidth(), getHeight());
避免使用KeyListener
,这只是麻烦,请考虑使用key bindings API。它可以更好地控制触发关键事件所需的焦点水平......
不要直接或间接地从任何绘制方法中调用repaint
,这只会继续引发绘制事件,最终会消耗你的CPU
在我的系统上,setResizable
没有与setExtendedState
很好地玩耍...你可能想要考虑摆脱setResizable
选项......
答案 1 :(得分:0)
首先,对于变量名称,一些建议使用小写字母。
其次,如果您已经在绘画,请不要在MyCarGame类上重绘draw()方法。你搬完车后应该问它。而你的游戏循环需要更多控制。 关于游戏循环,请使用以下链接:https://www.google.pt/#q=java+game+loop