<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Problem mit Kollisionsbehandlung]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich arbeite zur Zeit an einer einfachen Physikengine und habe Probleme mit der Kollisionsbehandlung (nicht mit der Erkennung).<br />
Ich habe im moment ein paar rechtecke, eins davon kann ich mit den Pfeiltasten bewegen, alle anderen bleiben fest stehen im Raum.</p>
<p>Das ganze funktioniert vereinfacht so:<br />
Ich lasse die Zeit in kleinen Zeitabständen weiterlaufen (z.B. im 10ms takt, also 100 logik fps).<br />
Bei jedem dieser &quot;logikticks&quot; setze ich dann alle objekte um die aktuelle geschwindigkeit weiter und teste danach auf kollisionen zwischen dem rechteck das ich selbst steuere und allen anderen.<br />
Wenn kollisionen gefunden werden, dann bestimme ich durch eine selbstgeschriebene funktion (code schreib ich bei bedarf rein) die richtung, aus der das selbstgesteuerte objekte kommt und setze es dann neben das objekt mit dem es kollidiert ist.<br />
Wenn man sich also von rechts in ein anderes objekt reinbewegt, dann wird man etwas nach rechts gestzt, sodass man gerade nicht mehr in dem anderen objekt drin ist sondern direkt daneben.</p>
<p>Das ganze funktioniert auch ziemlich gut, aber manchmal kommt es zu bugs.<br />
Wenn ich zwei nicht steuerbare rechtecke direkt nebeneinander stelle und mich dann von unten genau an die übergangsstelle mit meinem rechteck hinbewege und dann diagonal lenke, sodass ich in beide rechtecle gleichzeitig reingehe, passiert es manchmal, dass das bewegbare rechteck &quot;stecken bleibt&quot;.<br />
Ich bin mir ziemlich sicher, dass das daran liegt, dass &quot;gleichzeitig&quot; mit 2 verschiedenen rechtecken kollidiert wird, sodass man erst nach rechts und dann nach unten gesetzt wird und dann wieder da landet, wo man vorher war.</p>
<p>Hier ist ein Bild, dass die Situation, die ich gerade beschrieben habe, zeigt:<br />
<a href="http://imageshack.us/photo/my-images/21/kollision2.png/" rel="nofollow">http://imageshack.us/photo/my-images/21/kollision2.png/</a><br />
Das Rechteck mit dem Pfeil ist das vom spieler steuerbare.<br />
Bild 1: Ich stehe an der &quot;kritischen Position&quot; und drücke jetzt gleichzeitig nach links und oben.<br />
Bilder 2-4 sind mit paint bearbeitet und nicht im wirklichen spiel aufgenommen, die sind nur dafür da um meine theorie zu veranschaulichen.<br />
Bild2:<br />
Jetzt wurde die bewegung ausgeführt, aber die kollision noch nicht behandelt.<br />
Mein rechteck überschneidet sich jetzt mit beiden anderen.<br />
Bild 3:<br />
Jetzt wurde die Kollision mit dem linken rechteck behandelt, mein rechteck wurde nach rechts gesetzt, hängt aber immer noch im rechten rechteck drin.<br />
Bild 4:<br />
Jetzt wurde die Kollision mit dem linken rechteck behandelt, mein rechteck<br />
ist nach unten gesetzt wurden und ist jetzt wieder da wo es am anfang ist.</p>
<p>Das ganze wiederholt sich jetzt immer wieder, so dass man einfach stecken bleibt.<br />
Soweit meine theorie ^^</p>
<p>Es ist extremst schwierig das zu reproduzieren, aber ich hab es schon ein paar mal geschafft.<br />
Hier habe ich die exe hochgeladen:<br />
<a href="http://www.megaupload.com/?d=56E6ZAEO" rel="nofollow">http://www.megaupload.com/?d=56E6ZAEO</a></p>
<p>Ich verwende übrigens SFML.</p>
<p>Hier mal ein bischen code, den ich zur Kollisionsbehandlung verwende:<br />
(Vorher wird die relative position durch eine andere funktion bestimmt, bei bedarf poste ich den code davon auch, aber ich lasse es erstmal weg, weil der post sonst zu lang werden würde)</p>
<pre><code class="language-cpp">switch(pos)
	{
		case RelativePosition::MeFromTop:
			myGameObjImpl-&gt;setPosition(sf::Vector2f(myRect.Left, 
				rect.Top - myRect.GetHeight()));
			myGameObjImpl-&gt;setSpeed(sf::Vector2f(speed.x, 0));
			break;
		case RelativePosition::MeFromBelow:
			myGameObjImpl-&gt;setPosition(sf::Vector2f(myRect.Left, 
				rect.Bottom));
			myGameObjImpl-&gt;setSpeed(sf::Vector2f(speed.x, 0));
			break;
		case RelativePosition::MeFromLeft:
			myGameObjImpl-&gt;setPosition(sf::Vector2f(rect.Left - 
				myRect.GetWidth(), myRect.Top));
			myGameObjImpl-&gt;setSpeed(sf::Vector2f(0, speed.y));
			break;
		case RelativePosition::MeFromRight:
			myGameObjImpl-&gt;setPosition(sf::Vector2f(rect.Right, myRect.Top));
			myGameObjImpl-&gt;setSpeed(sf::Vector2f(0, speed.y));
			break;
	}
