来自不同类的油漆

时间:2012-12-10 16:38:38

标签: java swing graphics

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

使用JFrame扩展的主类,一个'Game'类,使用JPanel扩展。

现在从这个主要类中,我调用了一个类'Player'和一个类'Map'。类'Map'存在两个子类'Blocks'和'Bombs'。

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

我给每个类的方法'public void paint(Graphics g)'并且做了绘画..但是当我运行程序时,只有“Game”类的绘画出现,而不是来自子类的绘画。 / p>

我该如何实现?

例如,我将代码缩减为:

主要课程:

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

1 个答案:

答案 0 :(得分:6)

在要绘制的Entity类(可能是Map player等)中,有一个draw方法接受Graphics对象,从而允许它访问Graphics对象{ {1}}并绘制它,例如:

JPanel

其他建议:

  • 不要不必要地延长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()(+1来垃圾条评论)
  • 应通过paint()块在Event Dispatch Thread上创建和操作Swing组件。

<强>更新

正如@GuillaumePolet所说,一个更好的游戏设计将实现SwingUtilities.invokeLater(..) s作为大多数游戏实体的父类,请参阅this类似的答案。