Java 从多个类中绘制图形?
我正在做一个像飞鸟一样的飞机游戏,在一个类中我有移动的背景,然后我把它添加到主jPanel中,它在自己的类中,在另一个类中我有玩家,我把它添加到主jPanel中。但是,当我将第二个类添加到JPanel时,我添加的第一个类将消失。这是我的背景课:Java 从多个类中绘制图形?,java,graphics,drawing,screen,flappy-bird-clone,Java,Graphics,Drawing,Screen,Flappy Bird Clone,我正在做一个像飞鸟一样的飞机游戏,在一个类中我有移动的背景,然后我把它添加到主jPanel中,它在自己的类中,在另一个类中我有玩家,我把它添加到主jPanel中。但是,当我将第二个类添加到JPanel时,我添加的第一个类将消失。这是我的背景课: import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JPa
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.Timer;
public class map1 extends JPanel implements ActionListener{
Timer t = new Timer(5, this);
int rect1x = 1000, rect1y = 0;
int rect2x = 1250, rect2y = 0;
int rect3x = 1500, rect3y = 0;
int rect4x = 1750, rect4y = 0;
int rect5x = 2000, rect5y = 0;
int rect1dx = 1000, rect1dy = 300;
int rect2dx = 1250, rect2dy = 350;
int rect3dx = 1500, rect3dy = 400;
int rect4dx = 1750, rect4dy = 350;
int rect5dx = 2000, rect5dy = 300;
public map1(){t.start();}
public void rectset1(Graphics g){
g.drawRect(rect1x, rect1y, 50, 100);
g.drawRect(rect1dx, rect1dy, 50, 300);
}
public void rect2(Graphics g){
g.drawRect(rect2x, rect2y, 50, 150);
g.drawRect(rect2dx, rect2dy, 50, 300);
}
public void rect3(Graphics g){
g.drawRect(rect3x, rect3y, 50, 200);
g.drawRect(rect3dx, rect3dy, 50, 300);
}
public void rect4(Graphics g){
g.drawRect(rect4x, rect4y, 50, 150);
g.drawRect(rect4dx, rect4dy, 50, 300);
}
public void rect5(Graphics g){
g.drawRect(rect5x, rect5y, 50, 100);
g.drawRect(rect5dx, rect5dy, 50, 300);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
rectset1(g);
rect2(g);
rect3(g);
rect4(g);
rect5(g);
}
@Override
public void actionPerformed(ActionEvent e) {
repaint();
rect1x--;
rect2x --;
rect3x --;
rect4x --;
rect5x --;
rect1dx --;
rect2dx --;
rect3dx --;
rect4dx --;
rect5dx --;
}
}
这是我的飞机课:
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener
import javax.swing.JPanel;
import javax.swing.Timer;
public class player extends JPanel implements ActionListener, KeyListener {
int x = 200, y = 300;
Timer t = new Timer(5, this);
public void space(){
y+=20;
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawOval(x, y, 50, 50);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if(code == KeyEvent.VK_SPACE){space();}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void actionPerformed(ActionEvent e) {
repaint();
y--;
}
}
最后,我的主要观点是:
导入javax.swing.JFrame
@SuppressWarnings("serial")
public class testMain extends JFrame{
public testMain(){}
public static void main(String args[]){
map1 m = new map1();
player q = new player();
JFrame j = new JFrame();
j.setSize(800,600);
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
j.add(m);
j.add(q);
j.setVisible(true);
}
}
您应该有一个通过重写paintComponent()来绘制自身的JPanel。该JPanel类应该具有对需要绘制的任何内容的引用。从paintComponent()方法中,您只需迭代需要绘制的每个游戏对象并绘制它。更好的是,每个游戏对象都应该有一个drawMe(Graphics g)方法来绘制自己,而您的paintComponent()方法可以将其图形实例传递到这些方法中的每一个
public class GamePanel extends JPanel{
//example GameObjects, these could be in a list
GameObject bird = new Bird();
GameObject cloud = new Cloud();
public void paintComponent(Graphics g){
bird.drawMe(g);
cloud.drawMe(g);
}
}
首先在主类中扩展JFrame,然后实例化它,这是多余的。你应该两个都做,而不是两个都做! 例: 第二,回答你的问题,你应该总是有一个单一的类,为你的游戏做所有的绘图。让我们称之为Board类。可以使用其他类来绘制函数,但这些函数应该在paintComponent()函数中的Board类中调用。 注意:还要确保这样做-
void paintComponent(Graphics g){
super.paintComponent(g);
......
g.dispose();
}
请将代码正确格式化您需要删除testMain类上的extends JFrame请进一步解释,我尝试了您所说的内容,但对如何使用它感到有点困惑,但它仍然不起作用?你能详细说明一下这个问题吗?你说“它不起作用”是什么意思?更新后的代码是什么样子的?你需要一个单独的JPanel来绘制自己,而不是一堆不同的JPanel叠加在一起。我真正想问的是如何创建一个绘制自己的sinle JPanel?我已经在这个问题上纠缠了两天,似乎无法解决它,谢谢!
void paintComponent(Graphics g){
super.paintComponent(g);
......
g.dispose();
}