Java mehrere Bilder übereinander

bcmIT

Cadet 4th Year
Registriert
Sep. 2012
Beiträge
111
Hallo Zusammen

Ich bin gerade am Java lernen. Dabei versuche ich ein Art Moorhuhn zu machen.
Bei welchem mann ein Hintergrundsbild hat und Enten auf welche man scheissen kann.
Nun habe ich ein Problem:

Ich hab eine Ente welche sich von links nach rechts Bewegt. Und ein Hintergrund bild.
Einzeln kann ich sie Problemloss starten. Sobald ich aber beide gleichzeitig starte sehe ich die Ente nicht mehr...

Was kann nich dagegen Tun?

Aufbau des Fensters:
Code:
package view;

import java.awt.Cursor;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.Timer;

import controller.MyActionListener;
import controller.MyMouseListener;
import controller.MyTimerController;

public class Startframe extends JFrame implements ActionListener{

	BufferedImage hintergrund;
	BufferedImage ente;
	BufferedImage fadenkreuzly;
	public JTextField text = new JTextField("");
	
	public Background bg;
	public Duck du;
	public Timer timer;
	
	public double ypos=800;
	public double xpos= 80;

	public Startframe(String title) {
		super(title);


		//Vollbildmodus
		setSize(1920, 1030);
		MyActionListener ml = new MyActionListener();
		MyMouseListener mousl = new MyMouseListener(null,xpos,ypos);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.addMouseListener(mousl);

		try {
			hintergrund = ImageIO.read(new File("background.png"));
			ente = ImageIO.read(new File("ente.png"));
			fadenkreuzly = ImageIO.read(new File("fadenkreuz.png"));
			


			
		} catch (IOException e) {
			e.printStackTrace();}
		
		//Coursor auf Fadenkreuz geändert
		Cursor c = getToolkit().createCustomCursor(
				  new ImageIcon( "fadenkreuz.png" ).getImage(),
				  new Point(30,30), "Cursor" );
				setCursor( c );

		
		
		// Mein Grafiken erstellen 
		bg = new Background(hintergrund);
		//bg.setFocusable(true);
		
		du = new Duck(xpos, xpos, ente);
		du.setFocusable(true);
		
		// Entweder ist Background oder Ente nur sichtbar.,....

		this.getContentPane().add(du);

	
			timer = new Timer(20, new MyTimerController(this));
			timer.setDelay(10);

			setVisible(true);
			timer.start();}

	


	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		
	}


	
}




Klasse Background
Code:
package view;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;



	public class Background extends JPanel {
		BufferedImage hintergrund;


		public Background(BufferedImage im) {
			super();
			this.hintergrund = im;
		}

		
		public void paintComponent(Graphics g){

			super.paintComponent(g);
			Graphics2D g2d = (Graphics2D) g;
			g2d.drawImage(hintergrund, 0,0, this.getWidth(), this.getHeight(), this);
			
		}

	}



Klasse Duck
Code:
package view;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;


	public class Duck extends JPanel {
		
		BufferedImage ente;
		public double ypos=0;
		public double xpos=0;
		public int xgr=0;
		public int ygr=0;
		
		public Duck(double xpos, double ypos, BufferedImage ente) {
			super();
			this.ente = ente;
			this.xpos = xpos;
			this.ypos = ypos;
			
		}
		public void paintComponent(Graphics g){
			super.paintComponent(g);
			Graphics2D g2d = (Graphics2D) g;
			g2d.drawImage(ente, (int)xpos, (int) ypos, 500, 300, this);
			
		}
		

			
			
		}
 
Zuletzt bearbeitet:
Packe deinen Quellcode bitte in die entsprechenden code Tags. Dann wird er farblich hervorgehoben und die Formatierung bleibt auch erhalten. [ CODE ] und [ /CODE ] (ohne die Leerzeichen)
 
bcmIT schrieb:
...und Enten auf welche man scheissen kann.
Ohne Schieß? :evillol:

Ohne deinen Code großartig gelesen zu haben (bitte die erwähnten CODE-Tags benutzen und nochmal schön eingerückt hier darstellen), könntest du mal probieren deinen JPanels zu sagen, dass sie nicht opaque sein sollen, d.h. setOpaque(false) direkt im Konstruktor.

Abgesehen davon würde ich bei sowas nie anfangen lange mit den Swing-Komponenten zu frickeln, sondern ein einziges Panel haben und darin die ganze Zeichenlogik selbst implementieren. Deine Enten usw. sind dann keine JPanels mehr sondern eigene Objekte die einfach ein BufferedImage haben, dass sich per getter abrufen lässt. In deinem darstellenden Panel iterierst du dann nur noch über alle zu zeichnenden Objekte drüber, fragst sie nach ihrem Bild und ihrer Position und zeichnest sie auf eben dieses Panel. Das nur mal als Ansatz.
 
Zurück
Oben