为什么这个线程不工作?



我是一个开始的Java程序员。我正在尝试构建一个可以直接在控制台中玩的太空入侵游戏。后来,我想通过Jframe添加图形接口;但是,此时,我局限于创建一个非功能性的Jframe窗口。我将保存的类保存在几个文件中-Sonstants.java,Entity.java,Player.java和board.java,SpaceInvaders.java-我已经按照指定的顺序编译了这些文件。我的问题是,当我尝试运行主方法时,什么也不会显示。没有窗口弹出。控制台中没有显示输出。我怀疑问题在班级板上,也许在方法gameinit()或方法运行()中的线程构造中。我在课程教科书中找不到有关线程的任何信息 - 我从网站http://zetcode.com/tutorials/javagamestutorial/spaceinvaders/获得了线程代码,我将在项目的最终版本中引用它。

请让我知道您是否可以给我任何指示。对于我对stackoverflow.com的格式缺乏熟悉,我深表歉意。

我在下面包含了我的代码的副本。

常量。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() {
}

最新更新