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

03.03.2003, 16:46

2D-Kollisionsproblem

:huhu: :help:

Ich hab grade erst mit der Spieleprogrammierung angefangen und scheitere an ner kollisionsabfrage :crying: .
Hier mal der Code:

Quellcode

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
26
27
28
29
30
31
32
33
34
35
BOOL Collision(int PosX, int PosY)
{
    if(PosX+speedX > 710 || PosX+speedX < 60)
    {
        speedX *=-1;
        return TRUE;
    }
    if(PosY <= 60)
    {
        speedY *= -1;
        return TRUE;
    }
    if(PosY >= pPlayer.Position.PosY-pPlayer.GetHeight() && pPlayer.Position.PosX <= PosX && pPlayer.Position.PosX+pPlayer.GetWidth() >= PosX)
    {
        speedY *= -1;
        return TRUE;
    }
    for(int i=0;i<=size;i++)
    {
        if(PosY+1 <= Block[i].GetY() + Block[i].GetHeight() && PosY+1 >= Block[i].GetY() && PosX+1 >= Block[i].GetX() && PosX <= Block[i].GetX() + Block[i].GetHeight())
        {
            speedY *= -1;
            Block[i].SetState(FALSE);
            return TRUE;
        }
        if(PosY+1 >= Block[i].GetY() && PosY <= Block[i].GetY() + Block[i].GetHeight()&& PosX >= Block[i].GetX() && PosX <= Block[i].GetX() + Block[i].GetHeight())
        {
            speedY *= -1;
            Block[i].SetState(FALSE);
            return TRUE;
        }
    }

    return FALSE;
}

Ich übergebe der Funktion die aktuelle position des spielers, nun wird überprüft ob sich der spieler zuweit rechts oder links befindet, sollte er sich noch im zulässigen bereich befinden, wird überprüft obe er sich zu weit unten befindet. Sollte dies auch nicht zutreffen, wird überprüft ob er irgendwo gegengeflogen/gelaufen ist. Hindernisse sind in diesem fall einige kästen.
Nur klappt das nicht so wie ich will, manchmal kann man ganz durch den kasten durchfliegen und manchmal prallt man erst ab, wenn man bereits im kasten drin ist.
In a world without fences and walls - who needs windows and gates ?

http://www.Paid4Mailer.de/?refid=8422

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

03.03.2003, 17:06

Willkommen im Forum! :)

Kann es sein, dass sich die Spielfigur um mehr als einen Pixel pro Frame bewegt? Wenn das der Fall ist, dann ist ja auch klar, dass sie in das Kästchen reinlaufen kann.
Wenn die Schritte zu groß sind, könnte es auch ganz übersprungen werden!

3

03.03.2003, 17:21

NeNe, die Figur bewegt sich ein sowohl auf der X, wie auch auf der Y-Achse nur 1 pixel pro frame.
In a world without fences and walls - who needs windows and gates ?

http://www.Paid4Mailer.de/?refid=8422

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

03.03.2003, 17:41

Betrachtest Du die Spielfigur als punktförmig oder ist sie auch ein Rechteck?

5

03.03.2003, 18:43

Sind alles Rechtecke.
Kreise und u.ä. war mir noch zu kompliziert.
In a world without fences and walls - who needs windows and gates ?

http://www.Paid4Mailer.de/?refid=8422

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

03.03.2003, 19:26

Also mir fällt folgendes auf:
- Wenn man seitlich gegen die Hindernisse läuft, passiert nichts.
- Es wird lediglich die Höhe eines Blocks für die Berechnungen verwendet und niemals die Breite (das wäre dann wohl GetWidth).

7

03.03.2003, 20:22

Daran lag es auch, aber ich hab hier:

Quellcode

1
PosX <= Block[i].GetX() + Block[i].GetHeight()


die X-Coordinate + die höhe gerechnet, was in diesem fall völliger quatsch is.
Und ich musste, wenn der spieler von oben auf einen block trifft auch noch die höhe des spielers hinzurechnen.
Nun klappt das auch, nur bleib der spieler ab und zu an einem block hängen, d.h er trifft auf den block und fährt an der seite an der er getroffen hat solange entlang, bis der block zu ende ist.
In a world without fences and walls - who needs windows and gates ?

http://www.Paid4Mailer.de/?refid=8422

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

04.03.2003, 09:37

Ich verstehe das Prinzip dieses Spiels noch nicht ganz - wieso kann man nur von oben oder von unten gegen einen Block stoßen? Das muss ja so sein, weil ich nirgendwo "SpeedX *= -1" sehe, außer halt für den linken und rechten Bildschirmrand! Ansonsten probier mal folgendes: füge nach allen "SpeedY *= -1" noch ein "Player.PosY += SpeedY" ein.

Werbeanzeige