gpt4 book ai didi

java - 来自不同类(class)的绘画

转载 作者:行者123 更新时间:2023-11-29 07:11:12 26 4
gpt4 key购买 nike

我正在尝试用 Java 制作游戏(学校项目)并且我有以下设置:

一个主类,用 JFrame 扩展,一个“游戏”类,用 JPanel 扩展。

现在从这个主类中,我调用类“Player”和类“Map”。“Map”类存在两个子类“Blocks”和“Bombs”。

但我想知道..如何让所有这些类的绘制方法绘制到同一个 JPanel(属于 Game 类)?

我给每个类(class)都提供了“public void paint(Graphics g)”方法并进行绘画。但是当我运行程序时,只有“游戏”类的绘画出现,而不是子类的绘画。

我该如何实现?

例如,我将代码简化为:

主类:

    BomberGame game = new BomberGame();
add(game);
setSize(400, 400);
setTitle("Bomber");
setDefaultCloseOperation(EXIT_ON_CLOSE);
this.show();

}

public static void main(String[] args) {
BomberB1 main = new BomberB1();
}
}

游戏类:

    package bomberb1;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


import java.util.ArrayList;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
public class BomberGame extends JPanel {
public BomberGame() {;
BomberMap map = new BomberMap(this);
}

public void paint(Graphics g) {
g.drawRect(10, 10, 10, 10);
g.setColor(Color.red);
g.fillRect(10, 10, 10, 10);
}
}

map 类:

    package bomberb1;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.*;
import javax.swing.SwingUtilities;
public class BomberMap{
BomberGame game;
public BomberMap(BomberGame game) {
this.game = game;
}
public void paint(Graphics g) {
g.drawRect(30, 30, 20, 20);
}
}

最佳答案

在要绘制的实体类(可以是 map 播放器等)中有一个 draw 方法,该方法接受一个 Graphics 对象,从而允许它访问 JPanel 的 Graphics 对象并向其绘制,类似于:

class GamePanel extends JPanel {

Entity e=new Entity;

@Override
protected paintComponent(Graphics g) {
super.paintComponent(g);

e.draw(g);//call draw method for entity and pass graphics object
}

}

class Entity {

//will draw whats necessary to Graphics object
public void draw(Graphics g) {
//draw to the graphics object here
}
}

其他建议:

  • 不要不必要地扩展JFrame
  • 覆盖JPanel paintComponent() 而不是paint()(+1 to trashGod 评论)
  • 应在 Event Dispatch Thread 上创建和操作 Swing 组件通过 SwingUtilities.invokeLater(..) block 。

更新:

正如@GuillaumePolet 所说,更好的游戏设计是将JPanel 实现为大多数游戏实体的父类,请参阅this更多类似的答案。

关于java - 来自不同类(class)的绘画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13805172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com