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

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

1

01.06.2011, 20:05

Collisionsabfrage

Sehr geehrtes Forum,
ich habe mir eine Funktion geschrieben, die eine Collision abfragen soll, in meinem neuesten Spiel.
Im Code sind Funktionen der X-Games-Library, die ich jetzt nicht alle im Forum posten kann, die funktionieren
aber alle, ganz sicher.

Auf jeden Fall passiert folgendes :
Wenn ich das Spiel starte, und dann im Level rumlaufe, dann gibt es zwei Fälle :
1. Einmal dass checkCollisions und alles mögliche drumherum perfekt ohne Fehler funktioniert
2. Dass er gar nicht kolllidiert, und so durch blöcke laufen kann

Ich kann mir leider überhaupt nicht erklären, weshalb es einmal geht, und einmal nicht. Es ist nicht so, dass CC_Case_01() einen speziellen Fall nicht berücksichtigt,
sondern es ist wirklich so, dass während einer Laufzeit des Programms das entweder super funktioniert, oder nicht.

Ich beschäftige mich schon seit 3 Tagen mit dem Problem und finde leider überhaupt keine Antwort, wäre jemand von euch so freundlich und könnte mir sagen, woran
es liegen könnte?

Debugger kann ich leider nicht benutzen, mein PC dran schuld, ich benutzte nämlich Codeblocks, Visual Studio funktioniert nicht richtig bei mir, und bei Codeblocks kriege ich beim
Starten des Debuggers immer Segmentationsfehler.

Hier erst einmal mein Code :

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
109
110
111
112
113
114
115
116
117
118
119
120
121
void AdventurePlayer::checkCollisions()
{
/// Collision mit dem Rahmen
    while(joe.r.x<35)
        joe.Move(1,0);
    while(joe.r.x>width-35-block_size)
        joe.Move(-1,0);
    while(joe.r.y<35)
        joe.Move(0,1);
    while(joe.r.y>height-35-block_size)
        joe.Move(0,-1);

/// Collision mit Objekten
    bool anti_grav = false;

    for(unsigned int x = 0;x<aLevel.objects.size();x++)
    {
        for(unsigned int y = 0;y<aLevel.objects[x].size();y++)
        {
            if(collision(joe.r,aLevel.objects[x][y].r,2))
            {
                if     (aLevel.objects[x][y].i_code==0)
                // Objekte die keinen Einfluss nehmen
                {
                    ;
                }
                else if(aLevel.objects[x][y].i_code==1)
                // Objekte die Blocken
                {
                    CC_Case_01(&anti_grav, x, y);
                }
                else if(aLevel.objects[x][y].i_code==2)
                // Objekte die Töten
                {
                    CC_Case_02(&anti_grav);
                }
                else if(aLevel.objects[x][y].i_code==3)
                // Einsammel-Objekte
                {
                    CC_Case_03(x,y);
                }
                else if(aLevel.objects[x][y].i_code==4)
                // Beginn des Levels
                {
                    ;
                }
                else if(aLevel.objects[x][y].i_code==5)
                // Ziel des Levels
                {
                    levelUp();
                }
            }
        }
    }

/// Gravitation
    if(!anti_grav)
    // Wenn es kein Objekt gibt, was den Spieler am Fallen hindert
    {
        joe.Move(0,100*window->GetFrameTime());
    }

}
void AdventurePlayer::CC_Case_01(bool* b, int x, int y)
{
    if(joe.r.y+joe.r.h/2>aLevel.objects[x][y].r.y&&joe.r.y+joe.r.h/2<aLevel.objects[x][y].r.y+aLevel.objects[x][y].r.h)
    //  Bedingung 1 : Der Y-Durchschnitt vom Spieler ist im Block
    {
        if(joe.r.x+joe.r.w/2<aLevel.objects[x][y].r.x+aLevel.objects[x][y].r.w/2)
    //  Bedingung 2 : Der X-Durchschnitt vom Spieler ist kleiner als der X-Durchschnitt vom Block
        {
            if(y-1>=0)
    //  Bedingung 3 : Der Block ist kein Randblock
            {
                if(aLevel.objects[x][y-1].i_code==0)
    //  Bedingung 4 : Der Block hat neben sich (links) einen Block der nicht mit dem Spieler agiert
                {
                //----> Der Spieler wird zur Seite gedrückt bis er ganz aus dem Block ist
                    while(joe.r.x+joe.r.w>aLevel.objects[x][y].r.x)
                        joe.Move(-1,0);
                }
            }
        }
        else if(joe.r.x+joe.r.w/2>aLevel.objects[x][y].r.x+aLevel.objects[x][y].r.w/2)
    //  Bedingung 2.1 : Der X-Durchschnitt vom Spieler ist größer als der X-Durchschnitt vom Block
        {
            if(y+1<aLevel.objects[x].size())
    //  Bedingung 3.1 : Der Block ist kein Randblock
            {
                if(aLevel.objects[x][y+1].i_code==0)
    //  Bedingung 4.1 : Der Block hat neben sich (links) einen Block der nicht mit dem Spieler agiert
                {
                //----> Der Spieler wird zur Seite gedrückt bis er ganz aus dem Block ist
                    while(joe.r.x<aLevel.objects[x][y].r.x+aLevel.objects[x][y].r.w)
                        joe.Move(+1,0);
                }
            }
        }
    }
    else
    //  Andernfalls
    {
        if(joe.r.y+joe.r.h/2<aLevel.objects[x][y].r.y+aLevel.objects[x][y].r.h/2)
        //  Falls der Y-Durchschnitt oberhalb vom Y-Durchschnitt des Blocks ist
            while(joe.r.y+joe.r.h>aLevel.objects[x][y].r.y)
            //  Spieler rausdrücken bis er ganz aus dem Block ist
                joe.Move(0,-1);
        else
        //  Falls der Y-Durchschnitt unterhalb vom Y-Durchschnitt des Blocks ist
            while(joe.r.y<aLevel.objects[x][y].r.y+aLevel.objects[x][y].r.h)
            //  Spieler rausdrücken bis er ganz aus dem Block ist
                joe.Move(0,+1);

        *b = true;
        if(joe.jumping&&joe.fUp<=7)
        {
            joe.fUp = 0;
            joe.jumping = false;
        }
    }
}


