2015-05-04 73 views
0

我目前正在努力爲學校製作一款迷宮遊戲,而且我爲什麼會遇到這些錯誤感到困惑。這是涉及的代碼段。還需要導入的所有內容都已導入。首先是具有玩家位置的玩家類,然後是他們的圖像。嘗試使用KeyListeners和ImageIcons時出錯?

public class Player { 
int playerX; 
int playerY; 
int moveSpeed = 5; //I can edit move speed here 
Image character; 

//getters and setters to utilize the player's location and image 
public Player(){ //constructor for initial starting points 
    playerX = 50; 
    playerY = 50; 
    ImageIcon player = new ImageIcon("E://Workspace//Maze//images//Player.jpg"); 
    character = player.getImage(); 
} 

public void setPlayerX(int playerX){ 
    this.playerX = playerX; 
} 
public int getPlayerX(){ 
    return playerX; 
} 

public void setPlayerY(int playerY){ 
    this.playerY = playerY; 
} 
public int getPlayerY(){ 
    return playerY; 
} 

public void setMoveSpeed(int moveSpeed){ 
    this.moveSpeed = moveSpeed; 
} 
public int getMoveSpeed(){ 
    return moveSpeed; 
} 

public Image getPlayerImage(){ 
    return character; 
} 
} 

現在是創建的JPanel的佈局類,並且應該是什麼最終繪製選手圖像進入遊戲,也是什麼是應該讓玩家移動。

public class Layout extends JPanel implements ActionListener { //GUI with a  non null FlowLayout 
Player p = new Player(); 
Maze m = new Maze(); 

//500 x 500 seemed like a good size for the maze game 
int x = 500; 
int y = 500; 

public Layout(){ 
    setLayout(new FlowLayout()); 
    addKeyListener(new Move()); 
    setFocusable(true); 
} 

//for use in setting and getting the borders of the game 
public void setX(int x){ 
    this.x = x; 
} 
public int getX(){ 
    return x; 
} 

public void setY(int y){ 
    this.y = y; 
} 
public int getY(){ 
    return y; 
} 

public void paintGame(Graphics g){ 
    super.paint(g); 
    g.drawImage(p.getPlayerImage(), p.getPlayerX(), p.getPlayerY(), null); 
} 
@Overrride 
public void actionPerformed(ActionEvent ae){ 
    repaint(); 
} 
} 

class Move extends Layout implements KeyListener { //Inheritance 
public void keyPressed(KeyEvent press) { //for the movement in the game 
    //I used both keys so that if the player woukld like to use WASD or the arrow keys either will work 
    if(press.getKeyCode() == KeyEvent.VK_W || press.getKeyCode() == KeyEvent.VK_UP){ 
     //move up 
     p.setPlayerY(p.getPlayerY() - p.getMoveSpeed()); 
    } 
    else if(press.getKeyCode() == KeyEvent.VK_S || press.getKeyCode() == KeyEvent.VK_DOWN){ 
     //move down 
     p.setPlayerY(p.getPlayerY() + p.getMoveSpeed()); 
    } 
    else if(press.getKeyCode() == KeyEvent.VK_A || press.getKeyCode() == KeyEvent.VK_LEFT){ 
     //move left 
     p.setPlayerX(p.getPlayerX() - p.getMoveSpeed()); 
    } 
    else if(press.getKeyCode() == KeyEvent.VK_D || press.getKeyCode() == KeyEvent.VK_RIGHT){ 
     //move right 
     p.setPlayerX(p.getPlayerX() + p.getMoveSpeed()); 
    } 
} 


public void keyReleased(KeyEvent release) { 
    //nothing is needed here 
} 

public void keyTyped(KeyEvent e) { 
    //does nothing if a key is type (no need for it) 
} 
} 

最後是應該運行遊戲的遊戲類(目前我只是試圖讓玩家跨越一個空格移動,而不尚未實現地圖)。

public class Play { 
public static void main(String[]args) { 
    play(); 
} 

public static void play(){ 
    Layout l = new Layout(); 
    Player p = new Player(); 
    Maze m = new Maze(); 

    l.setSize(l.getX(), l.getY()); //size can be changed in layout 
    l.setVisible(true); 
} 
} 

由於某種原因,當我嘗試運行此操作時,出現大量錯誤。我希望很快得到解決,所以我可以開始實施我的迷宮地圖。下面是我收到的錯誤:

Exception in thread "main" java.lang.StackOverflowError 
at java.lang.ref.SoftReference.get(Unknown Source) 
at sun.misc.SoftCache$ValueCell.strip(Unknown Source) 
at sun.misc.SoftCache$ValueCell.access$300(Unknown Source) 
at sun.misc.SoftCache.get(Unknown Source) 
at sun.awt.SunToolkit.getImageFromHash(Unknown Source) 
at sun.awt.SunToolkit.getImage(Unknown Source) 
at javax.swing.ImageIcon.<init>(Unknown Source) 
at javax.swing.ImageIcon.<init>(Unknown Source) 
at mazeGame.Player.<init>(Player.java:16) 
at mazeGame.Layout.<init>(Layout.java:11) 
at mazeGame.Move.<init>(Layout.java:49) 
at mazeGame.Layout.<init>(Layout.java:20) 

的:at mazeGame.Move.<init>(Layout.java:49) at mazeGame.Layout.<init>(Layout.java:20)仍在繼續爲atleast 20行的Eclipse停止outputing錯誤之前。 請幫我解決這個問題,因爲我目前一直在關注如何讓玩家移動,並需要開始創建迷宮地圖。對不起,真的很長的帖子,但我想發佈任何可能會給我的錯誤。

回答

2

問題是你的構造函數中有無限遞歸。 Layout()調用addKeyListener(new Move());Move延伸Layout,所以Move的構造函數也調用Layout(),它又調用Move()

您需要重構代碼才能避免這種情況。一個簡單的方法將使移動不擴展布局,並將玩家作爲構造參數傳遞給Move

class Move implements KeyListener { 
    final Player p; 
    Move(Player p) { 
     this.p = p; 
    } 
    ... 
} 

Layout

addKeyListener(new Move(p)); 

還要考慮使用key bindings,而不是一個關鍵聽衆。這通常是一種更好的方法。

+0

現在它運行,它運行了幾秒鐘,然後終止。沒有Java屏幕顯示或任何東西,所以現在我無法真正玩遊戲,並測試人物的動作。 – user1234

+0

好,所以我把它改爲JFrame,但是現在我只是一個空白的屏幕沒有任何東西正在繪製... – user1234

+0

@ user1234我不能確定什麼是錯的,因爲我沒有相關的代碼 - 這個問題與「JFrames」無關。可見代碼不會從任何相關位置調用repaint()(這應該很可能在移動後完成),也可以通過'repaint()'正確繪製它自己,以覆蓋'paintComponent()'。有關詳細信息,請參見[自定義繪畫在擺動](https://docs.oracle.com/javase/tutorial/uiswing/painting/)。 – kiheru

0

嘗試更換線路:通過使用媒體跟蹤監視裝載

character = ImageIO.read(new File("E://Workspace//Maze//images//Player.jpg")); 

我認爲,問題可能是由ImageIcon的的異步加載的原因(圖像將被預裝:

ImageIcon player = new ImageIcon("E://Workspace//Maze//images//Player.jpg"); 
character = player.getImage(); 

與)http://docs.oracle.com/javase/7/docs/api/javax/swing/ImageIcon.html

+0

當我這樣做時,我得到一個錯誤,但是當我保留我的舊的它的工作。我不知道爲什麼(我得到了IOException錯誤)。 – user1234