来自不同类别的绘画



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

一个主类,用

JFrame扩展,一个"游戏"类,用JPanel扩展。

现在,从这个主类中,我调用了一个类"玩家"和一个类"地图"。类"地图"存在两个子类"块"和"炸弹"。

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

我给每节课都讲了"公共空隙画(图形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);
    }
}

地图类:

    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);
    }
}

在要绘制的实体类(可以是地图播放器等)中,有一个接受Graphics对象的draw方法,从而允许它访问JPanelGraphics对象并绘制到它,如下所示:

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到垃圾上帝评论)
  • 应通过SwingUtilities.invokeLater(..)块在事件调度线程上创建和操作 Swing 组件。

更新:

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

相关内容

  • 没有找到相关文章

最新更新