我正在制作一款游戏,其目标是让一名骑士在世界各地移动并能够与其他骑士战斗。
我有一个启动游戏的 Main 类:
public class Main {
public static void main(String[] args) {
new Game();
}
}
创建 JFrame 的 Game 类:
import java.awt.GridLayout;
import javax.swing.JFrame;
public class Game {
public Game() {
JFrame frame = new JFrame();
frame.setTitle("Knights Tournament");
frame.add(new Board());
frame.setSize(700, 700);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
还有一个 Board 类(你猜对了!)创建 GameBoard:
public class Board extends JPanel {
Tile[][] grid = new Tile[15][15];
public Board(){
// Create the grid
CreateGrid();
// Add the player
grid[0][0] = new Player(0, 0);
}
// Method that creates a grid of tiles
private void CreateGrid() {
setLayout(new GridLayout (15, 15));
for(int i = 0; i < 15; i++){
for(int j = 0; j < 15; j++){
grid[i][j] = new Tile(i, j);
add(grid[i][j]);
}
}
}
}
网格初始由 15x15 block 组成。
public class Tile extends JButton implements ActionListener {
public int xCo;
public int yCo;
public Tile(int x, int y) {
setXCo(x);
setYCo(y);
}
public void setXCo(int x) {
this.xCo = x;
}
public void setYCo(int y) {
this.yCo = y;
}
public int getXCo() {
return xCo;
}
public int getYCo() {
return yCo;
}
}
我面临的问题如下:我想用另一个扩展图 block 的类 Player 替换 grid[0][0] 。磁贴和播放器之间的区别在于 Jbutton 会收到一条显示“P”的文本,我已经尝试过:
public class Player extends Tile{
public Player(int x, int y) {
super(x, y);
this.setText("P");
}
}
在类板的构造函数中,我尝试将 grid[0][0] 从图 block 更改为播放器,以便它显示 P,但由于某种原因它没有这样做(它确实更改了 grid[0 的类型) ][0]给玩家...)我希望有人能提供帮助。
最佳答案
您不应该尝试使用 UI 来维护对象的状态,本身。相反,UI 应该可视化游戏(或模型)的底层逻辑的状态。这允许您修改模型、更改规则、添加/删除元素(例如添加新怪物或战利品),而无需物理修改 UI 或它如何可视化此状态(在很大程度上)。
这个想法是,Player
属性应该用它自己的类来维护,该类由模型管理。然后,UI 将用于可视化模型的状态。
单击时,Tile
将通知“ Controller ”。 Controller 将从游戏“模型”请求状态信息,并根据此信息,“ Controller ”将更改按钮的状态以满足“模型”的要求
这仅需要“ Controller ”更新按钮信息(文本/图标),而不需要更改物理按钮。
这将职责划分为定义的层并减少了代码的耦合,因此一层或多层可以更改,但整体结构不会崩溃或需要大量修改才能处理这些更改。
该模型负责维护游戏的虚拟状态,管理各个游戏对象之间的交互(战斗等)。
UI 负责为用户提供模型的可视化, Controller 用于管理 take 之间的交互,获取用户输入并将其传递给模型,监视模型状态的变化并告知 UI当需要更新时。
模型- View - Controller 范例是跨语言的 GUI 开发中常用的方法。看看Model–view–controller了解更多详情。
关于java - JButton 子级不更新文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27515747/