2014-06-08 31 views
-1

我正在製作一款汽車遊戲,我剛剛遇到了屏幕大小問題,它不允許汽車移動(它應該能夠在所有屏幕上移動) ,也許jpanel的大小不是正確的大小。JFrame和JPanel大小在java中沒有變化

主要和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); 
} 

} 

Player類:

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

} 

} 

Frame類:

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

1)爲了更好地幫助越早,後期一個[MCVE](http://stackoverflow.com/help/mcve)(最小完整和可驗證示例)。 2)對代碼塊使用一致的邏輯縮進。代碼的縮進旨在幫助人們理解程序流程。 –

+0

使用Swing'Timer'進行動畫。 –

+0

'WidthFrame'和'HeightFrame'是'0'?你能指望什麼。不要爲此使用'static'字段,傳遞'Player'需要知道的信息,即組件的實際大小... – MadProgrammer

回答

1

你依靠「神奇」的價值觀,或者試圖...

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代替。它提供了更好地控制觸發關鍵事件所需的焦點級別...

不要直接或間接地從任何paint方法中調用repaint,這隻會繼續引發paint事件,這最終會消耗你的CPU

在我的系統,setResizable沒有很好地與setExtendedState玩......你可能要考慮擺脫setResizable選項...

+0

我現在工作了,謝謝。但我不明白,那麼我不應該使用repaint()?我將添加一些其他圖像也移動,是的,我會通過寬度和高度方法移動 – HkGDota

+0

您可以使用'repaint',但不是在'paint'方法的上下文中。 Swing使用被動渲染器引擎,這意味着可能由於任何數量的原因觸發繪畫,其中許多您無法控制。 – MadProgrammer

0

首先,有個小小的建議,爲變量的名稱,使用較低 - 字母。

其次,如果您已經繪畫,請勿重新繪製MyCarGame類的draw()方法。移動車後,你應該問這個問題。而你的遊戲循環需要更多的控制。 關於遊戲循環,使用此鏈接:https://www.google.pt/#q=java+game+loop

+0

所以你的意思是我應該使用重新運行的方法嗎? – HkGDota

+0

是的,我的意思是。 一個簡單的遊戲循環有:1st updateGame(),2nd renderGame()(或repaint()),3rd sleep()。 此鏈接顯示:http://www.java-gaming.org/index.php?topic=24220.0 – saclyr

+0

好吧謝謝。 – HkGDota