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

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

1

19.01.2008, 14:08

Kollisionsproblem gelöst ;)

Hallo liebe User,
ich sehe viele Leute die ein Problem mit der Kollision des Spiels haben.
Ich habe grade den Algorythmus gefunden den jeder für eine saubere Kollision benötigt.

Hier die beiden Methoden die gebraucht werden.

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// CheckCollisions


//


// Aufgabe: Kollisionen zwischen Asteroiden/Feind und Schüssen prüfen


//


void CGame::CheckCollisions ()

{



    // Schussliste des Spielers holen


    list<CShot> *ShotList = m_pPlayer->GetShotList ();



    // Iteratoren für Asteroiden- und Schussliste


    list<CAsteroid>::iterator ItAsteroid = m_AsteroidList.begin ();

    list<CShot>::iterator ItShot;





    // Rects für Asteroiden und Schüsse


    SDL_Rect RectAsteroid;

    SDL_Rect RectShot;





    // Alle Feinde durchlaufen


    while ( ItAsteroid != m_AsteroidList.end () )

    {

        // Rects holen


        RectAsteroid = ItAsteroid->GetRect();

        RectPlayer = m_pPlayer->GetRect();



        // Alle Schüsse durchlaufen


        for (ItShot = ShotList->begin (); ItShot != ShotList->end (); ItShot++)

        {

            // Rect des Schusses holen


            RectShot = ItShot->GetRect();

            bool bWasCollision = WasCollision(RectAsteroid, RectShot);


            if(bWasCollision)
            {
                ItAsteroid->SetAlive (false);
                ItShot->SetAlive (false);
            }


        }

        // Asteroid löschen, falls deaktiviert

        if (ItAsteroid->IsAlive())
        {
            ItAsteroid++;
        }
        else
        {
            ItAsteroid = m_AsteroidList.erase(ItAsteroid);
        }
    }
}


bool CGame::WasCollision(SDL_Rect RectObj1, SDL_Rect RectObj2)
{
    for(int y = (RectObj1.y+RectObj1.h); y >= RectObj1.y; y--)
    {
        for(int x = (RectObj1.x+RectObj1.w); x >= RectObj1.x; x--)
        {
            // Überschneiden sich die Rects?

            if( RectObj2.y < y &&
                RectObj2.x < x &&
                RectObj2.y + RectObj2.h > y &&
                RectObj2.x + RectObj2.w > x)
            {
                // Ja, also gab es eine Kollision.

                return true;
            }
        }
    }
    return false;
}


Zur Erklärung.
Die Methode CheckCollision läuft alle Möglichen Objekte durch, hier sind es Schüsse und Asteroiden.
Die Methode WasCollision, prüft ob es zwischen den Pixel von RectObj1 und RectObj2 eine kollision gab.
Falls es auch nur eine Kollision gab, wird die Methode beendet und das true zurückgegeben.

Falls nicht, gibt es ein falls zurück.
Somit ist die Sache super optimiert und die Kollision wird auf Pixelebene durchgeführt, was sehr genau ist.

Hoffe die Lösung kann man Sticky gemacht werden, damit nicht jeder 3-4 Thread nur eine Lösung für das Problem sucht ;)

MFG T-Virus
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

Anonymous

unregistriert

2

19.01.2008, 14:14

Aehm ja und, das ist das simpelste was es gibt, schon zig mal gecodet? Ich sehe da jetzt nicht das geniale, warum das jeder brauchen sollte. Hoechstens lauter Probleme, die man damit immer noch haben koennte. f'`8k

[ ] Autocogito


Gruß, TGGC (making great games since 1992)

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

3

19.01.2008, 15:08

Hallo,
sorry TGGC muss dich enttäuschen.
Das ist nicht dein Flamerforum.

Und hier rennen nicht 2D Spieleprogrammierer rum, die denken sie wären die größten.

Also bitte mal sachlich bleiben.
Der letzte der sich zuweit aus dem Fenster gelehnt hat, ist schon seit Monaten weg.

Und ich wäre sehr enttäuscht wenn wir wieder so einen flamer hier ertragen müssten.

MFG T-Virus
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

Anonymous

unregistriert

4

19.01.2008, 15:37

Du glaubst also wirklich an die wahnwitzige Idee, _jeder_ wuerde _diesen_ Code fuer eine _saubere_ Kollision brauchen? Ich kann dir mal was sagen, was garantiert kein Flame ist, aber WasCollision ist so ziemlich der duemmste Code, den ich in letzter Zeit gesehen hab. Der Kommentar "Somit ist die Sache super optimiert und die Kollision wird auf Pixelebene durchgeführt, was sehr genau ist." laesst mich daran zweifeln, ob dieser ganze Thread nicht nur reine Ironie sein soll. Tut mir ja leid fuer dich, wenn du das nicht einsehen kannst. Aber in dem Fall kann ich dir wirklich auch nicht mehr helfen. f'`8k

