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

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

11

09.02.2012, 16:23

Guck dabei vielleicht weniger nach Code, als nach dem Wissen was dahinter steckt. Das Prinzip ist wirklich nicht schwer und sollte umzusetzen sein. Ich denke ein bisschen Erfahrung wirst du schon haben wenn du mit dem Buch arbeitest? Als Einsteigerbuch ist es nämlich wirklich nicht geeignet;) Wenn du das Prinzip verstanden hast, sollte es nicht allzu schwer sein ein Terrain mit der TriBase zu erstellen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

12

09.02.2012, 16:55

Das Stadtmodell als Ausgangslage fand ich unpraktisch.
Ich habe das Breakanoid-Spiel als Anfang benutzt.
Dort entfernst du erstmal die Wände und kommentierst alles aus.
Dann kommentierst du den Ball wieder ein und änderst den Code so das du ihn nur mit den Pfeiltasten bewegen kannst (solltest du ja schon können :vain: ).
Dann kommentierst du die Steine wieder ein und machst die Kollision. Sollte auch kein Problem sein.
Nun kannst du die Steine mit einem anderen Modell ersetzen, sagen wir...ein Baum? :whistling: Jetzt musst du nur noch die Kollisionsabfrage ein wenig anpassen.
Du kannst diese Modellart dann kopieren und andere Modelle einfügen, falls du brauchst (ja brauchst du :P ).
Jetzt fehlt nur noch dein Terrain. Also erstmal alles wieder auskommentieren.
Für das Terrain habe ich glücklicherweise diesen Code hier gefunden:
Terrain rendern - Bsp.: tbDirect3D
Dort kommt am Ende ein wabbelndes Terrain raus, quasi ein Meer. Wenn du da die Bewegung raus nimmst und eine andere Textur verwendest, hast du eine Landschaft.
Für das Kleben der Objekte auf dem Terrain musst du dann die Höhe des Terrains an einem bestimmten Punkt ermitteln. Dafür machst du dir eine Funktion, die recht trivial ist.
Beim Erstellen der Objekte fragst du dann die Höhe ab und setzt die Gegenstände entsprechend.
Bei der Kugel fragst du die Höhe bei jedem Frame ab und passt sie jeweils an.
Vielen Dank soweit für deine Hilfe. Aber ich habe dazu noch einige Frage:

Das Levelmodeel ist ja in der Level.tbm gespeichert. Wie bekomme ich denn da die Wädne raus? Oder meinst du ich soll nur die "imaginären" Wände in der Game.cpp auskommentieren?

Wie ersetze ich das Blockmodell denn gegen ein Baummodell? Dafür brauche ich doch auch wieder eine entsprechende .tbm, oder? Wo kriege ich die denn her?

Das sind erstmal die 2 Hauptbaustellen...

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

13

09.02.2012, 17:28

Du kannst doch anstatt der Blockmodelle einfach eigene Modelle laden;) Kannst natürlich auch welche aus dem Internet besorgen, aber diese dann auszutauschen sollte nicht zu schwer sein.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

14

09.02.2012, 17:39

Jip, klar. Aber ich habe ja keine Ahnung wie ich so ein tbm Modell erstelle. Hab mal die Level.tbm geöffnet und außer ein oaar textureinstellungen steht da nur kryptisches Zeug drin. Deshalb frage ich mich grade wie ich ausgerechnet einen Baum erstellen soll?!

FSA

Community-Fossil

  • Private Nachricht senden

15

09.02.2012, 18:04

Also tbm Dateien kannst du mit dem tribase Model converter machen. Und zwar aus 3DS Dateien. Noch eine Anmerkung: wenn die Kugel wirklich Rollen soll und Berge hinunterrollen soll dann empfehle ich dir eine Physikbibliothek;)

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

16

09.02.2012, 18:31

Ich vermute mal es geht weniger ums rollen der Kugel als ums kleben am Terrain was er möchte. Wie schon gesagt liegt der TriBase auch ein Konverter bei. Du kannst also einfach Blender oä benutzen um dir deine Modelle zu erstellen;) Steht aber soweit ich weiß auch was zu im Buch.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

17

09.02.2012, 19:47

