2017-02-23 126 views
0

我是一個開始Java程序員。我正在嘗試構建一個可以直接在控制檯中玩的太空侵略者遊戲。後來,我想通過JFrame添加一個圖形界面;然而,在這個時候,我限制自己創建一個非功能性的JFrame窗口。我將這些類保存在幾個文件中 - Constants.java,Entity.java,Player.java和Board.java,SpaceInvaders.java - 並且我已經按照指定的順序編譯了這些文件。我的問題是,當我嘗試運行主要方法時,沒有顯示任何內容。沒有窗口彈出。控制檯中不顯示任何輸出。我懷疑問題出在班級委員會,也許在方法gameInit()或方法run()中的線程構造中。我在課程教材中找不到關於主題的任何信息 - 我從網站http://zetcode.com/tutorials/javagamestutorial/spaceinvaders/獲得了線程代碼,我會在項目的最終版本中引用它。這個線程爲什麼不工作?

請讓我知道,如果你能給我任何指針。我對我不熟悉stackoverflow.com的格式表示歉意。

我在下面附上我的代碼的副本。

Constants.java

import java.io.*; 

public interface Constants { 
    public static final int MOTION_WIDTH = 20; 
    public static final int MOTION_LENGTH = 20; 
    public static final int DELAY = 17; 
} 

Entity.java

import java.io.*; 

public class Entity { 
    private int xPosition; 
    private int yPosition; 

    public void setXPosition(int newXPosition) { 
     this.xPosition = newXPosition; 
    } 

    public int getXPosition() { 
     return xPosition; 
    } 

    public void setYPosition(int newYPosition) { 
     this.yPosition = newYPosition; 
    } 

    public int getYPosition() { 
     return yPosition; 
    } 
} 

Player.java

import java.io.*; 

import java.awt.event.KeyEvent; 

public class Player extends Entity implements Constants{ 
    private final int START_X_POSITION = 0; 
    private final int START_Y_POSITION = 0; 
    int x = 0; 

    public Player() { 
     setXPosition(START_X_POSITION); 
     setYPosition(START_Y_POSITION); 
    } 

    public void move() { 
     setXPosition((getXPosition()) + x); 

     if ((getXPosition()) <= 0) { 
      setXPosition(0); 
     } 
     if ((getXPosition()) >= MOTION_WIDTH) { 
      setXPosition(MOTION_WIDTH); 
     } 
    } 
     public void keyPressed(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
      x = 1; 
     } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
      x = -1; 
     } 
     } 

    public void keyReleased(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
      x = 0; 
     } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
      x = 0; 
     } 
    } 
} 

Board.java

import java.io.*; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyAdapter; 

public class Board extends JPanel implements Runnable, Constants { 
    Player player; 
    boolean gameRunning = true; 
    Thread animator; 

    char[][] motion = new char[MOTION_WIDTH][MOTION_LENGTH]; 


    public Board() { 
     addKeyListener(new KeyListener()); 
     setFocusable(true);  
     gameInit(); 
     setDoubleBuffered(true); 
    } 

//Ensure that I cite this 
    public void addNotify() { 
     super.addNotify(); 
     gameInit(); 
    } 

    public void gameInit() { 

     player = new Player(); 

     for (int i = 0; i < MOTION_WIDTH; i++) { 
      for (int j = 0; j < MOTION_LENGTH; j++) { 
        motion[i][j] = '0'; 
      } 
     } 

     motion[0][0] = '^'; 


      if (animator == null) { 
        animator = new Thread(this); 
        animator.start(); 
      } 
    } 
    private class KeyListener extends KeyAdapter { 
     public void keyPressed(KeyEvent e) { 
      player.keyPressed(e); 
     } 
     public void keyReleased(KeyEvent e) { 
      player.keyReleased(e); 
     } 
    } 

    public void paint() { 

     for (int i = 0; i < MOTION_WIDTH; i++) { 
      for (int j = 0; j < MOTION_LENGTH; j++) { 
        motion[i][j] = '0'; 
      } 
     }  

     motion[player.getXPosition()][player.getYPosition()] = '^'; 

     for (int i = 0; i < MOTION_WIDTH; i++) { 
      for (int j = 0; j < MOTION_LENGTH; j++) { 
       System.out.print(motion[i][j]); 
      } 
      System.out.println(); 
     } 
    } 

    public void animationCycle() { 
     player.move(); 
     paint(); 
    } 
//Ensure that I cite this 
    public void run() { 
     long beforeTime, timeDiff, sleep; 

     beforeTime = System.currentTimeMillis(); 

     while (gameRunning) { 
      paint(); 
      animationCycle(); 

      timeDiff = System.currentTimeMillis() - beforeTime; 
      sleep = DELAY - timeDiff; 

      if (sleep < 0) 
       sleep = 2; 
      try { 
       Thread.sleep(sleep); 
      } catch (InterruptedException e) { 
       System.out.println("interrupted"); 
      } 
      beforeTime = System.currentTimeMillis(); 
     } 
    } 
} 

SpaceInvaders.java

import java.io.*; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.event.KeyListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyAdapter; 

public class SpaceInvaders extends JFrame implements Constants { 
    public void SpaceInvaders() { 
     add(new Board()); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(500, 500); 
     setVisible(true); 
     requestFocusInWindow(); 
    } 

    public static void main(String[] args) { 
      new SpaceInvaders(); 
    } 
} 
+1

'公共無效太空侵略者()'不是構造函數。嘗試從該行刪除'void'。 –

回答

0

在類SpaceInvaders您提供的構造函數是不是一個真正的構造函數。請刪除退貨類型void。因此,它應該讀

public SpaceInvaders() { 
    add(new Board()); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setSize(500, 500); 
    setVisible(true); 
    requestFocusInWindow(); 
} 

public static void main(String[] args) { 
     new SpaceInvaders(); 
} 

這裏是一個構造函數的信息從Java文檔:

一類包含被調用,以創建類藍圖對象構造函數。構造函數聲明看起來像方法聲明 - 除了它們使用類的名稱並且沒有返回類型。 (https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html

隨着修改施加JFrame中出現並且也有很多的0和a ^被印刷在控制檯上。

0

我在代碼中看不到線程啓動。我認爲你必須啓動線程爲例

class Board implements Runnable{ 
public void run(){ 
System.out.println("thread is running..."); 
} 

public static void main(String args[]){ 
Board b1=new Board(); 
Thread t1 =new Thread(b1); 
t1.start(); 
} 
} 

下方,也可構建不應該有返回類型

public void SpaceInvaders() { 
} 

變化

public SpaceInvaders() { 
} 
+0

線程是在'gameInit()'中啓動的。 –

+0

我的壞我還沒見過,謝謝你,Stefan Freitag – sai