[ ] Autocogito


Gruß, TGGC (making great games since 1992)

5

19.01.2008, 16:07

Trozdem brauchst du nicht hier reinschneien und wie ein Kiddie hier rumflamen und andere beleidigen wie dumm sie alles sind, nur weil sie es nicht besser wissen. Also halt dein Rand und geh Spielen.

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

6

19.01.2008, 16:21

Was geht denn hier ab? Oo

Die Kritik ist imho berechtigt, diese Lösung hier ist alles andere als perfekt oder universell einzusetzen. Und in dieser Form mit Sicherheit nicht FAQ oder Stickyfähig.

Schön, dass du dein Problem gelöst hast, aber lass dir auch Kritik gefallen. Man hätte das sicherlich freundlicher äussern können, aber wer so wahnwitzig tönt,muss auch mit den Konsequenzen leben.

Zitat

Ich habe grade den Algorythmus gefunden den jeder für eine saubere Kollision benötigt.

Zitat

Somit ist die Sache super optimiert und die Kollision wird auf Pixelebene durchgeführt, was sehr genau ist.
:roll:

Anonymous

unregistriert

7

19.01.2008, 16:26

Zitat von »"raXor"«

Trozdem brauchst du nicht hier reinschneien und wie ein Kiddie hier rumflamen und andere beleidigen wie dumm sie alles sind, nur weil sie es nicht besser wissen. Also halt dein Rand und geh Spielen.
Ich habe keine Lust auf so eine Diskussion. Mein erster Post war definitiv kein Geflame. Und auch der zweite ist, davon bin ich ueberzeugt, im Grunde voellig korrekt. Wenn ihr mich schon als Flamer und Kiddie beschimpfen wollt, dann zeigt mir erst mal konkret, warum! Und nur sur Information, habe ich hier niemanden persoenlich als dumm oder aehnliches beschimpft. Auch das ist nicht mein Problem, wenn ihr es so interpretieren wollt. Aber getroffene Hunde bellen ja bekanntlich. f'`8k


Gruß, TGGC (making great games since 1992)

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

8

19.01.2008, 16:29

Hallo,
okay Kritik kann ich ja ab, aber ich kenne TGGC und weiß das seine Beiträge nunmal sinnlos sowie nutzlos sind.
Er kommt aus dem C++ Forum und dort hält er sich schon für den größten.
Der letzte der das hiergetan hat, war nix da und der ist jetzt auch schon ne weile weg und geschadet hats keinem ;)

Okay die Kollision soll auch nicht in WoW oder einem ähnlichem Spiel vorkommen, aber sie soll für klene Spiele reichen und das tut sie nunmal.
Aber astelle alles schlecht zu machen, wie TGGC es ja nunmal am besten kann, sollte man die möglichen Fehlerquellen mal posten.

MFG T-Virus
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

9

19.01.2008, 16:47

Es kommt darauf an.

Zitat

okay Kritik kann ich ja ab, aber ich kenne TGGC und weiß das seine Beiträge nunmal sinnlos sowie nutzlos sind.
Er kommt aus dem C++ Forum und dort hält er sich schon für den größten.
Der letzte der das hiergetan hat, war nix da und der ist jetzt auch schon ne weile weg und geschadet hats keinem Wink
Nun das ist so nicht korrekt. Auch wenn Patricks (nix da) coding-style etwas verwegen war und seine Ansichten nicht immer unproblematisch waren, konnte man recht nützliche Informationen aus seinen Tutorials usw. ziehen (leider zum Teil nur als Anfänger brauchbar :( ).

Nun, wenn du hingehst und deinen Code als ultimo dastellst, ist es nunmal so, das du schnell Antworten bekommst, warum er es nicht ist. D.h. sind TGGC's Beiträge in dem Fall kein Flamen oder sonstiges, sondern lediglich ein etwas direkterer Hinweiß darauf, dass man seine Lösungen nicht für perfekt halten sollte, sondern eher gucken sollte, was man an diesen noch verfeinern kann usw.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

10

19.01.2008, 16:57

Hllo Deviloper,
so wie du es formulierst ist es a in Ordnung.
Nur mit einem sodämmlichen Spruch und dann dem Link, den er bereits in 2 Thread auf spieleprogrammierer.de gepostet hat, da kommt mir dann auch das kotzen.

MFG T-Virus
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

Werbeanzeige