Swing Komponente wird überblendet

Sometimes

Mitglied
Hallo mal wieder.

Ich bin gerade dabei, ein Tower Defense zu erstellen, dabei ergab sich folgendes Problem:

Ich habe einen Hintergrund, und wenn ich dann die Mobs spawnen lasse, werden die vom Hintergrund überblendet.

Kann man also irgendwie die JLabel "auf eine höhere Ebene" setzen?
 
Es gibt eine LayeredPane, aber bei einem TD-Spiel würde ich lieber auf einem JPanel als Spielfeld selbst zeichnen.
Das mit den JLabel und ImageIcons is doch Murks.

Gruß Vanny
 
Aber geht es nicht noch anders?

Gibt es nicht einen Befehl für die Priorität, also was z.B. über allen anderen Komponenten ist oder was immer unter allen anderen?
 
Nein, den gibt es nicht.
Java ist ne Programmiersprache und kein Spielesteckbaukasten.
 
Zuletzt bearbeitet von einem Moderator:
Du kannst an den Komponenten die Reihenfolge über die Methode
Code:
setComponentZOrder()
verändern. Und ignorier bitte einfach den letzten Beitrag von vanny, normalerweise wird man hier im Forum nicht so unfreundlich behandelt.

PS: Beispielcode:
Java:
		JFrame window = new JFrame();
		JPanel p = new JPanel();
		p.setLayout(null);

		JButton b1 = new JButton("1");
		b1.setBounds(5, 5, 100, 200);

		JButton b2 = new JButton("2");
		b2.setBounds(50, 50, 100, 100);

		p.add(b1);
		p.add(b2);

		p.setComponentZOrder(b2, 0);

		window.add(p);
		window.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		window.setSize(300, 300);
		window.setVisible(true);
ohne den Aufruf von
Code:
p.setComponentZOrder(b2, 0);
würde der 2. Button hinter dem ersten angezeigt werden.
 
Zuletzt bearbeitet:
Mal abgesehen davon, dass mir die ZOrder noch nicht bekannt war, ist mein Kommentar nicht von bösartiger Natur(an welcher Stelle überhaupt???:L), sondern durchaus ernst gemeint.
Sollte die Intention des TO darin liegen mal eben ein TD zusammenzufrickeln, ist er bei Java falsch und kann sich das nochmal überlegen.

Aber hey, er kann es natürlich auch ignorieren und hat dann auch nicht mehr davon.

Gruß Vanny
 
Zuletzt bearbeitet von einem Moderator:
Vielen dank.

Aber vanny hat schon irgendwie recht, es gibt nicht jede Sache einen Befehl.

P.S.😡vanny:Ich bin neu mit der Spieleprogrammierung, ich möchte erstmal nur den Anfang lernen, später werde ich es effizienter angehen...
 
...Ich bin neu mit der Spieleprogrammierung, ich möchte erstmal nur den Anfang lernen, später werde ich es effizienter angehen...

Naja anhand dieses Threads kann man sich keinen Reim machen, auf welchem Stand du dich javatechnisch befindest.
Ich glaube aber, dass mir sogar Schandro zustimmen wird, wenn ich sage, ohne handfeste Basic-Kenntnisse und einige Erfahrung im Umgang mit GUIs wird´s schwierig irgendein Spiel zu schreiben(zumind. TD o.ä.).
 
Aber wie geht das mit den JPaneln, also was ist daran besser, wenn du sagst, man sollte es so machen...

Denn JPanel ist aus Container abgeleitet, also wie würdest du es angehen?

(Ich habe nur die objektorientierte Seite gemacht, so Spieleprogrammierung habe ich noch nie gemacht, tut mir Leid^^)
 
So, habe erstmal die ComponentZOrder genommen...(ist am Anfang erstmal einfacher)

Jetzt kommt bei mir ein neues Problem:
Ich möchte, dass wenn ich auf das Gebäude klicke, ein Icon und ein Gitternetz (so ähnlich wie ein Koordinatensystem) erscheint, leider möchte mein Gitternetz nicht mitarbeiten....

Hier mal der Code:

Java:
package ownComponents;

import java.awt.*;
import javax.swing.*;


public class Koordinatensystem
extends JPanel
{
	private int x;
	private int y;
	private int heigth;
	private int width;
	private int distance;
	
	public Koordinatensystem(int distance)
	{
		x = getX();
		y = getY();
		heigth = getWidth();
		width = getHeight();
		this.distance = distance;
	}
	
	protected void paintComponent(Graphics g)
	{
		System.out.println("hi");
		int i = x;
		int j = y;
		
		while(i + distance <= width) {
			g.drawLine(i, y, i, y + heigth);
			i += distance;
		}
		while(j + distance <= heigth) {
			g.drawLine(x, j, x + width, j);
			j += distance;
		}
	}
}


Und die Hauptklasse, natürlich nur ein Teilcode:

Java:
class Gebäudebau
	implements ActionListener
	{
		private Image icon;
		private int towernumber;
		
		public Gebäudebau(Image icon, int towernumber)
		{
			this.icon = icon;
			this.towernumber = towernumber;
		}
		
		public void actionPerformed(ActionEvent event)
		{
			Koordinatensystem ks = new Koordinatensystem(30);
			JLabel tower = new JLabel(new ImageIcon(icon));
			tower.setBounds((int) MouseInfo.getPointerInfo().getLocation().getX(), (int) MouseInfo.getPointerInfo().getLocation().getY(), 40, 40);
			ks.setBounds(0, 8, 1190, 785);
			con.add(ks);
			con.add(tower);
			con.setComponentZOrder(ks, 0);
			addMouseMotionListener(new moveBuilding(tower));
			addMouseListener(new buildBuilding(ks, towernumber, tower));
			repaint();
		}
	}
 
Java:
paintComponent(Graphics g){
super.paintComponent(g);
//... dann deine Zeichenaktionen
}

der super-Aufruf ist wichtig.
 
Java:
paintComponent(Graphics g){
super.paintComponent(g);
//... dann deine Zeichenaktionen
}

der super-Aufruf ist wichtig.

So, habe das eingefügt, leider funktioniert es immer noch nicht, aber es werden schon ein paar Komponenten überblendet...

Noch eine Frage:
Kann man auch das Koordinatensystem aus JComponent ableiten?
Wie würde sich der Code dabei ändern, damit der auch funktioniert?^^
 
das Koordinatensystem leitet bereits von JComponent ab. JPanel extended JComponent. Du kannst aber auch direkt von JComponent extenden, da ändert sich imho nichts. Probiers einfach mal aus anstatt in nem Forum zu fragen.
 
Nimm doch einfach ein Gridlayout...

Ich möchte jede Komponente einen Platz geben, also ist das nicht so günstig....

das Koordinatensystem leitet bereits von JComponent ab. JPanel extended JComponent. Du kannst aber auch direkt von JComponent extenden, da ändert sich imho nichts. Probiers einfach mal aus anstatt in nem Forum zu fragen.

Ohhhh, dass habe ich vergessen:autsch:
Aber ich habe es schon mit JComponent ausprobiert, das klappt noch schlechter als mit JPanel...

Die Frage ist nun, warum erscheint das Koordinatensystem nicht, obwohl eigentlich schon die Methode aufgerufen wird....
 
Tja, wer ohne Layoutmanager arbeiten will muss sich selber um jede Größen- und Positionsangabe sowie -änderung kümmern. Wenn man sich damit voll und ganz auskennt ist man meist fähig sich seinen eigenen Layoutmanager zu schreiben (zumindest wär das weniger Arbeit).
 
Also wäre es besser, die Layoutmanager zu schachteln?

Dann würde ich erstmal sagen, danke an euch beide, hätte aber noch die Frage:

Was sollte ich bei einem Tower Defense beachten, was habt ihr an Tipps für mich, also sowohl für das Tower Defense selbst als auch sowas, wie es bei der Grafik am besten geht? (usw...^^)
 
Was sollte ich bei einem Tower Defense beachten, was habt ihr an Tipps für mich, also sowohl für das Tower Defense selbst als auch sowas, wie es bei der Grafik am besten geht? (usw...^^)
Mach ne Warcraft 3 Custom Map.
 
Zitat:
Was sollte ich bei einem Tower Defense beachten, was habt ihr an Tipps für mich, also sowohl für das Tower Defense selbst als auch sowas, wie es bei der Grafik am besten geht? (usw...^^)

Mach ne Warcraft 3 Custom Map.

1.:Ich habe nach dem grafischen gefragt, also z.B. Tipps für den Layoutmanager und auf der spielerischen Seite, wie man es am geschicktesten macht...

2.:Ich habe nicht Warcraft 3...