</code></pre>
<p>Achja, fast vergessen: Die schrift links oben beim programm zeigt an, von welcher seite die zuletzt erkannte kollison ausgelöst wurde.</p>
<p>Ich bin für jeden Lösungsvorschlag dankbar!<br />
Falls ihr etwas von meinem code braucht um zu helfen, einfach melden, ich reiche dann entweder alles per upload oder das relevante per post nach.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/287356/problem-mit-kollisionsbehandlung</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 12:06:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/287356.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 26 May 2011 20:06:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Kollisionsbehandlung on Thu, 26 May 2011 20:06:04 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich arbeite zur Zeit an einer einfachen Physikengine und habe Probleme mit der Kollisionsbehandlung (nicht mit der Erkennung).<br />
Ich habe im moment ein paar rechtecke, eins davon kann ich mit den Pfeiltasten bewegen, alle anderen bleiben fest stehen im Raum.</p>
<p>Das ganze funktioniert vereinfacht so:<br />
Ich lasse die Zeit in kleinen Zeitabständen weiterlaufen (z.B. im 10ms takt, also 100 logik fps).<br />
Bei jedem dieser &quot;logikticks&quot; setze ich dann alle objekte um die aktuelle geschwindigkeit weiter und teste danach auf kollisionen zwischen dem rechteck das ich selbst steuere und allen anderen.<br />
Wenn kollisionen gefunden werden, dann bestimme ich durch eine selbstgeschriebene funktion (code schreib ich bei bedarf rein) die richtung, aus der das selbstgesteuerte objekte kommt und setze es dann neben das objekt mit dem es kollidiert ist.<br />
Wenn man sich also von rechts in ein anderes objekt reinbewegt, dann wird man etwas nach rechts gestzt, sodass man gerade nicht mehr in dem anderen objekt drin ist sondern direkt daneben.</p>
<p>Das ganze funktioniert auch ziemlich gut, aber manchmal kommt es zu bugs.<br />
Wenn ich zwei nicht steuerbare rechtecke direkt nebeneinander stelle und mich dann von unten genau an die übergangsstelle mit meinem rechteck hinbewege und dann diagonal lenke, sodass ich in beide rechtecle gleichzeitig reingehe, passiert es manchmal, dass das bewegbare rechteck &quot;stecken bleibt&quot;.<br />
Ich bin mir ziemlich sicher, dass das daran liegt, dass &quot;gleichzeitig&quot; mit 2 verschiedenen rechtecken kollidiert wird, sodass man erst nach rechts und dann nach unten gesetzt wird und dann wieder da landet, wo man vorher war.</p>
<p>Hier ist ein Bild, dass die Situation, die ich gerade beschrieben habe, zeigt:<br />
<a href="http://imageshack.us/photo/my-images/21/kollision2.png/" rel="nofollow">http://imageshack.us/photo/my-images/21/kollision2.png/</a><br />
Das Rechteck mit dem Pfeil ist das vom spieler steuerbare.<br />
Bild 1: Ich stehe an der &quot;kritischen Position&quot; und drücke jetzt gleichzeitig nach links und oben.<br />
Bilder 2-4 sind mit paint bearbeitet und nicht im wirklichen spiel aufgenommen, die sind nur dafür da um meine theorie zu veranschaulichen.<br />
Bild2:<br />
Jetzt wurde die bewegung ausgeführt, aber die kollision noch nicht behandelt.<br />
Mein rechteck überschneidet sich jetzt mit beiden anderen.<br />
Bild 3:<br />
Jetzt wurde die Kollision mit dem linken rechteck behandelt, mein rechteck wurde nach rechts gesetzt, hängt aber immer noch im rechten rechteck drin.<br />
Bild 4:<br />
Jetzt wurde die Kollision mit dem linken rechteck behandelt, mein rechteck<br />
ist nach unten gesetzt wurden und ist jetzt wieder da wo es am anfang ist.</p>
<p>Das ganze wiederholt sich jetzt immer wieder, so dass man einfach stecken bleibt.<br />
Soweit meine theorie ^^</p>
<p>Es ist extremst schwierig das zu reproduzieren, aber ich hab es schon ein paar mal geschafft.<br />
Hier habe ich die exe hochgeladen:<br />
<a href="http://www.megaupload.com/?d=56E6ZAEO" rel="nofollow">http://www.megaupload.com/?d=56E6ZAEO</a></p>
<p>Ich verwende übrigens SFML.</p>
<p>Hier mal ein bischen code, den ich zur Kollisionsbehandlung verwende:<br />
(Vorher wird die relative position durch eine andere funktion bestimmt, bei bedarf poste ich den code davon auch, aber ich lasse es erstmal weg, weil der post sonst zu lang werden würde)</p>
<pre><code class="language-cpp">switch(pos)
	{
		case RelativePosition::MeFromTop:
			myGameObjImpl-&gt;setPosition(sf::Vector2f(myRect.Left, 
				rect.Top - myRect.GetHeight()));
			myGameObjImpl-&gt;setSpeed(sf::Vector2f(speed.x, 0));
			break;
		case RelativePosition::MeFromBelow:
			myGameObjImpl-&gt;setPosition(sf::Vector2f(myRect.Left, 
				rect.Bottom));
			myGameObjImpl-&gt;setSpeed(sf::Vector2f(speed.x, 0));
			break;
		case RelativePosition::MeFromLeft:
			myGameObjImpl-&gt;setPosition(sf::Vector2f(rect.Left - 
				myRect.GetWidth(), myRect.Top));
			myGameObjImpl-&gt;setSpeed(sf::Vector2f(0, speed.y));
			break;
		case RelativePosition::MeFromRight:
			myGameObjImpl-&gt;setPosition(sf::Vector2f(rect.Right, myRect.Top));
			myGameObjImpl-&gt;setSpeed(sf::Vector2f(0, speed.y));
			break;
	}
