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/javase/tutorial/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