• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] Kollisionserkennung in Pong - Spiel?

herrsander

New member
Hallo,
Pong - Spiele gibt es ja wie Sand am Meer, aber ich kann die Kollisionsabfragen nicht auf mein Beispiel übertragen:

HTML:
<html>
<head>
<title>Tastatureingabe</title>
<meta charset="utf-8">  
</head>
<body>
<canvas id="canvas" width="512" height="256"></canvas>
<script src="https://code.jquery.com/jquery-2.1.0.js"></script>
<script>

var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var breite = canvas.width;
var hoehe = canvas.height;

var paddleheight = 255;
var paddlewidth = 20;


var rechteck = function(a, b) 
	{
	ctx.beginPath();
	ctx.rect(a, b, paddlewidth, paddleheight);
	ctx.fill();
	ctx.closePath();
	}

var kreis = function (x, y, radius) 
	{
	ctx.beginPath();
	ctx.arc(x, y, radius, 0, Math.PI * 2, false);
	ctx.fill();
	};

var paddle = function () 
	{
	this.a = canvas.width-15;
	this.b = (hoehe-paddleheight) / 2;
	this.aGeschwindigkeit = 0;
	this.bGeschwindigkeit = 0;
	};

var Ball = function () 
	{
	this.x = breite / 2;
	this.y = hoehe / 2;
	this.xGeschwindigkeit = 5;
	this.yGeschwindigkeit = 0;
	};

paddle.prototype.move = function () 
	{
	this.a += this.aGeschwindigkeit;
	this.b += this.bGeschwindigkeit;
	}

Ball.prototype.move = function () 
	{
	this.x += this.xGeschwindigkeit;
	this.y += this.yGeschwindigkeit;

	if (this.x < 0) 
		{
		this.xGeschwindigkeit = -this.xGeschwindigkeit;
		} 
	else if (this.y < 0) 
		{
		this.yGeschwindigkeit = -this.yGeschwindigkeit;
		} 
	else if (this.y > hoehe) 
		{
		this.yGeschwindigkeit = -this.yGeschwindigkeit;
		}
	
	};

paddle.prototype.draw = function () 
	{
	rechteck(this.a, this.b);
	};
	
Ball.prototype.draw = function () 
	{
	kreis(this.x, this.y, 10);
	};
	
paddle.prototype.setDirection = function (richtung) 
	{
	if (richtung === "hoch") 
		{
		this.aGeschwindigkeit = 0;
		this.bGeschwindigkeit = -5;
		} 
	else if (richtung === "runter") 
		{
		this.aGeschwindigkeit = 0;
		this.bGeschwindigkeit = 5;
		} 
	else if (richtung === "stopp") 
		{
		this.aGeschwindigkeit = 0;
		this.bGeschwindigkeit = 0;
		}
	};

var pad = new paddle();	
	
var ball = new Ball();

var keyActions = 
	{
	32: "stopp",
	38: "hoch",
	40: "runter"
	};
$("body").keydown(function (event) 
	{
	var richtung = keyActions[event.keyCode];
	pad.setDirection(richtung);
	});

setInterval(function () 
	{
	ctx.clearRect(0, 0, breite, hoehe);
	ball.draw();
	ball.move();
	pad.draw();
	pad.move();
	ctx.strokeRect(0, 0, breite, hoehe);
	ctx.fillRect(this.breite/2, 0, 2, this.hoehe);
	}, 30);

</script>
</body>
</html>

Ich wollte jetzt unter ball.prototype.move die Kollisionserkennung mit unterbringen:

HTML:
else if (this.y <= this.b + ((paddle.height/2)) && this.y >= (this.b - (paddle.height/2)) && this.x = this.a)
{
this.xGeschwindigkeit = -this.xGeschwindigkeit;
}

Jetzt habe ich gar kein Spielfeld mehr und eine Fehlermeldung in dr neuen Zeile(invalid assignment left-hand size)
Ich vermute einen Formfehler.
Kann mir bitte jemand mit der Kollisionserkennung auf die Sprünge helfen, damit ich dieses Projekt beenden kann?
Gruß
Ralf
 
= ist nicht das gleiche wie ===

Ok, jetzt habe ich meine function so geändert:
HTML:
Ball.prototype.move = function () 
	{
	this.x += this.xGeschwindigkeit;
	this.y += this.yGeschwindigkeit;

	if (this.x < 0) 
		{
		this.xGeschwindigkeit = -this.xGeschwindigkeit;
		} 
	else if (this.y < 0) 
		{
		this.yGeschwindigkeit = -this.yGeschwindigkeit;
		} 
	else if (this.y > hoehe) 
		{
		this.yGeschwindigkeit = -this.yGeschwindigkeit;
		}
	else if (this.y <= this.b + ((paddle.height/2)) && this.y >= (this.b - (paddle.height/2)) && this.x === this.a)
		{
		this.xGeschwindigkeit = -this.xGeschwindigkeit;
		}	
	};