Genau, hauptsache er klebt am Boden (also geht Steigungen auch mit hoch bzw runter).
Für der "Haus" (darf auch ein primitiver Block sein) konnte ich jettzt eines der Blockmodelle nehmen und es damit auf dem Feld beliebig platzieren.
Aber wie erstelle ich denn jetzt einen primitiven Baum (Zylinder mir Kugel oben drauf) am cleversten?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

18

09.02.2012, 20:17

Das musst du selbst wissen. Zum testen reichen ja irgendwelche Objekte für die Kollision. Ansonsteun setz dich mit Blender und co auseinander oder lad dir Modelle aus dem Internet.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

19

10.02.2012, 12:54

Okay, ich versuche jetzt die Baustellen Stück für Stück abzuarbeiten und würde mich freuen wenn ihr bereit wärt mir dabei zu helfen...

Ich habe jetzt manuell ein Objekt auf dem (Breakanoid) Feld platziert und ihm das Blockmodell gegeben. Also nicht einfach einen der Blöcke aktiviert.
Nun überlege ich wie ich die Kollisionabfrage am besten realisiere. Bounding-Boxes? Oder auch per Hand genau so wie es bei den "normalen" Blöcken gemacht wurde?

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
// Kollision mit den Blöcken berechnen
    for(DWORD dwBlock = 0; dwBlock < 64; dwBlock++)
    {
        if(m_pGame->m_aBlock[dwBlock].m_iEnergy > 0)
        {
            vBlock = m_pGame->m_aBlock[dwBlock].m_vPosition;
            
            // Befindet sich der Ball im Kollisionsbereich?
            if(m_vPosition.x + 0.25f >= vBlock.x - 1.0f &&
               m_vPosition.x - 0.25f <= vBlock.x + 1.0f &&
               m_vPosition.z + 0.25f >= vBlock.z - 0.5f &&
               m_vPosition.z - 0.25f <= vBlock.z + 0.5f)
            {
                // Zufälligen "Pling"-Sound abspielen
                iSound = tbIntRandom(8, 11);
                iBuffer = g_pBreakanoid->m_apSound[iSound]->PlayNextBuffer();
                if(iBuffer != -1)
                {
                    // Frequenz zufällig setzen
                    g_pBreakanoid->m_apSound[iSound]->SetFrequency(iBuffer, 44100 + tbIntRandom(-5000, 5000));
                }

                // Entfernung des Balls von allen Blockseiten berechnen
                fDistLeft = fabsf(m_vPosition.x + 0.25f - (vBlock.x - 1.0f));
                fDistRight = fabsf(m_vPosition.x - 0.25f - (vBlock.x + 1.0f));
                fDistTop = fabsf(m_vPosition.z - 0.25f - (vBlock.z + 0.5f));
                fDistBottom = fabsf(m_vPosition.z + 0.25f - (vBlock.z - 0.5f));

                // Minimale Distanz berechnen
                fMinDist = TB_MIN(fDistLeft, TB_MIN(fDistRight, TB_MIN(fDistTop, fDistBottom)));

                // Wenn die Distanz zur linken oder rechten Seite am kleinsten ist...
                if(fMinDist == fDistLeft || fMinDist == fDistRight)
                {
                    // Ball an der z-Achse abprallen lassen
                    m_vVelocity.x *= -1.0f;

                    // Dem Ball einen kleinen "Schubs" geben
                    if(fMinDist == fDistLeft) m_vPosition.x -= 0.1f;
                    else m_vPosition.x += 0.1f;
                }
                else
                {
                    // Ball an der x-Achse abprallen lassen
                    m_vVelocity.z *= -1.0f;

                    // Dem Ball einen kleinen "Schubs" geben
                    if(fMinDist == fDistTop) m_vPosition.z += 0.1f;
                    else m_vPosition.z -= 0.1f;
                }

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

20

10.02.2012, 13:27

Du musst überlegen was BoundingBoxes sind und wofür sie gut sind. Du benutzt ja zum Beispiel zur Zeit keine Bibliothek die so einen Test direkt unterstützt, also müsstest du ihn auch selbst umsetzen. Du würdest also um deinen Block eine Boundingbox ziehen. Mit dieser Box würdest du dann auf Kollision prüfen. Weiterhin könntest du die BoundingBox an den Achsen ausrichten, damit du die Berechnungen weiter vereinfachen könntest. Wie sähe denn dann der Code dazu in etwa aus, bzw was wäre der Unterschied zu dem was du gepostet hast?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige