Swing Alle Objekte anzeigen auch bei JPanel-Überlappung

Newcomer2

Aktives Mitglied
Hallo Comunity,

ich versuch mich derzeit mal an einem Spiel, das in die Richtung "Age of Empires" und dergleichen gehen soll. Bisher funktioniert es wunderbar, dass ich zumindest schonmal bei Klick auf ein Objekt (Gebäude) neue Objekte (Figuren) generieren und diese einzeln ansteuern und bewegen kann. Die Figuren füllen dabei kein volles JPanel bzw. Canvas aus (schon mit beidem versucht).

Jetzt das Problem:
Bewege ich eine Figur über eine andere hinweg, so kann es sein, dass die darunterliegende hinter den JPanel/Canvas der sich bewegenden Figur verschwindet. Wie kann ich es schaffen, dass mir auch beim Passieren anderer Objekte, jedes Objekt angezeigt wird?

Hoffe mir kann hier jemand weiterhelfen.
 

MrClave

Bekanntes Mitglied
Ich hoffe, ich habe das richtig verstanden, dass du jedes Objekt, das gezeichnet werden soll, in ein eigenes Panel packst?

Das wäre nämlich absolut falsch.
Wie ich bereits in einem anderen Thread gesagt habe:

Wenn du auf ein Blatt Papier zeichnest, zeichnest du alles auf dieses eine Blatt Papier.
Oder malst du eine Sonne auf ein extra Blatt, und klebst dieses Blatt dann auf den Hintergrund ???:L


Daher: Schau dir die Objekte Graphics und Graphics2D an.
Du kannst kein Spiel entwickeln, ohne diese zu kennen. :rtfm:
 

Newcomer2

Aktives Mitglied
Leider nicht richtig.

Ich habe ein JPanel auf das die Objekte gelegt und verschoben werden können. Wenn jedoch ein Objekt ein anderes passiert, dann wird eines von beiden nicht mehr abgebildet, sondern durch das Canvas-Feld des anderen Objektes überdeckt. Hab hier mal soon Test-Fenster hochgeladen.

Das blaue Kästchen soll im Prinzip das Gebäude sein und die dabei erzeugten halben Strichfiguren die Figuren ^^ die Canvas-Größen für die Figuren sind
Java:
return new Dimension(30,60);
 

Anhänge

  • Test.jar
    149,3 KB · Aufrufe: 7

Newcomer2

Aktives Mitglied
Hier mal der Ausschnitt aus der Hauptklasse des Programms.

Java:
@Override
	public void run() 
	{
		int[] x=new int[50+figures.size()],y=new int[50+figures.size()];
		while(th.isAlive())
		{
			for(int i=0;i<figures.size();i++)
			{
				if(figurX[i]+figures.get(i).getWidth()/2<mouseX[i]) figurX[i]++;
				if(figurX[i]+figures.get(i).getWidth()/2>mouseX[i]) figurX[i]--;
				if(figurY[i]+figures.get(i).getHeight()/2<mouseY[i]) figurY[i]++;
				if(figurY[i]+figures.get(i).getHeight()/2>mouseY[i]) figurY[i]--;
				if(figures.get(i).hasfocus==true)
				{
					System.out.println(figurX[i] +"  "+figurY[i]);
					System.out.println(mouseX[i] +"  "+mouseY[i]);
					figures.get(i).setLocation(figurX[i],figurY[i]);
				}	
				figures.get(i).setLocation(figurX[i],figurY[i]);
				panel.repaint();			
			}
			try {th.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}
		}
	}
}

Und hier die beiden Canvas-Klassen:
Java:
@SuppressWarnings("serial")
class Kaserne
extends Canvas 
{
	boolean hasfocus;
	int x=0,y=0;

	public Kaserne()
	{
		super();
		this.hasfocus=false;
		enableEvents(AWTEvent.FOCUS_EVENT_MASK);
	}
	
	public Dimension getPreferredSize() { return new Dimension(15,30); }
	public Dimension getMinimumSize()   { return new Dimension(10,20); }
	public Dimension getMaximumSize()   { return new Dimension(30,60); }
	
	public boolean isFocusTraversable() { return true; }
	
	protected void processFocusEvent(FocusEvent event)
	{
		if (event.getID() == FocusEvent.FOCUS_GAINED)
		{
			for(int i=0;i<Canvasverschieben.figures.size();i++)
			{
				Canvasverschieben.figures.get(i).hasfocus=false;
				Canvasverschieben.figures.get(i).repaint();
			}
			hasfocus = true;
			repaint();
		} else if (event.getID() == FocusEvent.FOCUS_LOST)
		{
			hasfocus = false;
			repaint();
		}
		super.processFocusEvent(event);
	}
	
	public void paint(Graphics g) { ObjektXY(g,x,y); }
	
	void ObjektXY(Graphics g,int x,int y)
	{
		g.setColor(Color.BLUE);
		g.fillRect(x, y, getWidth(), getHeight());
		if(hasfocus)
			g.setColor(Color.orange);
		else
			g.setColor(Color.black);
		g.fillOval(x+getWidth()/2-1, y+getHeight()/2-2, 4, 4);
	}
}

