我在设计小游戏时遇到问题。我有不同的类,现在我想从另一个类(正在绘制游戏)中访问对象方法。现在,这就是我写的:
public class GameMain {
public GameMain() {
new GameFrame();
}
}
GameFrame类:
public class GameFrame extends JFrame {
public GameFrame() {
new GameLabel(this);
}
}
GameLabel类:
public class GameLabel extends JLabel {
private GameFrame gameFrame;
public GameLabel(GameFrame gameFrame) {
}
@Override
public void paintComponent(Graphics g) {
}
}
现在我有一个叫做Player的类。这个Player类具有一个称为paintPlayer()的方法。此方法以图形为参数在其上进行绘制。所以我想从我的GameLabel类中的paintComponent()方法中调用对象方法paintPlayer()。因此,我需要当前的Player对象,所以我要做的是: (我的GameMain类的旧版本)
public class GameMain {
private GameFrame frame;
private GameLabel label;
private Player player;
public GameMain() {
frame = new GameFrame(this);
label = new GameLabel(this, frame);
player = new Player(this);
}
public GameFrame getFrame() {
return frame;
}
public GameLabel getLabel() {
return label;
}
public Player getPlayer() {
return player;
}
}
我刚刚在我的GameMain类中创建了所有游戏对象,并为该对象生成了吸气剂。然后,我只给所有对象构造函数一个GameMain实例,这样我就可以从GameMain类的获取器中获取我需要的所有对象。这就是我在GameLabel类中所做的:
public class GameLabel extends JLabel {
private GameMain main;
public GameLabel(GameMain main) {
this.main = main;
}
@Override
public void paintComponent(Graphics g) {
main.getPlayer().paintPlayer(g);
}
}
一切正常,但是我被告知这是访问paintPlayer()方法的一种非常糟糕的方法。有人告诉我,我对模式中的每个类都给予了极大的关注,因为我可以访问具有GameMain类实例的每个类中的每个Object。但是我该怎么办呢?我的意思是在GameLabel类中绘制我的玩家我需要他的实例。
答案 0 :(得分:0)
这并不是我要怎么做-ECS之类的编程模式效率更高-但以一种面向对象的方式并接近您的原始意图,我将得到以下内容。
class Painter {
Graphics g;
public Painter(Graphics g) {
this.g = g;
}
public void paint(Paintable p) {
p.paint(g);
}
}
interface Paintable {
void paint(Graphics g);
}
class Player implements Paintable {
public void paint(Graphics g) {
// do your paint here
}
}
class GameLabel implements Paintable {
Player player;
public void paint(Graphics g) {
player.paint(g);
}
public void setPlayer(Player player) {
this.player = player;
}
}
class GameMain {
Painter painter;
Player player;
GameLabel label;
public GameMain() {
// set up your frame and Graphics, etc.
Graphics g = ...;
painter = new Painter(g);
player = new Player();
label = new GameLabel();
label.setPlayer(player);
}
public void doIt() {
painter.paint(label);
}
}