</code></pre>
<p>Achja, fast vergessen: Die schrift links oben beim programm zeigt an, von welcher seite die zuletzt erkannte kollison ausgelöst wurde.</p>
<p>Ich bin für jeden Lösungsvorschlag dankbar!<br />
Falls ihr etwas von meinem code braucht um zu helfen, einfach melden, ich reiche dann entweder alles per upload oder das relevante per post nach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069403</guid><dc:creator><![CDATA[Gast1337]]></dc:creator><pubDate>Thu, 26 May 2011 20:06:04 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Kollisionsbehandlung on Thu, 26 May 2011 20:28:26 GMT]]></title><description><![CDATA[<p>Wenn du von zwei Seiten an die Rechtecke kollidierst, sind nachher die x- und y-Geschwindigkeiten 0, oder? Eventuell kannst du hier was machen. Hast du eigentlich nur achsenparallele Rechtecke oder auch rotierte?</p>
<p>Kollisionsbugs sind echt mühsam, ich hab schon ganze Nachmittage mit Feinabstimmen und Debuggen verbracht. Am besten richtest du dir eine Ausgabe ein, die dir alle relevanten Daten wie Positionen kontinuierlich mitteilt und die Aktionen deines Algorithmus genau protokolliert. Wenn der Bug auftritt, schaust du dir den Log an und solltest sehen, was nicht wie erwartet läuft.</p>
<p>Sonst hätte ich Tutorials für das Separate Axis Theorem auf Lager, <a href="http://www.metanetsoftware.com/technique.html" rel="nofollow">hier</a> ein Link von den Entwicklern des Jump'n'Runs N.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069419</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 26 May 2011 20:28:26 GMT</pubDate></item></channel></rss>