Das Spielfeld ist wieder da, inklusive meines Riesenpaddles.
Leider prallt der Ball aber nicht ab sondern verlässt das Spielfeld durch das Paddle hindurch...
Wo ist denn da mein Denkfehler?
 
this.a und this.b existieren ja auch nicht auf den Ballobjekt, sondern auf dem Paddleobjekt.

Ich dachte, dies sind Variablen, die die jeweilige Position des Balles (this.x und this.y) bzw. des Schlägers (this.a und this.b) angeben.
Damit wollte ich dann abgleichen, ob Ball und Paddle den gleichen Raum einnehmen.
Wenn das so nicht funktioniert, wie muss ich das Problem denn dann angehen?
 
Du musst die Variable, die das Schlägerobjekt enthält (also pad) verwenden.

Ähm,
könntest du das bitte etwas ausführlicher erklären?
Ich habe this.a und this.b durch pad ersetzt, aber das bringt keinen Erfolg.
Muss ich noch neue Variablen für pad definieren?
Wenn ja, wie?
Ist mein Ansatz für die Kollisionserkennung überhaupt schon mal soweit in Ordnung?
Gruß
Ralf
 
Ich habe this.a und this.b durch pad ersetzt, aber das bringt keinen Erfolg.
this.a -> pad.a
this.b -> pad.b

Ist mein Ansatz für die Kollisionserkennung überhaupt schon mal soweit in Ordnung?
Der exakte Vergleich zwischen .x und .a wird dir Probleme bereiten. Da musst du etwas "Unschärfe" einbauen.

- - - Aktualisiert - - -

Wobei der Zugriff auf pad so eigentlich gar nicht gut ist, da dabei die OOP verletzt wird. Besser ist, du gibst dem Ball beim Erzeugen das Objekt mit... aber die Verletzung hast du schon bei der initialen Positionierung des Balles.
 
this.a -> pad.a
this.b -> pad.b

Ich bin dir für deine Hilfe dankbar, aber leider zu doof.
Könntest du mir bitte genau erklären, wie ich pad.a und pad.b definieren bzw. einsetzen muss?


Der exakte Vergleich zwischen .x und .a wird dir Probleme bereiten. Da musst du etwas "Unschärfe" einbauen.


Das wäre jetzt erstmal nicht so schlimm für mich. Hauptsache, das Spiel funktioniert soweit, um die Details kann ich mich ja dann in Ruhe kümmern. Ich will das Spiel jetzt eigentlich nur funktionieren sehen...
Gruß
Ralf
 
Zuletzt bearbeitet von einem Moderator:
Könntest du mir bitte genau erklären, wie ich pad.a und pad.b definieren bzw. einsetzen muss?
Definiert hast du es schon und einsetzen... k.A. was du genau da von mir wissen willst. Einfach austauschen...

Das wäre jetzt erstmal nicht so schlimm für mich. Hauptsache, das Spiel funktioniert soweit
Nein - ohne die Unschärfe wird das Spiel nicht funktionieren, da du nicht garantieren kannst, der Ball im Frame exakt auf dem Schläger landet und nicht etwas davor oder dahinter landet. Du musst eigentlich, bevor du den Ball zum nächsten Punkt bewegst, prüfen, ob der Weg dorthin den Schläger kreuzt und aus diesem Kreuzungspunkt dann die korrigierte Position berechnen und die Geschwindigkeit in x-Richtung umdrehen.

PS: Dein Schläger wird falsch im canvas angezeigt.
 
Definiert hast du es schon und einsetzen... k.A. was du genau da von mir wissen willst. Einfach austauschen...

Hallo und nochmals vielen Dank für deine Bemühungen.
Ich dachte, pad.a und pad.b müssen noch als Variable definiert werden. Ich schreibe also pad.a statt this.a und pad.b statt this.b

Um die Unschärfe wollte ich mich auch noch kümmern, aber der Ball müsste doch, zumindest wenn er wie am Anfang gerade auf den Schläger trifft, auch die gleichen Koordinaten haben, oder?

PS: Dein Schläger wird falsch im canvas angezeigt.
Den Schläger hab ich absichtlich erstmal so groß gemacht, damit er auf jeden Fall vom Ball getroffen wird, ohne das ich ihn bewegen muss.
 
Zurück
Oben