2014-02-12 5 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

Пожалуйста, формат ваш код правильно – vokilam

+0

вам нужно удалить расширяет JFrame на вашем testMain класса – 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

Пожалуйста, объясните дальше, я попытался, что вы сказали, но получил немного запутался, как я бы это сказал, и он все еще не работает? Не могли бы вы рассказать об этом? –

+0

Что вы имеете в виду, когда говорите «это не работает»? Как выглядит ваш обновленный код? У вас должен быть один JPanel, который рисует себя, а не кучу разных JPanels друг на друга. –

+0

Я действительно спрашиваю, как я могу создать sinle JPanel, который рисует себя? Я застрял в этой проблеме в течение двух дней и, похоже, не понимаю, спасибо! –

0

Прежде всего, в своем основном классе вы расширяете JFrame, а затем создаете экземпляр, который также является избыточным. Вы должны сделать любой из двух, не обоих! Ex:

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

Во-вторых, отвечая на ваш вопрос, вы всегда должны иметь один класс, который делает все рисунок для вашей игры. Позволяет называть это Board класс. У вас могут быть другие классы, которые имеют функции для рисования, но эти функции должны быть вызваны в вашем классе Board в функции paintComponent(). Примечание: Кроме того, убедитесь, что сделать это -

void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    ...... 
    g.dispose(); 
} 
Смежные вопросы