2014-02-12 53 views
0

我正在做一个像飞机游戏一样的飞扬的小鸟,并且在一个类中我有移动的背景,然后我将它添加到主类中的jPanel中,在另一个类中我有玩家和我添加到主Jpanel。但是,当我将第二个类添加到JPanel时,首先添加的任何类都会消失。这里是我的背景类:从多个类中绘制图形?

 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; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import 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); 
} 


} 
+0

请格式的代码,你需要删除您testMain类 – vokilam

+0

,我想你说的,但有一点困惑我将如何把它,它仍然无法正常工作?你能否详细说明这个问题? – user2277872

回答

1

你应该有一个单独的JPanel,通过覆盖paintComponent()来绘制自己。 JPanel类应该有任何需要绘制的参考。从paintComponent()方法中,您只需遍历每个需要绘制的游戏对象并绘制它。更好的是,每个游戏对象都应该有一个绘制自己的drawMe(Graphics g)方法,并且您的paintComponent()方法可以将其Graphics实例传递给每个方法。

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

的扩展的JFrame请进一步解释正确 –

+0

当你说“它不工作”时,你是什么意思?你的更新代码是什么样的?您需要有一个自己绘制的JPanel,而不是一堆不同的JPanel。 –

+0

我真正要问的是,如何创建一个自己绘制的瑕疵JPanel?我被困在这个问题上两天了,似乎无法弄清楚,谢谢! –

0

首先在你的主类中扩展了JFrame,但是实例化它也是多余的。你应该做两个中的任何一个,而不是两个! 例如:

public class main extends JFrame{ 
    public main(){ 
     setSize(800,600); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     add(m); 
     add(q); 
     setVisible(true); 
    } 
} 

其次回答你的问题,你应该始终有一个类,做所有的绘制你的游戏。让我们称之为类。您可以让其他类具有绘制功能的类,但是应该在paintComponent()函数内的类中调用这些函数。 注:另外,还要确保做到这一点 -

void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    ...... 
    g.dispose(); 
}