Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

07.12.2008, 17:20

[Schon-Wieder] Problem mit Kollisionsabfrage

So, ich hab schon wieder ein Problem mit der Kollisionsabfrage - das mit der Abfrage wann eine Kollision auftritt läuft ja schon lange ^^, aber hier gibts schon wieder ein neues Problem:

Wenn mein Schiff jetzt kollidiert, wird die Geschwindigkeit zurückgesetzt auf 0.

Nehmen wir ein Beispiel: Ich fahre auf ein Sprite zu:

1. Noch 10 Pixel abstand, keine Kollision, kein Problem, Schiff wird 30 Pixel weiter bewegt

2. Das Schiff ist 20 Pixel innerhalb des Sprites, Kollision aufgetreten, Schiff wird auf Geschwindigkeit 0 gesetzt

3. Ich will wieder mein Schiff beschleunigen, aber das geht ja nicht weil ich andauernd kollidiere und somit mich nie mehr bewegen kann

Ok, also hab ich mir gedacht, dass ich einfach nur einmal das Schiff auf Geschwindigkeit 0 setze, aber dann kann man einfach durch alles durchfahren:

1. Kollision aufgetreten, Schiff ist 20 Pixel innerhalb des Sprites, Geschwindigkeit auf 0 gesetzt

2. Beschleunigt, fahre einfach weiter durch das Sprite durch

So, und nun bin ich mit meinem Latein am Ende ^^, wie kann ich das Schiff einmal auf 0 setzen und dann wieder in die andere Richtung weiter fahren lassen, falls es in diese Richtung keine Kollision mehr im Weg ist?
Sicherlich gibts irgendwie eine billige Lösung aber mir fällt nichts ein :cry:
Dieser Post wurde aus artgerecht gehaltenen, 100% chlorfrei gebleichten, handelsüblichen Elektronen aus Freihaltung erzeugt.

Anonymous

unregistriert

2

07.12.2008, 17:27

Ähm...wie wärs, wenn man sich noch nach rechts und links drehen kann, währenddessen du die Geschwindigkeit für die Vorwärtsbewegung normierst? Dann könntest du dich immer noch bewegen, obwohl du kollididert bist?

3

07.12.2008, 17:36

Zitat von »"Coders-Square"«

Ähm...wie wärs, wenn man sich noch nach rechts und links drehen kann, währenddessen du die Geschwindigkeit für die Vorwärtsbewegung normierst? Dann könntest du dich immer noch bewegen, obwohl du kollididert bist?

aber nicht, wenn er IM Sprite ist, also kollidiert, egal wohin er sich bewegen will.
Eine möglichkeit wäre, zu verhindern, das das Schiff überhaupt erst soweit ins sprite reinkommt, also in deinem Fall auch nur die 10px weiterbewegt wird, bis es gegen den sprite stößt.

4

07.12.2008, 18:02

Bau doch einfach ein Timer ein, dass 100MS oder so nach der Kollission wieder beschleunigt werden kann und wenn man dann wieder gegen die Wand fliegt, zählt es wieder die 100MS... (natürlich darf es bei Kollission dann nicht steckenbleben, sondern es sollte dann ein wenig abprallen, dann würds funktionieren.

5

07.12.2008, 19:45

Im Zweifelsfalle ist eigentlich immer logischere Lösung die bessere. Also, wie schon erwähnt, nur die 10 Pixel, bis an das Schiff ran fliegen, nicht die ganzen 30. Deshalb find ich auch die Idee mit dem Timer sehr komisch, eben weil es eher ein Hack ist, ohne wirklichen logischen Hintergrund.
Abprallen ist an sich auch eine gute Idee, musst halt nur sehen, wie stark. Aber auf jeden Fall solltest du zusehen, dass ein Objekt, sich niemals in einem anderen befinden kann. Du musst ja nicht unbedingt die 10 Pixel noch fliegen, bei angemessen hoher Framerate wird die Distanz wohl so so klein sein, dass man es schon gar nicht merkt, wenn die Geschwindigkeit auf 0 gesetzt wird, wenn es im nächsten Schritt Kollision geben würde. Wenn das Objekt dann noch leicht nach hinten treibt, also abprallt, sollte man es gar nicht mehr merken.
Lieber dumm fragen, als dumm bleiben!

6

08.12.2008, 08:36

hier noch n paar denkanstöße für den richtigen ansatz:
um den kollisionszeitpunkt abzuschätzen, kannst du das prinzip der teilenden ebenen verwenden. also einfach den vektor zwischen beiden gegenständen nehmen, und abschätzen, wann ne kollision ist.
wenn dann die kollision is / war, kannste anhand der richtung den wirklichen kollisionspunkt genauer abschätzen.
und für die kollisionsreaktion is impulsübertrag n gutes stuchwort :) der einfachheit halber kannste auch einfach den geschwindigkeits-vektor spiegeln, und etwas abziehen => abprall-verhalten

7

25.12.2008, 19:08

So, alles läuft ;)

Hier nochmal wie ich es jetzt gemacht habe:

Die Bewegung des Schiffes wird pro Frame immer neu durchgerechnet (muss ja so sein), dafür nehme ich die Funktion AutoMove()

ErstesMalKollision ist ein Bool Wert, der auf true steht, wenn das Schiff zum ersten Mal mit dem Objekt kollidiert (Dann kann man nicht "feststecken"), der Wert wird bei nicht-kollision wieder zurückgesetzt.

Hier der Pseudocode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
bool ErstesMalKollision;

X Koords speichern;
Y Koords speichern;

AutoMove();

BerechneKollision;

switch (Kollision)
{
case true:
KoordinatenZurücksetzen; // auf den vorher gespeicherten Wert

if (ErstesMalKollision == false)
{
ErstesMalKollision = true;
Speed = 0;
Bewegungsvektor_Zurücksetzen;
}
break;

case false:
ErstesMalKollision = false; // Es gab bereits eine "Erste" Kollision

break;
}


War gar nicht mal so schwer^^
Dieser Post wurde aus artgerecht gehaltenen, 100% chlorfrei gebleichten, handelsüblichen Elektronen aus Freihaltung erzeugt.

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

8

02.01.2009, 19:27

ich würds eher so machen (geschwindigkeit als vektor)

Quellcode

1
2
if (collision(ship.pos, ship.velocity, world))
    ship.velocity = -ship.velocity * 0.5; // abschwächungsfaktor
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

9

03.01.2009, 17:13

Wieso überprüfst du eigentlich den einen Bool-Wert mit switch(), den anderen mit einer expliziten Abfrage auf false? ;)

Ich würds so machen:

C-/C++-Quelltext

1
if (Kollision)

C-/C++-Quelltext

1
if (!ErstesMalKollision)

Aber nur so am Rande... :)

Werbeanzeige