Kaj*_*Kaj 1 java graphics swing
我正在尝试用Java(学校项目)制作游戏,我有以下设置:
一个主要的类,用JFrame扩展,一个'Game'类,用JPanel扩展.
现在从这个主类中,我调用了一个类'Player'和一个类'Map'.类'Map'存在两个子类'Blocks'和'Bombs'.
但我想知道..我如何让所有这些类的绘制方法绘制到相同的JPanel(类Game)?
我给每个类的方法'public void paint(Graphics g)'并做了绘画..但是当我运行程序时,只有"Game"类的绘画出现,而不是来自子类的绘画.
我该如何实现?
例如,我将代码缩减为:
主要课程:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
游戏类:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
地图类:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
在要绘制的Entity类(可能是Map player等)中有一个draw
方法接受一个Graphics
对象,从而允许它访问Graphics
对象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
}
}
Run Code Online (Sandbox Code Playgroud)
其他建议:
JFrame
不必要地扩展课程JPanel
paintComponent()
而不是paint()
(+1到trashGod评论)SwingUtilities.invokeLater(..)
.更新:
正如@GuillaumePolet所说,一个更好的游戏设计将实现JPanel
s作为大多数游戏实体的父类,看到这个类似的答案更多.
归档时间: |
|
查看次数: |
5156 次 |
最近记录: |