这个线程为什么不工作?
我是一个开始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();
}
}
在类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 ^被印刷在控制台上。
我在代码中看不到线程启动。我认为你必须启动线程为例
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() {
}
线程是在'gameInit()'中启动的。 –
我的坏我还没见过,谢谢你,Stefan Freitag – sai
'公共无效太空侵略者()'不是构造函数。尝试从该行删除'void'。 –