class Figur
extends Canvas 
{
	private Image dbImage;
	private Graphics dbGraphics;
	boolean hasfocus;
	int x,y;
	
	public Figur() { super(); }
	
	public Dimension getPreferredSize() { return new Dimension(30,60); }
	public boolean isFocusTraversable() { return true; }
	
	
	public void update(Graphics g)
	{
	   //Double-Buffer initialisieren
	    if (dbImage == null) {
	       dbImage = createImage(
	          this.getSize().width,
	          this.getSize().height
	       );
	       dbGraphics = dbImage.getGraphics();
	    }
	    //Hintergrund löschen
	    dbGraphics.setColor(getBackground());
	    dbGraphics.fillRect(0,0,this.getSize().width,this.getSize().height);
	    
	    //Vordergrund zeichnen
	    dbGraphics.setColor(getForeground());
	    paint(dbGraphics);
	    
	    //Offscreen anzeigen
	    g.drawImage(dbImage,0,0,this);
	}
	
	public void paint(Graphics g)
	{
		x=getWidth()/2;
		y=getHeight()/2;
		ObjektXY(g,x,y); 
	}
	
	void ObjektXY(Graphics g,int x,int y)
	{
		int r=getWidth()/3;
		int r1=getWidth()/5;
		g.setColor(Color.black);
		g.fillOval(x-r/2,y/5-r/2,r,r);
		if(hasfocus)
		{
			g.setColor(Color.yellow);
			g.fillOval(x-r1/2,y/5-r1/2+1,r1,r1);
		}
		g.setColor(Color.black);
		g.fillRect(x-1,y/5+r/2,2,y);
	}
}

Ich hoffe das hilft etwas :) und ihr könnt mir helfen :D
 

Bananabert

Bekanntes Mitglied
Du brauchst nicht jedes Objekt auf einem eigenen Canvas zeichnen und diese dann in deinem Fenster verschieben.

