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

Chef-Koch

Treue Seele

  • »Chef-Koch« ist der Autor dieses Themas

Beiträge: 115

Wohnort: Ulm

  • Private Nachricht senden

1

07.10.2006, 12:27

Kollisionsabfrage?

soo ich muss wieder nerven :/. Nachdem ich es jetz mit dem Colorkey gschafft hab (lag wirklich am Alphablending x_X') habe ich ein neues Problem :
Ich habe auf meinem tollen "Spielfeld" neben 1 Figur (Panzer) , den man selber steuern kann, 5 Hindernisse (Bäume). Jetz will ich aber, dass die Figur an den Bäumen hängenbleibt. Wie mach ich das am besten?ich habe schon etwas herumexperimentiert, aber Das klappt nicht so wie ich es will: Hier mal bissl Code:
P.S. Zu der Crash funktion: Es gibt da 2 Werte 1.0f und 2.0f, ich weiß, dass die nicht gerade toll gewählt sind (besser is die Werte mit fScspassed zu multiplizieren), aber ich habe sie nur gewählt, damit ich mit dem Debugger besser verfolgen kannwas passiert.

SO hier mal Ausschnitt aus meiner Move Funktion:

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
tbResult Move(float fSecsPassed)
{

    float Speed =       0.8f * fSecsPassed;

    for(int u = 0; u < 6; u++)
    {
    Speed = Crash(&g_aPanzer1, &g_aZeugs[u], Speed); //  g_aZeugs is ein 6er Array (bis 5 also^^).

    }



if(GetAsyncKeyState(VK_UP))
{
    for(int i = 0; i < 6 ;i++)
    {
    Crash(&g_aPanzer1,&g_aZeugs[i], Speed);
    }

    g_aPanzer1.bVertex[0].y += Speed;
    g_aPanzer1.bVertex[1].y += Speed;
    g_aPanzer1.bVertex[2].y += Speed;
    g_aPanzer1.bVertex[3].y += Speed;

    Textur = "Panzer_Up.bmp";
    
}


Und jetzt meine Crash Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
float Crash(SViereck *pCrasher, SViereck *pHinderniss, float Speed)
{
    for(int i  = 0; i < 5; i++)
    {
        for(int u = 0; u < 5; u++)
        {
            if(pCrasher->bVertex[i].x && pCrasher->bVertex[i].y  == pHinderniss->bVertex[u].x && pHinderniss->bVertex[u].y)
            {
                Speed = 1.0f; // HIER IST DER FEHLER! beim letzten aufrufen setzt er automatisch Speed auf 1.0f obwohl der Crasher gar nicht in der nähe von einem Hinderniss ist. (also wenn u = 5 ist)

            }

            else
            {
                Speed = 2.0f;
            }
        }
    }

return Speed;
}


Frage: Was mache ich falsch?
Wie kann man es besser machen?

2

07.10.2006, 12:51

kann nicht funktionieren:

Quellcode

1
2
3
if(pCrasher->bVertex[i].x && pCrasher->bVertex[i].y == pHinderniss->bVertex[u].x && pHinderniss->bVertex[u].y) 
{
}



richtiger wäre:

Quellcode

1
2
3
4
5
if((pCrasher->bVertex[i].x == pHinderniss->bVertex[u].x) && 
   (pCrasher->bVertex[i].y == pHinderniss->bVertex[u].y))
{
   crash();
}



noch besser:

Quellcode

1
2
3
4
5
6
7
float xd = pCrasher->bVertex[i].x - pHinderniss->bVertex[u].x;
float yd = pCrasher->bVertex[i].y - pHinderniss->bVertex[u].y;
float distanz_quadriert = xd*xd + yd*yd;
if (distanz_quadriert < limit)
{
   crash();
}

Chef-Koch

Treue Seele

  • »Chef-Koch« ist der Autor dieses Themas

Beiträge: 115

Wohnort: Ulm

  • Private Nachricht senden

3

07.10.2006, 13:01

woha :shock: :shock: danke für die schnelle antwort. Ich werde deins sobald wie möglich ausprobiern.

*daumenhoch*

Chef-Koch

Treue Seele

  • »Chef-Koch« ist der Autor dieses Themas

Beiträge: 115

Wohnort: Ulm

  • Private Nachricht senden

4

19.12.2006, 18:35

sooo ich bin wieder ^^. nach einiger Zeit pause und endlosen versuchen, bin ich nicht gerade weiter -.-'
Ich habe jetz mal meine Kollisionsabfrage komplett umgeschrieben, so dass es eig. funktionieren müsste, tuts aber nich -.-'
das Problem is konkret, dass der Wagen eig. nur beim hochfahren die Kollision richtig macht bei links/recht/runter passiert entweder gar nichts, oder er kollidiert an der falschen stelle :(
also hier erstmal der Code von meiner Kollisionsabfrage:

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
float Crash(SViereck *pCrasher, SViereck *pHinderniss, float Speed,float fSecsPassed)
{

                        if(GetAsyncKeyState(VK_UP)) {                   
                            if((abs(pCrasher->bVertex[1].x - pHinderniss->bVertex[1].x) <= 0.5f) && (abs(pCrasher->bVertex[3].x - pHinderniss->bVertex[3].x) <= 0.5f)
                            && (abs(pCrasher->bVertex[1].y - pHinderniss->bVertex[1].y) <= 0.5f) && (abs(pCrasher->bVertex[3].y - pHinderniss->bVertex[3].y) <= 0.5f))
                            Speed = -0.9f *fSecsPassed;

                            else
                            Speed = 0.8f *fSecsPassed;
                        } 


                        if(GetAsyncKeyState(VK_DOWN))   {           
                            if((abs( pHinderniss->bVertex[0].x - pCrasher->bVertex[0].x) <= 0.5f) && (abs(pHinderniss->bVertex[2].x - pCrasher->bVertex[2].x) <= 0.5f)
                            && (abs( pHinderniss->bVertex[0].y - pCrasher->bVertex[0].y) <= 0.5f) && (abs(pHinderniss->bVertex[2].y - pCrasher->bVertex[2].x) <= 0.5f))
                            Speed = -0.9f *fSecsPassed;

                            else
                            Speed = 0.8f * fSecsPassed;
                        } 

                        if(GetAsyncKeyState(VK_LEFT))   {           
                            if((abs(pCrasher->bVertex[0].x - pHinderniss->bVertex[2].x) <= 0.5f) && (abs(pCrasher->bVertex[1].x - pHinderniss->bVertex[3].x) <= 0.5f)
                            && (abs(pCrasher->bVertex[0].y - pHinderniss->bVertex[2].y) <= 0.5f) && (abs(pCrasher->bVertex[1].x - pHinderniss->bVertex[3].y) <= 0.5f))
                            Speed = -0.9f *fSecsPassed;

                            else
                            Speed = 0.8f * fSecsPassed;
                        } 

                        if(GetAsyncKeyState(VK_RIGHT))  {           
                        if((abs(pCrasher->bVertex[2].x - pHinderniss->bVertex[0].x) <= 0.5f) && (abs(pCrasher->bVertex[3].x - pHinderniss->bVertex[1].x) <= 0.5f)
                        && (abs(pCrasher->bVertex[2].y - pHinderniss->bVertex[0].y) <= 0.5f) && (abs(pCrasher->bVertex[3].x - pHinderniss->bVertex[1].y) <= 0.5f))
                        Speed = -0.9f *fSecsPassed;

                        else
                        Speed = 0.8f * fSecsPassed;

                        } 


return Speed;
}


soo siehts jetz aus ^^. von den eckpunkten her müsste alles so stimmen(auch wenn es auf dem ersten blick nicht so aussieht) ich werde mal des Programm bei rapidshare hochladen, dann könnt ihr euch den Fehler mal live anguggn.
edit: hier mal programm:
http://rapidshare.com/files/8159886/Beispielprogramme2.rar.html

Chef-Koch

Treue Seele

  • »Chef-Koch« ist der Autor dieses Themas

Beiträge: 115

Wohnort: Ulm

  • Private Nachricht senden

5

28.12.2006, 19:13

ok hab das Problem schon sleber geloest ^^.

Werbeanzeige