Hilfe bei Code-Optimierung, Vereinfachung?
Übersicht

![]() |
Verge3000Betreff: Hilfe bei Code-Optimierung, Vereinfachung? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group