Tutorials
Schau dir dort mal "2D-Spieleprogrammierung (Autor: Quaxli)" an. Ist sehr schön gemacht.
Beinhaltet einmal den fertigen Code und eine PDF mit Anleitung.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
_user_q JavaFX Wie kann ich alle Objekte außer eins deaktivieren (das Gleiche mit BoxBlur)? AWT, Swing, JavaFX & SWT 11
S Java3D: Alle Objekte in BranchGroup löschen während Laufzeit AWT, Swing, JavaFX & SWT 3
_user_q Gibt es eine Möglichkeit, in Java alle möglichen Zeichen automatisch tippen zu lassen? AWT, Swing, JavaFX & SWT 13
Davee JavaFX JavaFX Jar ausführbar jedoch nicht alle Stages AWT, Swing, JavaFX & SWT 3
F JFrame zeigt nicht alle Elemente auf anhieb an AWT, Swing, JavaFX & SWT 4
B Swing JButton deaktivieren, wenn nicht alle JTextFields ausgefüllt sind. AWT, Swing, JavaFX & SWT 2
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
D JavaFX Alle Knöpfe auf die gleiche Größe AWT, Swing, JavaFX & SWT 14
M Gui-Form alle Labels anzeigen AWT, Swing, JavaFX & SWT 4
M Alle Schriftarten in JComboBox AWT, Swing, JavaFX & SWT 5
X Swing setContentPane verdeckt mir alle Buttons Labels etc... AWT, Swing, JavaFX & SWT 14
Bluedaishi JTable alle Zeilen löschen AWT, Swing, JavaFX & SWT 7
J CellEditorListener wird für ALLE Zellen ausgeführt AWT, Swing, JavaFX & SWT 2
T Alle Swing-Elemente anzeigen AWT, Swing, JavaFX & SWT 9
A JDialog (modal) blockiert alle Fenster! AWT, Swing, JavaFX & SWT 2
J Alle Komponenten eines JFrames durchlaufen AWT, Swing, JavaFX & SWT 2
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
C Swing JTattoo - Look and Feel für ALLE User AWT, Swing, JavaFX & SWT 5
T Swing Font für alle Komponenten ändern AWT, Swing, JavaFX & SWT 2
A Swing Alle Komponenten auf JFrame ermitteln AWT, Swing, JavaFX & SWT 4
O JFrame: Daten alle paar Sekunden aktualisieren AWT, Swing, JavaFX & SWT 3
X Alle Components eines JPanels Enablen AWT, Swing, JavaFX & SWT 7
AyKay SWT (alle) Listener bzw. ModifyEventListener entfernen AWT, Swing, JavaFX & SWT 2
D Funktion JList.getSelectedValues() gibt nicht alle values zurück AWT, Swing, JavaFX & SWT 2
E Swing TableCellRenderer für alle Splaten setzen?! AWT, Swing, JavaFX & SWT 3
V Alle offenen jDialoge schliessen AWT, Swing, JavaFX & SWT 3
M Alle Frame Methoden AWT, Swing, JavaFX & SWT 2
L 3D-Grafik Java3D - Alle SceneGraphObjects geordnet erhalten AWT, Swing, JavaFX & SWT 2
F Nicht alle Bilder werden angezeigt AWT, Swing, JavaFX & SWT 2
Iron Monkey Alle Anwendungen werden miniert AWT, Swing, JavaFX & SWT 2
D ALLE exceptions in Log fenster anzeigen AWT, Swing, JavaFX & SWT 17
C JTable: Alle selektierten Zellen abfangen AWT, Swing, JavaFX & SWT 13
J alle Ordner in einem Ordner anzeigen(Jlist) AWT, Swing, JavaFX & SWT 44
M Swing Dankeschön an alle AWT, Swing, JavaFX & SWT 8
kodela alle Buttons einer ToggleButtonGroup deselektieren AWT, Swing, JavaFX & SWT 2
Milady Annzeigen alle Daten aus der Tabelle AWT, Swing, JavaFX & SWT 6
B MDI Anwendung alle maximierten InternalFrames in Tabs AWT, Swing, JavaFX & SWT 3
J Swing Monospace-Schrift für alle Systeme AWT, Swing, JavaFX & SWT 3
M Swing Alle Elemente eines Panels? AWT, Swing, JavaFX & SWT 9
J Swing Eine(und zwar ein und die selbe) WindowListener Instanz für alle JFrames AWT, Swing, JavaFX & SWT 8
J Swing Alle JFrames AWT, Swing, JavaFX & SWT 18
aze JTextfield nur so breit dass alle zeichen sichtbar sind AWT, Swing, JavaFX & SWT 2
R Swing alle Frames nutzen das gleiche Model AWT, Swing, JavaFX & SWT 2
André Uhres Swing Alle Komponenten eines JPanel aktivieren/deaktivieren AWT, Swing, JavaFX & SWT 4
E Im Frame alle Componenten abrufen AWT, Swing, JavaFX & SWT 2
K Alle Events abfangen mit GlassPane AWT, Swing, JavaFX & SWT 7
T JTree - alle Nodes entfernen AWT, Swing, JavaFX & SWT 8
D JCheckBoxItem in Untermenüs alle gleichzeitig an- bzw. aus AWT, Swing, JavaFX & SWT 3
E Drag&Drop JTable; Renderer füllt alle Zellen AWT, Swing, JavaFX & SWT 10
G Alle Werte einer Spalte in JTable zusammenrechnen AWT, Swing, JavaFX & SWT 2
G Alle Komponenten eines JPanels durchlaufen AWT, Swing, JavaFX & SWT 11
T Alle Folgefenster sollen im Hauptfenster geöffnet werden AWT, Swing, JavaFX & SWT 3
P Alle Komponenten von JPanel in der Mitte entfernen AWT, Swing, JavaFX & SWT 2
G Eine Schiftart für alle Komponenten festlegen AWT, Swing, JavaFX & SWT 6
G WindowListener für alle Fenster AWT, Swing, JavaFX & SWT 4
H <Synth> Alle die sich auskennen Bitte hier rein schaue AWT, Swing, JavaFX & SWT 2
Paule alle Elemente eines SWT Trees AWT, Swing, JavaFX & SWT 8
H JFileChooser für alle Dateien und Directories unterhalb AWT, Swing, JavaFX & SWT 7
C Beim Schließen eines fensters, schließen sich alle AWT, Swing, JavaFX & SWT 5
G Nicht alle Komponenten werden angezeigt AWT, Swing, JavaFX & SWT 8
S Alle EventListener einer JComponent abfragen? AWT, Swing, JavaFX & SWT 3
0 JList alle 20 Sekunden aktualisieren? AWT, Swing, JavaFX & SWT 8
K Graphics-Objekt zeichnet nicht alle Bilder AWT, Swing, JavaFX & SWT 3
M Listener für alle inneren Elemente gültig machen? AWT, Swing, JavaFX & SWT 5
M JList zeigt nicht alle Elemente AWT, Swing, JavaFX & SWT 4
B Alle URLs aller offenen Browser. AWT, Swing, JavaFX & SWT 12
N Alle Pixel-Koordinaten von z.B. g.drawLine(.) speichern AWT, Swing, JavaFX & SWT 7
L Alle Inhalte in BorderLayout.CENTER löschen? AWT, Swing, JavaFX & SWT 2
N Alle Komponenten eines JPanel aktivieren/deaktivieren? AWT, Swing, JavaFX & SWT 5
J [SWT] alle Zellen in einem Tree einzeln selektieren AWT, Swing, JavaFX & SWT 2
T JTree alle nodes expanden AWT, Swing, JavaFX & SWT 4
M Hauptfenster und alle Kinder schließen? AWT, Swing, JavaFX & SWT 7
T Alle Kinder eines JTree bekommen AWT, Swing, JavaFX & SWT 11
G Double-Click f. alle Komps UNIX u. WIN verschieden ? AWT, Swing, JavaFX & SWT 5
P TableCellRender für ALLE Spalten AWT, Swing, JavaFX & SWT 10
G Alle Elemente eines JPanel herausfinden? AWT, Swing, JavaFX & SWT 3
Luma Alle Fenster verstecken und wieder sichtbar machen? AWT, Swing, JavaFX & SWT 6
D Alle Inhalte einer JTextArea in einem JScrollPane löschen AWT, Swing, JavaFX & SWT 2
P JTree: Alle Knoten geöffnet anzeigen AWT, Swing, JavaFX & SWT 2
P JTree: alle Elemente ausklappen AWT, Swing, JavaFX & SWT 3
bernd JTree: alle Laufwerke anzeigen AWT, Swing, JavaFX & SWT 3
B Alle jMenu und JMenuItem in einem Array AWT, Swing, JavaFX & SWT 4
R removeAll() beseitigt nicht alle Komponenten!? AWT, Swing, JavaFX & SWT 11
M JTabbedPane zeigt alle Panels übereinander an :( AWT, Swing, JavaFX & SWT 8
N Graphics Objekte scalen mit Veränderung des Bildschirms AWT, Swing, JavaFX & SWT 19
berserkerdq2 Skalieren sich javafx objekte automatisch auf die Bildschirmgröße AWT, Swing, JavaFX & SWT 6
Redeason Objekte in meiner GUI verschieben AWT, Swing, JavaFX & SWT 1
_user_q Objekte vom MainController in anderen Controller verwenden und andersherum (NullPointerException) AWT, Swing, JavaFX & SWT 14
ExceptionOfExpectation MouseListener-Objekte zu den Graphics-Objekten einfügen AWT, Swing, JavaFX & SWT 3
donnico2 Objekte in der GUI ausgeben mit Hilfe einer DAO AWT, Swing, JavaFX & SWT 1
B JavaFX Von welcher Klasse und zu welchem Zeitpunkt werden Event-Objekte erstellt? AWT, Swing, JavaFX & SWT 3
J Objekte von 2 GUIs zusammenfassen AWT, Swing, JavaFX & SWT 2
T Swing Objekte in Liste AWT, Swing, JavaFX & SWT 2
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
C JList: Bestimmte Objekte ausschließen AWT, Swing, JavaFX & SWT 1
MaxG. Swing Dynamisch grafische Objekte erzeugen AWT, Swing, JavaFX & SWT 12
Y Objekte grafisch darstellen ohne GMF - Composite auf Canvas? AWT, Swing, JavaFX & SWT 2
D Swing Swing Objekte sehen im Entwurf anders aus als beim Ausführen AWT, Swing, JavaFX & SWT 3
L Dynamischer Aufbau einer Tabelle über Objekte AWT, Swing, JavaFX & SWT 2
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben