Java Sehr komisches verhalten meines Rechtecks

SparkMonkay

Commander
Registriert
Feb. 2013
Beiträge
2.337
Moinsen,

ich bin grade aus Spass Breakout am programmieren und habe soweit mein Paddle fertig, und mit dem Teil bin ich soweit auch zufrieden und es klappt alles bis au eine Sache.

Wenn ich mein Paddle hin und her steuern will, dann wandert es ganz nach links und ist sogar etwas tiefer.
Ausgangszustand:
1.png

Zustand nachdem ich a oder s drücke:
2.png

Hier ist mein Code und entschuldigung für die nicht so besonders gut formatierten Codes :S

Code:
public class object 
{
	Draw a=new Draw();
	double x,y;
	public object(double x, double y)
	{
	this.x=x;
	this.y=y;
	}
}

class paddle extends object implements DrawListener
{
	private double x,y,h_width,h_height;

	public paddle(double x, double y, double h_width, double h_height)
	{
		super(x,y);
		a.addListener(this);
		this.h_height	=h_height;
		this.h_width	=h_width;

		a.clear(Draw.GRAY);
		a.filledRectangle(x,y,h_width,h_height);
	}


	public void keyTyped(char c)
    {
    	
    	if      (c=='a' && x>0) x=x-0.02;
    	else if (c=='s' && x<1) x=x+0.02;

    	a.clear(Draw.GRAY);
		a.filledRectangle(x,y,h_width,h_height);
	}


	public void mousePressed (double x, double y)	{ }
	public void mouseDragged (double x, double y)	{ }
	public void mouseReleased(double x, double y)	{ }

}

und hier ist meine Datei über die ich das starten lasse:
Code:
public class objectTest
{
	public static void main(String[]args)
	{
		
		double x		=0.5;
		double y		=0.05;
		double h_width	=0.05;
		double h_height =0.01;
		paddle a=new paddle(x,y,h_width, h_height);

	}
}

Ich verwende hierfür das DrawPackage,.welches sich im selben Ordner befindet, ebenso wie die DrawListener.

Wenn mir wer auch nur den Hinweis geben könnte wo mein Fehler liegt...


Danke :)
 
ohne den Code wirklich angeschaut zu haben: Werden die Koordinaten korrekt übergeben? Also nirgends x mit y vertauscht?
Es wäre außerdem hilfreich gewesen, gleich die programmiserpsrache zu nennen, dann muss man sich den Code nicht erst anschauen ;)
 
ja, das ist mir aufgefallen als ich in dem Subthread die anderen Threads gesehen habe und merkte das meiner aus der Reihe tanzt,


Bei den Koordinaten habe ich die ganze Zeit eine "Vorlage" die ich erstellt habe kopiert und eingefügt.
 
Ich stecke nicht all zu sehr in dieser Materie, aber evtl. noch so als Idee: In welchen Koordinaten arbeitet dieses Draw-Package? Skaliert das ggf. automatisch?
Jedenfalls scheint mir deine Kollisionsabfrage mit dem Bildschirm/-Spielfeldrand noch fehlerhaft, aber das ist erstmal zweitrangig.
 
Ok,
die Koordinaten sind halt bei x & y von 0 bis 1.

Zur Kollisionsabfrage: Die Koordinaten des Rechtecks (x,y) beziehen sich auf das Zentrum, hWidth und hHeight ist die hälfte der Kantenlänge, breite und höhe halbiert jeweils. D.h, wenn das Zentrum +/- die hälfte der Breite kleiner oder größer als 0 oder 1 ist dann geht es nicht mehr weiter,
 
Du definierst in "object" x und y. In der abgeleiteten Klasse definierst du diese erneut. Du initialisierst die x,y-Werte der Basisklasse korrekt über den "super()"-Aufruf, die Variablen in der abgeleiteten Klasse bleiben jedoch 0.

Das Zeichnen im Konstruktor der "paddle"-Klasse funktioniert korrekt, da du auf die übergebenen x,y-Werte im lokalen Scope zugreifst. Beim zweiten Zeichnen in dem Key-Handler greifst du auf die x,y-Werte der abgeleiteten Klasse zu, welche an der Stelle nicht initialisiert und damit 0 sind. Dadurch setzt du das Paddel auf die Position 0.2, 0.2 o.ä.

Setzte die beiden Variablen in der Basisklasse auf "protected" und nimm die Definition in der "paddel"-Klasse raus. Dann sollte es funktionieren.
 
Zuletzt bearbeitet:
Ok, danke dir, das hat mir die Augen geöffnet.

Fehler lag in Zeile 14.
habe x und y aus der Deklaration genommen.

funktioniert jetzt korrekt :)


EDIT;

Ich missbrauche den Thread eben nochmals :)

ich habe jetzt eine weitere Klasse erstellt, Box.
Ich will das die die in dem selben Fenster wie mein Panel gezeichnet werden.

Wie?
bei meinem Versuch habe ich mehrere Fenster bekommen.

Code:
public class object 
{
	Draw a=new Draw();
	double x,y;
	public object(double x, double y)
	{
	this.x=x;
	this.y=y;
	}
}

class paddle extends object implements DrawListener
{
	private double h_width,h_height;

	public paddle(double x, double y, double h_width, double h_height)
	{
		super(x,y);
		a.addListener(this);
		this.h_height	=h_height;
		this.h_width	=h_width;

		a.clear(Draw.GRAY);
		a.filledRectangle(x,y,h_width,h_height);
	}


	public void keyTyped(char c)
    {
    	
    	if 		(c=='a' && x>0) x=x-0.02;
    	else if (c=='d' && x<1) x=x+0.02;

    	a.clear(Draw.GRAY);
		a.filledRectangle(x,y,h_width,h_height);
	}


	public void mousePressed (double x, double y)	{ }
	public void mouseDragged (double x, double y)	{ }
	public void mouseReleased(double x, double y)	{ }

}

class box extends object
{

	double radi;

	public box(double x, double y, double radi)
	{
		super(x,y);
		this.radi=radi;	
		a.filledSquare(x,y,radi);	
	}
}

die Kollision werde ich extra für die Klasse Ball erstellen.
 
Zuletzt bearbeitet:
Du erstellst ja ein neues Draw, wahrscheinlich wird da auch ein neues Fenster instanziiert.

Ansonsten noch etwas. object ist etwa der schlechtest mögliche Name den man für eine Klasse wählen kann.

Denn: Klassen schreibt man bei Java gross und sobald du das machst, wirst du auch den zweiten Grund kennen lernen.
 
ja Stimmt da war was, habe irgendwo gehört das Klassen äquivalent zu Nomen sind, Methoden zu Verben ...
 
Hallo,

dein Ansatz ist etwas ungünstig, da, wie schon gesagt, in jedem Objekt eine eigene "Draw"-Instanz erstellt wird. Dein Ziel sollte es sein, alle Objekte auf die selbe Draw-Instanz zu zeichnen. Dafür könntest du z.B. folgenden Ansatz verfolgen:

1. Erstelle eine Klasse "GameWindow" oder "DrawingSurface" oder wie immer du sie auch nennen magst. In dieser Klasse zeichnest du alle geometrischen Objekte. In dieser Klasse erstellst du auch eine Draw"-Instanz (so, wie du sie im Moment in "Paddle" erstellst)
Des Weiteren enthält diese Klasse eine Liste mit "object" (nicht vergessen, die Namensgebung dafür ist noch suboptimal!)-Elementen:
Code:
ArrayList<object> drawableElements = new ArrayList<object>()

2. Nehme die Zeichenoperationen aus den "object"-Klassen raus. Lass dort nur die Koordinaten und Abmessungen. Erstelle für diese public Get-Methoden, damit das Zeichenfenster darauf zugreifen kann.

3. Füge in deiner Main-Methode die Geometrischen Objekte in die "object"-Liste der "GameWindow"-Klasse ein. Zum Zeichnen der Elemente kannst du nun in der "GameWindow"-Klasse in einer for-Schleife alle Elemente der Liste durchgehen und auf das "Draw"-Objekt die entsprechenden Zeichenoperationen durchführen.
 
Moin, danke für deine Idee, das klingt Sinnvoll.

D,h, meine Listener-Schnittstellen sollen auch in dem GameWindow implementiert werden und ich soll alles was mit Draw zutun hat aus GameObject nehmen?
Ich versuche es mal, einen Backup-Code habe ich ja hier :)
 
Wozu ist das extends Object gut ?
Von Object wird eh an alles untere vererbt, ist die Oberste Klasse in Java die immer da ist.
 
object hieß meine erste klasse, heißt mitlerweile anders, es sollte dazu dienen, dass wenn ich noch etwas hinzufügen will, dass ich es über diese zentrale klasse geschehen lasse.

Kollision will ich mit der hilfe von instance of und halt der gewöhnlichen Koordinaten erstellen, es soll ja ein anderes Verhalten des Balles da sein, wenn es auf einen Block trifft anstatt auf das Paddle.
 
Zurück
Oben