3.:Ich habe schon mal ein Tower Defense gemacht in Starcraft 2 und weiß auch, was es ist, bei mir kommt aber die Frage nach Tipps auf, damit ich es möglichst geschickt mache, da es hier ziemlich viele Experten gibt und das mein erstes Spiel ist... 😉
 
So, ich habe mal wieder ein Problem, dieses Mal wird ein Bild nicht angezeigt, ich weiß nicht, warum...

(Ich bin noch kein Experte mit Panels und paint, also weiß ich noch nicht viel darüber...)

Java:
package Panel;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class StartPanel extends JPanel
{
	private Image temp;
	private boolean done = false;
	
	public StartPanel(JFrame Hauptfenster, JPanel graphics)
	{
		graphics.add(this);
		Hauptfenster.setBounds(500, 300, 350, 200);
		Hauptfenster.setVisible(true);
		doInitializations(graphics);
	}

	private void doInitializations(JPanel graphics)
	{
		temp = Toolkit.getDefaultToolkit().getImage("bin/resources/textures/menuitem/button01.jpeg");
		System.out.println("hii");
		done = true;
	}
	
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		if(done)
		{
                        //hier
			g.drawImage(temp, 120, 30, null);
			System.out.println("hi");
		}
		repaint();
	}
}

Java:
import javax.swing.JFrame;
import javax.swing.JPanel;

import Panel.StartPanel;

public class MainClass
{
	private static JFrame Hauptfenster;
	
	public static void main(String args[])
	{
		Hauptfenster = new JFrame("Time Tower Defense");
		JPanel graphics = new JPanel();
		Hauptfenster.getContentPane().add(graphics);
		StartPanel panel = new StartPanel(Hauptfenster, graphics);
		Hauptfenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}
 
So, weil ich durch mein Unternehmen nichts schaffen konnte, da ich nicht wirklich wusste, wie man so etwas angeht, habe ich mir dieses Tutorial angeguckt (hier).

Dabei wollte ich den Code komplett kopieren (da der Macher des Videos den Code nicht zum Download zur Verfügung stellt) und habe versucht, ihn erstmal 1:1 zu kopieren...

Nun tritt aber an der Stelle hier mit den Mobs ein Problem auf:


Java:
public void spawnMobs(int mobID)
	{
		for(y = 0; y < Screen.room.block.length; y++)
			if(Screen.room.block[y][0].groundID == Value.groundRoad)
			{
				setBounds(Screen.room.block[y][0].x, Screen.room.block[y][0].y, mobSize, mobSize);
				xC = 0;
				yC = y;
			}
		
		this.mobID = mobID;
		
		inGame = true;
	}

Das Problem ist, dass yC einen Wert von 52 annimmt und nicht den Wert von 1 oder 2 (weiß den gerade nicht so genau).

Woran könnte das liegen?


P.S.:Ich kopiere ihn komplett ab, weil 1. ich nicht so gut Englisch verstehe und 2. ihn danach sehr genau angucke, wie er das gemacht hat (analysieren) und dann gerne die Erkenntnisse in mein eigenes TD übernehmen würde...
 
Das sind ja gleich 4 Änderungen von globalen Variablen in einer Methode. Ein Codereviewerüberraschungsei...
Nein, ehrlich. Woher sollen wir wissen wie diese Methode funktionieren soll? Besonders wenn die so schlecht geschrieben ist, mit globalen Variablen kann man da gar nix rauslesen. Da muss man mühsam durch den ganzen Code wühlen.

Der Author von dem Tutorial schreibt:
The reason I don't follow the basic Java rules is because I'm trying to give beginners and people with no experience what so ever an easier time creating games. Hope it's too much of a problem for most people! 😀

Am besten wäre es wohl wenn du ihn direkt fragst. Und richte ihm schöne Grüße von mir und den Java Konventionen aus 🙂
 
Zuletzt bearbeitet:
Aber ich weiß nur nicht, warum dann yC 52 komischerweise ist...
Ich könnte es auch manuell definieren, aber so wäre es erstmal besser...
Wenn ich sie mir angucken würde, würde ich auch auf 1 kommen... -.-

Und der Grund, warum ich ihn nicht fragen kann, ist, weil ich mich nicht auf YouTube anmelden darf... 🙁

Ich habe das in der Hoffnung gepostet, dass jemand das Tutorial durchgearbeitet hat und auch hier angemeldet ist...
 

Zurück
Oben