2017-02-23 3 views
0

私は初心者のJavaプログラマです。私はコンソールで直接演奏できるSpace Invadersゲームを構築しようとしています。後で、私はJFrameを通してグラフィカルインターフェイスを追加したいと思います。ただし、現時点では、機能していないJFrameウィンドウを作成することに専念しています。いくつかのファイル(Constants.java、Entity.java、Player.java、Board.java、SpaceInvaders.java)にクラスを保存しておき、指定した順序でこれらのファイルをコンパイルしました。私の問題は、メインメソッドを実行しようとすると何も表示されないということです。ウィンドウが表示されません。コンソールに出力は表示されません。私はこの問題がクラスBoardにあると思われます。おそらく、メソッド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クラスSpaceInvaders

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

'ます。public voidスペースインベーダー()'への変更あなたが

例以下
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() { } 
を持って

を考えますコンストラクタではありません。その行から 'void 'を削除してみてください。 –

答えて

0

あなたが提供するコンストラクタは本当にコンストラクタではありません。返品タイプ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

コードのスレッド開始が表示されません。私は

public SpaceInvaders() { 
} 
+0

スレッドは 'gameInit()'で開始されています。 –

+0

私の悪い私はそれを見たことがない、ステファンFreitag – sai

関連する問題