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

Anonymous

unregistriert

1

10.04.2004, 19:37

Bewegung auf dem "Spielfeld"

Hallo,

habe gestern mal ein bisschen rumprobiert und eine kleine Map mit Milkshape gefertigt, die 4 Stufen enthält (also eine Treppe :) )...

Meine Figur soll nun richtig über die Map laufen,
also die Höhe beachten, die Stufen hochgehen (aber nur eine, also wenn ich an der Seite der "Treppe" stehe, auf Höhe der 3.Stufe oder so dann nicht auch da hoch),...

Das habe ich jetzt mal folgendermaßen realisiert :

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    tbVector3 vOldPos = g_vFigur;
    g_vFigur.z += (g_pfButtons[TB_KEY_UP]-g_pfButtons[TB_KEY_DOWN]) * fFIG_SPEED * secs;
    g_vFigur.x += ((g_pfButtons[TB_KEY_RIGHT]-g_pfButtons[TB_KEY_LEFT]) * fFIG_SPEED * secs);

    tbVector3 vCrossPos;
    if (tbLineHitsModel(tbVector3(g_vFigur.x, g_vFigur.y + H_STUFEN,g_vFigur.z), 
                tbVector3(g_vFigur.x, -10.0f ,g_vFigur.z),
                g_pTerrainModell, g_mTerrain, g_imTerrain,
                0.0f, &vCrossPos))
    {   
        if (!tbLineHitsModel(tbVector3(g_vFigur.x, g_vFigur.y + H_STUFEN + H_FIGUR,g_vFigur.z),
                tbVector3(g_vFigur.x, g_vFigur.y+H_STUFEN+0.1,g_vFigur.z),
                g_pTerrainModell, g_mTerrain, g_imTerrain))
            g_vFigur.y = vCrossPos.y;
        else g_vFigur = vOldPos;
    }
    else g_bGameOver = TRUE;



    g_mFig = tbMatrixScaling(3.0f) 
        * tbMatrixTranslation(g_vFigur);


Ich denke Die meisten Varibalen sollten aus der Bennenung klar werden. g_mTerrain ist die Transformations-Matrix
g_imTerrain ist die Inverse Transformations-Matrix
H_STUFE ist die Höhe der Stufen die noch erklommen werden sollen
H_FIGUR die Höhe der Figur

(die letzten beiden berechnet man wohl später besser aus der Bounding-Box aber ist jetzt erstmal egal)

das ganze funktioniert auch erstmal ganz gut, aber das Problem ist ja, das ich nur eine Linie teste, also nur den Mittelpunkt der Figur, was nun mit den verschiedenen Beinen oder Armen ist ist der Funktion ganz egal....

Praktisch gesagt, kann ich also auch dort hochgehen, wo oben zwar nur ein ganz dünner Spalt ist;
Die Figur steht dann halt halb in den Wänden..... :(

ich hatte zuerst tbModelHitsModel verwendet, aber entweder kapiere ich da was nicht ganz richtig, oder die Funktion funktioniert nicht so wie sie soll, denn meine Spielfigur kann bis zu einer bestimmten Tiefe im Boden "versinken" ohne das diese Fkt. eine Kollsion meldet (so etwa zu einem Drittel !!!)


Wie kann ich das ganze also verbessern ?

ich will, ums nochmal kurz zu sagen :) das meine Figur über ein Terrain laufen kann und natürlich auch stehen bleibt wenns nicht weitergeht.

Anonymous

unregistriert

2

11.04.2004, 04:50

bin am verzweifel :(

hi,

bin echt am verzweifeln langsam, ich hab jetzt 4 1/2 stunden damit zugebracht den obigen Code so umzuschreiben, das es meinen Wünschen mehr entspricht, allerdings macht die Figur jetzt echt Mist...

also manchmal so wie ich will manchmal auch nicht, sogar an der gleichen Stelle, also manchmal treppe rauf ok, manchmal nicht,

ausserdem kann ich mich auf dem Spielfeld nur soweit nach links und rechts bewegen wie die Treppen breit sind....

Total komisch.....

ist das vielleicht doch ein Fehler in tbModelHitsModel ?
meine Funktion ist ja nun nicht so lang und ich bin seit ein paar stunden am debuggen aber ich find nix :(((

Wenn jmd schon ähnliches Problem gelöst hat, würde ich mich sehr freuen zu hören wie ihr es (zumindest theoretisch !) gemacht habt,

hier nochmal der neue 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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
const tbMatrix MAT_FIG = tbMatrixRotationY(TB_DEG_TO_RAD(180));
    tbVector3 vNewPos = g_vFigur;
    vNewPos.z += ((g_pbButtons[TB_KEY_UP]-g_pbButtons[TB_KEY_DOWN]) * fFIG_SPEED * secs);
    vNewPos.x += ((g_pbButtons[TB_KEY_RIGHT]-g_pbButtons[TB_KEY_LEFT]) * fFIG_SPEED * secs);

    bMhM = FALSE;
    bMhM2 = FALSE;

    tbVector3 vCrossPos;
    if (tbLineHitsModel(tbVector3(vNewPos.x, vNewPos.y + H_STUFEN,vNewPos.z), 
                tbVector3(vNewPos.x, -10.0f ,vNewPos.z),
                g_pTerrainMod, g_mTerrain, g_imTerrain,
                0.0f, &vCrossPos))
    {   
        vNewPos.y = vCrossPos.y + 0.1f;
        tbMatrix    mNewFig = MAT_FIG 
                        * tbMatrixTranslation(vNewPos);
        
        if (tbModelHitsModel(g_pFigurMod, mNewFig,  tbMatrixInvert(mNewFig),
                            g_pTerrainMod, g_mTerrain, g_imTerrain))
        {
            bMhM = TRUE;
            
            if (vNewPos.z != g_vFigur.z)
            {
                if ((vNewPos.z-g_vFigur.z) > 0)
                    vNewPos.z += 1.5f;
                else vNewPos.z -= 1.5f;
            }
            if (vNewPos.x != g_vFigur.x)
            {
                if ((vNewPos.x-g_vFigur.x) > 0)
                    vNewPos.x += 1.5f;
                else vNewPos.x -= 1.5f;
            }

            mNewFig = MAT_FIG 
                        * tbMatrixTranslation(vNewPos);

            if (!tbModelHitsModel(g_pFigurMod, mNewFig, tbMatrixInvert(mNewFig),
                            g_pTerrainMod, g_mTerrain, g_imTerrain))
            {
                g_vFigur = vNewPos;
                g_mFig = mNewFig;
            }
            else bMhM2 = TRUE;
        }
        else 
        {
            g_vFigur = vNewPos;
            g_mFig = mNewFig;
        }
    }
    else g_bGameOver = TRUE;