Hilfe bei Code-Optimierung, Vereinfachung?

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Verge3000

Betreff: Hilfe bei Code-Optimierung, Vereinfachung?

BeitragSo, Aug 05, 2007 16:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich bin ja derzeit nun an einem Adventure-Projekt, dass auf vorgerenderten 2D Hintergründen und 3D Figuren darauf basiert. Halt ähnlich wie Monkey Island 4 oder Grim Fandango. Was dazugehören soll sind natürlich Cutscenes in InGame-Grafik, wo die Charaktere sich bewegen, Dialoge führen, etc. Und genau bei diesen Cutscenes hänge ich gerade. Ich habe hier in meinem Code eine Funktion intro(), in der zum gegebenen Zeitpunkt schon folgendes passiert:

- Die Spielerfigur läuft in den Bildschirmbereich
- Dann redet die Spielerfigur etwas
- Dann läuft sie noch näher an den Bildschirm heran
- Dann redet sie nochmal einen Satz

Schön und gut, läuft auch schon so, allerdings habe ich das Gefühl, dass ich das alles sehr umständlich programmiert habe und ich denke, dass muss doch irgendwie auch einfacher gehen, ohne diese ganzen ewigen IF Verschachtelungen und und. Größtes Problem hierbei ist, dass es Aktionen gibt, die länger ausgeführt werden sollen, wie z.B. das Laufen der Figur und Aktionen die nur einmal ausgeführt werden sollen, wie z.B. eine Reden-Animation.

Hier erstmal mein Code, wichtiger Teil ist hierbei die intro-Funkion:

Code: [AUSKLAPPEN]
;Funktion :: Animation Spielfigur "STEHEN"
Function animation_actor_stehen()
   
   If (stehen) = 1 Then
      stehen = 0
      BASS_SampleStop(sound_laufen)
      AnimateMD2 model_actor,1,0.2,0,39,0
   End If
   
   If (stehen) = 2 Then
      BASS_SampleStop(sound_laufen)
      AnimateMD2 model_actor,1,0.2,0,39,0
   End If
   
End Function

;Funktion :: Animation Spielfigur "LAUFEN"
Function animation_actor_laufen()
   
   If (laufen) = 1 Then
      laufen = 0
      sound_laufen=BASS_SampleLoad(0,"sounds/laufen.ogg",0,0,1,BASS_SAMPLE_LOOP)
      BASS_SamplePlay(sound_laufen)
      BASS_ChannelSetAttributes(sound_laufen,0,20,0)
      AnimateMD2 model_actor,1,0.1,40,45,0
   End If
   
End Function

;Funktion :: Intro
Function intro()
   
   If (pause) = 1 Then
      pause = 2
      wartezeit = MilliSecs()
   End If
   
   If (pause) = 2 Then
   
      If MilliSecs() > wartezeit + 2000
         
         If (intro_aktiv) = 1
         
            animation_actor_laufen()
            If EntityX(model_actor) > 10
               MoveEntity model_actor,0,0,0.2
            Else
               intro_aktiv = 2
               stehen = 1
               animation_actor_stehen()
               TurnEntity model_actor,0,68,0
               pause = 3
            End If
            
         End If
         
      End If
      
   End If
   
   If (pause) = 3 Then
      pause = 4
      wartezeit = MilliSecs()
   End If
   
   If (pause) = 4 Then
      
      If MilliSecs() > wartezeit + 1000
         
         If (intro_aktiv) = 2
            sound_intro_satz1=BASS_SampleLoad(0,"sounds/intro_satz1.ogg",0,0,1,BASS_SAMPLE_AUTOFREE)
            BASS_SamplePlay(sound_intro_satz1)
            BASS_ChannelSetAttributes(sound_intro_satz1,0,40,0)
            AnimateMD2 model_actor,3,0.1,72,83,0
            intro_aktiv = 3
         End If
         
         If (intro_aktiv) = 3
            
            If Not MD2Animating(model_actor)
               intro_aktiv = 4
               sound_intro_satz2=BASS_SampleLoad(0,"sounds/intro_satz2.ogg",0,0,1,BASS_SAMPLE_AUTOFREE)
               BASS_SamplePlay(sound_intro_satz2)
               BASS_ChannelSetAttributes(sound_intro_satz2,0,40,0)
               AnimateMD2 model_actor,1,0.05,84,112,0
            End If
            
         End If
         
         If (intro_aktiv) = 4
            
            If BASS_ChannelIsActive(sound_intro_satz2) = 0
               If (zwischen) = 1
                  zwischen = 2
                  laufen = 1
                  animation_actor_laufen()
               End If
               If EntityZ(model_actor) > -1.5
                  MoveEntity model_actor,0,0,0.2
               Else
                  intro_aktiv = 5
                  BASS_SampleStop(sound_laufen)
                  sound_intro_satz3=BASS_SampleLoad(0,"sounds/intro_satz3.ogg",0,0,1,BASS_SAMPLE_AUTOFREE)
                  BASS_SamplePlay(sound_intro_satz3)
                  BASS_ChannelSetAttributes(sound_intro_satz3,0,40,0)
                  AnimateMD2 model_actor,1,0.05,84,112,0
               End If
            End If
            
         End If
         
      End If
      
   End If
   
   If (intro_aktiv) = 5
      
      If BASS_ChannelIsActive(sound_intro_satz3) = 0
         pause = 5
         intro_aktiv = 6
      End If
      
   End If
   
   If (pause) = 5 Then
      pause = 6
      wartezeit = MilliSecs()
   End If
   
   If (pause) = 6 Then
      
      If MilliSecs() > wartezeit + 500
         
         If (zwischen) = 2
            zwischen = 3
            sound_intro_satz4=BASS_SampleLoad(0,"sounds/intro_satz4.ogg",0,0,1,BASS_SAMPLE_AUTOFREE)
            BASS_SamplePlay(sound_intro_satz4)
            BASS_ChannelSetAttributes(sound_intro_satz4,0,40,0)
         End If
         
         If BASS_ChannelIsActive(sound_intro_satz4) = 0
            pause = 7
            stehen = 1
            animation_actor_stehen()
            intro_aktiv = 0
         End If
         
      End If
      
   End If
   
End Function

;Hauptschleife
While Not KeyHit(1)
   
   If (intro_aktiv) <> 0
      intro()
   End If
   
   If (intro_aktiv) = 0
      steuerung_actor()
   End If
   
   ;Kamera aktualisieren, um Hintergrundbild stetig anzuzeigen
   CameraClsMode kamera,0,1
   DrawImage bg_intro,0,0
   
   ;Spielwelt updaten
   UpdateWorld
   RenderWorld
   
   ;Text anzeigen
   ;Text 0,110,EntityX(model_actor)
   ;Text 0,130,EntityY(model_actor)
   ;Text 0,150,EntityZ(model_actor)
   
   ;Cutscene-Balken 16:9 stetig einblenden
   If (cutscene_balken) = 1
      Color 0,0,0
      For i = 0 To GraphicsHeight()/6
         Line 0,i,GraphicsWidth(),i
      Next
      For i = (GraphicsHeight()/6)*5 To GraphicsHeight()
         Line 0,i,GraphicsWidth(),i
      Next
      Color 255,255,255
   End If
   
   ;Grafiken updaten
   Flip

Wend


Wie man hier sieht verwende ich permanent Variablen um bestimmte Dinge zu stoppen und nicht immer wieder ausführen zu lassen, alles ist sehr verschachtelt und wenn die Figur von einem Punkt zum anderen bewegt wird so habe ich das in IF-Bedingungen drin, laufe solange die Koordinaten der Figur noch kleiner als der Wert sind.

Meine Frage an euch, wie könnte ich das vereinfachen, es ist extrem schwierig so längere Abläufe zu gestalten und man verliert schnell den Überblick. Ich hatte schonmal daran gedacht diverse Abläufe in Funktionen zu packen, denen bestimmte Werte geliefert werden. Z.B. eine Laufen-Funktion, in der die Koordinaten mitgegeben werden, bis wo die Figur laufen soll und so, aber ich weiss nicht wirklich ob das DIE Lösung ist.

Wäre nett wenn da mal jemand drüberschauen und mir bei einer Vereinfachung dieses Codes helfen könnte. Gerne könnt ihr mich auch per PM oder Instant-Messenger kontaktieren, da kann man vielleicht auch mal ausführlicher über mein Problem reden.
Woher soll ich wissen was ich denke, bevor ich höre was ich sage?

Abrexxes

BeitragSo, Aug 05, 2007 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Meine Tipps. Sound nur einmal laden, das spart Zeit.

Dann:

Code: [AUSKLAPPEN]

If (pause) = 1 Then
      pause = 2
      wartezeit = MilliSecs()
   End If


Kannst du auch:
Code: [AUSKLAPPEN]

If (pause) = 1 pause = 2 : wartezeit = MilliSecs ()


Das macht alles kürzer. Und keine Angst vor IF, IF ist sehr schnell.

cu

Xeres

Moderator

BeitragSo, Aug 05, 2007 18:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Ich hatte schonmal daran gedacht diverse Abläufe in Funktionen zu packen, denen bestimmte Werte geliefert werden. Z.B. eine Laufen-Funktion, in der die Koordinaten mitgegeben werden, bis wo die Figur laufen soll und so, aber ich weiss nicht wirklich ob das DIE Lösung ist.
... Das und alle Spielinformationen aus einem Script laden die dann nur noch die Funktionen ausführen.
Bastel dir erst ein Grundgerüst aus einer Skriptsprache/Level/Umgebungseditor. Dann kannst du anfangen das eigentliche Adventure Umzusetzten - vermutlich wirst du dabei noch viele Sachen hinzufügen oder ändern.
Schlussendlich ist das aber die Beste Methode, denn du kannst dann mit der fertigen "Engine" das Spiel ändern, ohne tausend Zeilen Quellcode umzubauen. Den Faktor "Übersichtlichkeit" sollte man auch nicht außer acht lassen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group