我已经为此工作了大约四个小时。我已经掌握了所有逻辑,计时器工作,键盘和鼠标输入工作,但是没有调用paintComponent方法来绘制更新!我对这类实时应用程序没有经验,所以可能是导致它不起作用的原因。任何帮助将不胜感激!
游戏主.java:
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
public class gamemain extends JPanel {
public static boolean paused = true;
public static JFrame gui;
public static JPanel panel;
static int[][] worldsize = new int[1000][1000];
static world playspace = new world(worldsize);
static Timer timer = new Timer(250, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Debug: timer ticked");
playspace.updateWorldState();
panel.repaint();
}
});
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("Hit painter");
g.drawString("Test", 50, 50);
for(int i = 0; i < 999; i++) {
for(int j = 0; j < 999; i++) {
if(playspace.getWorldStateAt(i, j) == 1) {
g.drawRect(i, j, 1, 1);
}
}
}
}
public static class listener implements KeyListener {
@Override
public void keyTyped(KeyEvent e) {
if(e.getKeyChar() == ' ') {
if(paused) {
timer.start();
paused = false;
System.out.println("Unpaused");
}
else {
timer.stop();
paused = true;
System.out.println("Paused");
}
}
}
@Override
public void keyPressed(KeyEvent e) {
// unused
}
@Override
public void keyReleased(KeyEvent e) {
// unused
}
}
public static class mouselistener implements MouseListener {
@Override
public void mouseClicked(MouseEvent e) {
int x, y;
x = e.getX();
y = e.getY();
playspace.placeCell(x, y);
}
@Override
public void mousePressed(MouseEvent e) {
// unused
}
@Override
public void mouseReleased(MouseEvent e) {
// unused
}
@Override
public void mouseEntered(MouseEvent e) {
// unused
}
@Override
public void mouseExited(MouseEvent e) {
// unused
}
}
public static void main(String[] args) throws InterruptedException {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
gui = new JFrame();
gui.setTitle("Game of Life");
gui.setSize(1000, 1000);
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel = new JPanel();
panel.addKeyListener(new listener());
panel.addMouseListener(new mouselistener());
panel.setBackground(Color.WHITE);
panel.setOpaque(true);
Container pane = gui.getContentPane();
pane.add(panel);
gui.setVisible(true);
panel.requestFocus();
}
});
}
}
世界.java
public class world {
int[][] worldstate = new int[1000][1000];
public world(int[][] world) {
for(int i = 0; i < 1000; i++) { // make all cells dead
for(int j = 0; j < 1000; j++) {
world[i][j] = 0;
}
}
this.worldstate = world;
}
public int getWorldStateAt(int i, int j) {
return this.worldstate[i][j];
}
public void placeCell(int x, int y) {
this.worldstate[x][y] = 1;
}
public void updateWorldState() {
int n1,n2,n3,n4,n5,n6,n7,n8,total; // all possible buddies of a cell
for(int i = 1; i < 999; i++) { // go to each cell
for(int j = 1; j < 999; j++) {
n1 = this.worldstate[i-1][j];
n2 = this.worldstate[i][j-1];
n3 = this.worldstate[i-1][j-1];
n4 = this.worldstate[i+1][j];
n5 = this.worldstate[i][j+1];
n6 = this.worldstate[i+1][j+1];
n7 = this.worldstate[i+1][j-1];
n8 = this.worldstate[i-1][j+1];
total = n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8; // add them up
if(total < 2 && (this.worldstate[i][j] == 1)) { // rule 1
this.worldstate[i][j] = 0;
}
if(total > 3 && (this.worldstate[i][j] == 1)) { //rule 3
this.worldstate[i][j] = 0;
}
if((total == 3) && (this.worldstate[i][j] == 0)) { //rule 4
this.worldstate[i][j] = 1;
}
}
}
}
}
paintComponent
从未被调用过,因为gamemain
实际上从未添加到任何能够显示的内容中。
您的第一个任务是消除对static
的依赖
也许更像是...
public class gamemain extends JPanel {
public boolean paused = true;
int[][] worldsize = new int[1000][1000];
world playspace = new world(worldsize);
Timer timer = new Timer(250, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Debug: timer ticked");
playspace.updateWorldState();
repaint();
}
});
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("Hit painter");
g.drawString("Test", 50, 50);
for(int i = 0; i < 999; i++) {
for(int j = 0; j < 999; i++) {
if(playspace.getWorldStateAt(i, j) == 1) {
g.drawRect(i, j, 1, 1);
}
}
}
}
//...
public static void main(String[] args) throws InterruptedException {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame gui = new JFrame();
gui.setTitle("Game of Life");
gui.setSize(1000, 1000);
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gamemain panel = new gamemain();
panel.addKeyListener(new listener());
panel.addMouseListener(new mouselistener());
panel.setBackground(Color.WHITE);
panel.setOpaque(true);
Container pane = gui.getContentPane();
pane.add(panel);
gui.setVisible(true);
panel.requestFocus();
}
});
}
}
然后,我将专注于将更多信息传递给gamemain
类的能力,例如worldszie
和world
属性。
我还考虑在KeyListener
上使用键绑定 API,这将有助于解决与焦点相关的问题KeyListener
我还建议看看Java编程语言的代码约定 - 这将使其他人更容易阅读您的代码,并让您更容易阅读他们的代码