tło na którym można rysować

0

Witam, chciałbym stworzyć w mojej aplikacji że tak powiem warstwy a konkretnie na pierwszym planie potrzebuję mieć obiekt który porusza się za pomocą klawiatury (ta część działa) a w tle mieć możliwość dynamicznego dodawania i przesuwania innych obiektów aby nie przysłaniały obiekty reagującego na klawiaturę.

tak tworze obiekt majacy być na pierwszym planie i dodaję go do JFrame:


  class Ship extends JComponent 
{
    public Ship(GameFrame t)
    {

            //img = ImageIO.read(new File("prom.png"));
            img = new ImageIcon(Ship.class.getResource("prom.png")).getImage();

    }
    public void paintComponent(Graphics g)
    {

        if(img == null)
        {
            return;
        }
        g.drawImage(img, 200, 650, null);

    }
    private Image img;
}

Gdy próbuję dodać kolejny komponent ten najpierw dodany zostaje przysłonięty. Próbowałem:


   setComponentZOrder(ship, 0);

ale wtedy nie dało to oczekiwanego efektu.Czy może mi ktoś podpowiedzieć jak stworzyć warstwowy układ w aplikacji wizualnej (w domyśle gry w której tło zmienia się dynamicznie)?

0

Polecam zajrzeć tutaj: http://download.oracle.com/ja[...]/2d/advanced/compositing.html .

Ten tutorial powinien Ci odpowiedzieć jak do tego podejść. Życzę miłej nauki.

0

Jeśli chodzi o obiekty typu Graphics2D to się zgodzę że tak da się zarządzać tym co jest z przodu a co z tyłu. Moja koncepcja jest natomiast taka:


 class Ship extends JComponent 
{
    public Ship(GameFrame t)
    {
        setSize(100,100);
        AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC);
        //ac = AlphaComposite.getInstance( AlphaComposite.SRC_OVER, 1);
        try
        {
            img = ImageIO.read(Ship.class.getResource("prom.png"));

        }
        catch(IOException e)
        {
            e.printStackTrace();
        }

    }
    public void paintComponent(Graphics g)
    {
        if(img == null)
        {
            return;
        }
        g.drawImage(img, 200, 650, null);   
    }

czyli mam klasę Ship dziedziczącą po JComponent w której wczytuję jakiś obrazek i rysuję na tym komponencie. Następnie położenie obiektu Ship jest sterowane za pomocą klawiatury poprzez np:


   s.setLocation(s.getX()-10, s.getY());
 //s to obiekt kalsy Ship

Tak więc chodzi mi o to czy da się jakoś nadać poziom położenia (tak zwany z-index) komponentom, gdyż jeśli dodam do JFrame obiekt Ship a nastepnie dodam kolejny obiekt który dziedziczy po JComponent to widoczny jest tylko ten dodany jako 2?

0

Najlepiej podeślij więcej kodu, być może gdzieś tkwi błąd...

0

public class StarWar {

        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {   
                public void run(){
                    GameFrame frame = new GameFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    //ustawienie koloru tła poparzez kontenet bo setBackground się nie da!
                    Color c = new Color(0,0,0);
                    Container con = frame.getContentPane();
                    //con.setBackground( c ); 
                    frame.setVisible(true);
                }
            });
        }

}
//głowne sterownia w tej ramce
class GameFrame extends JFrame
{
    public GameFrame()
    {

        setSize(width, height);
        setTitle("StarWar");
        //setResizable(false);
        //Sky sky = new Sky();
        //add(sky);

        Ship ship = new Ship(this);
        //ship.setLayout(mgr);
        add(ship);

        //setComponentZOrder(ship, 0);

        Klawiatura keyboard = new Klawiatura();
        addKeyListener(keyboard);
        ActionListener zad = new RuchRakiety(keyboard, ship);
        javax.swing.Timer timer = new javax.swing.Timer(25, zad);
        timer.start();

        //ActionListener stars = new Stars(this);
        //javax.swing.Timer timer2 = new javax.swing.Timer(1000, stars);
        //timer2.start();
        Star s = new Star(300, 300);
        add(s);

        //setComponentZOrder(ship, 1);

        //Thread t = new Thread(sky);
        //t.start();
        //System.out.println(keyboard.getRight());

    }

    private static final int width = 500;
    private static final int height = 800;
}
class Ship extends JComponent 
{
    public Ship(GameFrame t)
    {
        setSize(100,100);
        //AlphaComposite alpha =
        AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC);
        //ac = AlphaComposite.getInstance( AlphaComposite.SRC_OVER, 1);
        //Graphics2D l = (Graphics2D) this;
        //l.setComposite(ac);
        try
        {
            img = ImageIO.read(Ship.class.getResource("prom.png"));

            //img = new ImageIcon(Ship.class.getResource("prom.png")).getImage();

        }
        catch(IOException e)
        {
            e.printStackTrace();
        }

    }
    public void paintComponent(Graphics g)
    {

        if(img == null)
        {
            return;
        }
        g.drawImage(img, 200, 650, null);
        //g.drawImage(img, 250, 650, null);
    }
    private Image img;
}
/*
class Sky extends JComponent{

    public Sky()
    {

    }
    public void paintComponent(Graphics g)
        {

        }

    //private ArrayList<Star> starsTable = new ArrayList<Star>();
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0