Ich wäre dankbar für jede konstruktive Antwort und Hilfe,

m.f.G. Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

2

01.06.2011, 20:28

Debugger kann ich leider nicht benutzen, mein PC dran schuld, ich benutzte nämlich Codeblocks, Visual Studio funktioniert nicht richtig bei mir, und bei Codeblocks kriege ich beim
Starten des Debuggers immer Segmentationsfehler.


Dann würde ich erstmal, bevor ich irgendwas weier programmiere, den debugger zum laufen bringen...

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

01.06.2011, 20:38

Dir ist schon klar, dass du die Felder auf denen der Spieler steht, berechnen kannst?
Du kannst dir also sparen, alle Felder zu durchlaufen.

Ich vermute, es gibt mehrere Kollisionen gleichzeitig und der Spieler reagiert nur auf eine davon.

Ansonsten stimme ich Sylance zu. Sorg dafür das Visual Studio funktioniert oder bringt wenigstens den Debuger zum laufen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

4

02.06.2011, 08:31

Ich kann leider mit dem PC den ich habe, Visual Studio unter keinen Umständen zum laufen bringen, und bekomme ansonsten bei anderne Debuggern immer Segmentations Fehler.

Ein Tipp war von andernen, dass die Rechtecke vielleicht gar nicht richtig erstellt werden. Doch beim Zeichnen dieser wird klar, dass sie auch bei Nichtfunktionieren des Codes an dem richtigen Ort sind.

Ich denke das hat gar nichts mit dem gegebenen Codeausschnitt zu tun, da es von Anfang an feststeht, ob sie funktioniert, oder nicht.

Zitat

Dir ist schon klar, dass du die Felder auf denen der Spieler steht, berechnen kannst?

Ja, aber ich bin noch ein Anfänge, und möchte das erst einmal so machen, bis ich dann bei Updates für das Spiel das ganze modifiziere, verstehst du?

Ich wäre euch dankbar für weitere Tipps, mit freundlichen Grüßen

Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

02.06.2011, 08:44

Ich kann den anderen beiden leider nur zustimmen. Du brauchst einen laufenden Debugger. Den brauchst Du so oder so und das sollte Dein vorrangiges Ziel im Moment sein. Ohne den wirst Du nicht weit kommen und bei jedem kleinen Bug wieder im Forum aufschlagen müssen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

6

02.06.2011, 09:21

Kann mir jemand in Skype helfen, und einen Debugger finden der mit Codeblocks funktioniert, ich kriege das alleine beim besten willen nicht hin :(
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

7

02.06.2011, 10:05

Ich wuerde auch sagen, du brauchst erstmal einen funktionierenden Debugger. Der Code ist so kompliziert, das den niemand komplett verstehen kann. Du musst erstmal rausfinden, in welchen Teil das Programm im Fehlerfall geraet,

Ansonsten passiert ja ein Teil der Magie hier drin:
collision(joe.r,aLevel.objects[x][y].r,2)

Und die Funktionen kennen wir nicht.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

02.06.2011, 10:16

Der Code ist so kompliziert, das den niemand komplett verstehen kann.

:thumbsup:
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

02.06.2011, 10:29

Hier sieht man imo auch recht gut, wie Kommentare nicht eingesetzt werden sollten. Die Grundidee ist zwar gut den Ablauf genau zu dokumentieren, aber das sollte im Code passieren. z.B

C-/C++-Quelltext

1
2
3
if(aLevel.objects[x][y].i_code==0)
                // Objekte die keinen Einfluss nehmen
...


wird zu:

C-/C++-Quelltext

1
2
3
int type = aLevel.objects[x][y].i_code;
if( type == TYPE_DEFAULT)
...

TYPE_DEFAULT kann z.B ein enum oder eine sonstige Konstante sein.
Dann sind die Kommentare auch gleich nicht mehr nötig.

Die ganze Kaskade kann man natürlich auch gleich mit einem switch Statement ersetzen.

Die Bedingungsprüfungen kann man z.B auch mit kurzen Funktionen ersetzen, die das jeweils prüfen.

Diese Case Funktionen kannst du auch bessere Namen geben. Am besten das, was sie tun.

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

10

02.06.2011, 10:34

Zitat

Hier sieht man imo auch recht gut, wie Kommentare nicht eingesetzt werden sollten. Die Grundidee ist zwar gut den Ablauf genau zu dokumentieren, aber das sollte im Code passieren. z.B

Ok, ich werde dann dafür ein Enum benutzten, danke für den Tipp,


Zitat

Ansonsten passiert ja ein Teil der Magie hier drin:
collision(joe.r,aLevel.objects[x][y].r,2)

OK, die zeige ich hier jetzt auch noch einmal :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
    bool collision(Rect& r1,Rect& r2,unsigned int toll)
    {
    //  Ecken des Rechtecks
        Point p1(r1.x+toll,     r1.y+toll);
        Point p2(r1.x+r1.w+toll,r1.y+toll);
        Point p3(r1.x+r1.w+toll,r1.y+r1.h+toll);
        Point p4(r1.x+toll,     r1.y+r1.h+toll);

        return (collision(p1,r2)||collision(p2,r2)||collision(p3,r2)||collision(p4,r2));
    }


Ist mir schon klar das ich einen Debugger brauche, hat einer von euch heute Zeit, um mir in Skype per Gespräch und per TV (TeamViewer) zu helfen? Ich brauche wirklich mal Hilfe, um mir einen Debugger für CodeBlocks zu besorgen.

Danke.
m.f.g. Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Werbeanzeige