[gelöst] Speicherproblem mit Minispiel (verbraucht steigt)

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

SM3D

Betreff: [gelöst] Speicherproblem mit Minispiel (verbraucht steigt)

BeitragFr, Jun 01, 2012 22:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Grüße,

ich habe ein großes Problem mit meinem Spiel (dem Hanse Remake 2D im Retro Look). Und zwar gibt es dort folgendes:

- das Intro (Splashscreen) ein Bild wird anngezeigt, soweit ist auch alles Ok
- dann wird das Hauptmenü (Function MainMenu) aufgerufen und das Fenster mit der Schrift gezeichnet, hier hat das Programm schon ein Verbrauch von 35MB Oo
- wenn ich jetzt einen Menüpunkt aufrufe wird die entsprechende Function aufgerufen und das Fenster neugezeichnet für den gewünschten Eintrag (Neues Spiel, Spiel speichern, Spiel laden, Credits, History)

Bei allen Einträgen bis auf Credits wird kein weiterer Speicher verbraucht, da diese Fenster nur eine Textzeile derzeit enthalten. Bei den Credits wird beim aufruf schon 2 MB verbraucht (jdesmal wenn man den Eintrag Credits wählt), bei den anderen einträgen wird ebenfalls 2 MB verbraucht, jedoch erst wenn man mit ESC zurück zum Hauptmenü springt. Das ganze passiert immer wieder und der Verbrauch des Spieles steigt ins unermessliche rauf, ich war mit langen Tests schon bei über 100 MB im Taskmanger.

Ich finde den Fehler, die Ursche nicht, bzw. weiss nicht wie ich noch wieder Speicher frei geben kann, da es keine weiteren Befehle gibt. Die Bilder gebe ich wieder frei (hoffe mal korrekt). Jetzt weiss ich nicht was da noch so viel Speicher frisst. Ich denke aber mal das ich ein gravierenen Fehler gemacht haben muss bei meinem Aufbau, denn scheinbar scheint es so als würde das Spiel immer wieder die Fenster erneut in den Speicher schreiben, ohne das die alten frei gegeben werden.

Es könnte sein das ich ein schwerwiegenden Logikfehler gemacht habe, zugegeben es gibt sicher sauberere Lösungen für den Code, als wie meinen. Ich wäre dankbar wenn jemand von Euch mir helfen könnte wo ich da Mist verzapft habe. Das Menü wird natürlich noch mit der Case-Lösung umgesetzt, das war jetzt erst mal nur eine Testvariante.

Hier mal der Code:Code: [AUSKLAPPEN]
;======================================================================================
; Hanse Remake
; (C) 2012 by SM3D
;
; Ein Hanse remake des alten C64 Hanse
;
; Erstellt        : 24.04.2012 durch : SM3D
; Letzte Änderung : 01.05.2012 durch : SM3D
; Sprache         : BlitzBasic | IDE : Blitz3D | Version : 1.106
;
;======================================================================================
;
; UNITS (Blibliotheken)
; Include "LogUnit.BB"

; GLOBALE KONSTANTE UND VARIABLEN
  Global DebugMode = 1             ; DebugModus ein = 1 / aus = 0
; Global Logdatei                  ; Die Logdatei
  Global GameDate$ = "anno 1359"   ; Das Spiel (ingame) Datum
  Global PlayerNumbers% = 1        ; Die Anzahl der gesamten Spieler
  Global Player$ = "Neuer Spieler" ; Der aktuell aktive Spieler
  Global Version$ = "V0.1"         ; Spielversion

;======================================================================================
;
; MAIN

; INTRO
; Fenster erzeugen und Spiel starten
  Graphics 800, 600, 32, 2       
; Splash laden (original Splash.jpg)
  Splash = LoadImage ("Dat.001")
; Splash Transparenz
  MaskImage Splash, 255, 0, 0
; Backbuffer setzen
  SetBuffer BackBuffer()
; Bilder anzeigen
  DrawBlock Splash, 0, 0
; Tauscht die Bufferinhalte des Front- und Backbuffers     
  Flip
; Verzögerung 2 Sekunden
  Delay 1000                      ; <<<<< für die Entwicklung niedrig, oder deaktiviert
; Den Splash wieder aus dem Speicher löschen
  FreeImage Splash
; TEST
  Cls
; Hauptmenü aufrufen
  MainMenu()

;======================================================================================
; = PROGRAMM ENDE =
  FreeImage Splash
  FreeImage CreditsBG
  FreeImage Background
  End
;======================================================================================

;======================================================================================
; FUNKTIONEN

; HAUPTMENÜ
  Function MainMenu()
; Bildschirm löschen
  Cls
; Hintergundbild laden (original Background.jpg)
  Background = LoadImage ("Dat.002")
; Hintergrund zeichnen
  DrawBlock Background, 0, 0
; Backbuffer setzen
  SetBuffer BackBuffer()
; Solange keine Taste gedrückt wird das Menü anzeigen
  While Not KeyHit(1)
; Titelrahmen in Blau
  Color 0, 0, 255
  Rect 30,30,740,25,0
; Menübereichrahmen ebenfalls in Blau
  Rect 30,57,740,486,0
; Titel in weiss
  Color 255, 255, 255
  Text 50,35,"Hanse Remake Deluxe                @@@ Hauptmenü @@@                         "
; Spiel ingame Datum in Gelb zum Titel hinzufügen
  Color 255, 255, 0
  Text 680,35, GameDate$
; Version in gelb zum Titel hinzufügen
  Color 255, 255, 0
  Text 210,35, Version$
; Hinweis für den Spieler in Cyan
  Color 0, 255, 255
  Text 50,80,"Bitte wähle Deine gewünschte Option aus, indem Du die in den () stehenden Buchstaben"
  Text 50,100,"drückst."
; Aktueller Spieler anzeigen
  Text 50,140,"Spieler: "
  Color 255, 255, 0 ; <<< Gelb für den Spielernamen
  Text 120,140,Player$
; Menütext in Cyan 
  Color 0, 255, 255
; Menü
  Text 50,200,"Neues Spiel (N)"
  Text 50,220,"Spiel speichern (S)"
  Text 50,240,"Spiel laden (L)"
  Text 50,280,"Historie (H)"
  Text 50,300,"Credits (C)"
  Text 50,320,"Beenden (B)"
; Fussrahmen in Blau
  Color 0, 0, 255
  Rect 30,545,740,25,0
; Copyright in die Fusszeile in Weiss schreiben
  Color 255, 255, 255
  Text 50,550,"Copyrigt (C) 2012 by SM3D"

; Neues Spiel mit Taste (N)
If KeyDown(49) = True
     Text 50, 360, "Neues Spiel wurde gewählt..."
     ; Warten 2 Sekunden
     Delay 1000
     ; Hier später Neues Spiel Funktion aufrufen
     NewGame()
End If

; Spiel speichern mit Taste (S)
If KeyDown(31) = True
     Text 50, 360, "Spiel speichern wurde gewählt..."
     ; Warten 2 Sekunden
     Delay 1000
     ; Hier später Spiel speichern Funktion aufrufen
     SaveGame()
End If

; Spiel laden mit Taste (L)
If KeyDown(38) = True
     Text 50, 360, "Spiel laden wurde gewählt..."
     ; Warten 2 Sekunden
     Delay 1000
     ; Hier später Spiel laden Funktion aufrufen
     LoadGame()
End If

; Historie mit Taste (H)
If KeyDown(35) = True
     Text 50, 360, "Historie wurde gewählt..."
     ; Warten 2 Sekunden
     Delay 1000
     ; Hier später Historie Funktion aufrufen
     History()
End If

; Credits mit Taste (C)
If KeyDown(46) = True
     Text 50, 360, "Credits wurde gewählt..."
     ; Warten 2 Sekunden
     Delay 1000
     ; Hier später Credits Function aufrufen
     Credits()
End If

; Beenden mit Taste (B)
If KeyDown(48) = True
     Text 50, 360, "Beenden wurde gewählt... das Spiel wird beendet..."
     ; Warten 1 Sekunde
     Delay 1000
     ; Ende des Spieles
     End
End If

; Tauscht die Bufferinhalte des Front- und Backbuffers
  Flip
; Schleifen Ende fürs Menü 
  Wend
; Den Background wieder aus dem Speicher löschen
  FreeImage Background
; TEST
  Cls
; Hauptmenü Funktion Ende
End Function
;--------------------------------------------------------------------------------------
; NEUES SPIEL
Function NewGame()
  ; Bildschirm löschen
  Cls
  ; Solange keine Taste gedrückt wird das Menü anzeigen
  While Not KeyHit(1)
  ; Erst mal temporär 2 Sekunden Verzögerung, dann zurück zum Hauptmenü
  Text 50,50,"NewGame [ESC] zurück"
  ; Tauscht die Bufferinhalte des Front- und Backbuffers
  Flip
  ; While Schleife Ende
  Wend
; TEST
  Cls
  ; Hauptmenü wieder aufrufen
  MainMenu()
End Function

;--------------------------------------------------------------------------------------
; SPIEL SPEICHERN
Function SaveGame()
  ; Bildschirm löschen
  Cls
  ; Solange keine Taste gedrückt wird das Menü anzeigen
  While Not KeyHit(1)
  ; Erst mal temporär 2 Sekunden Verzögerung, dann zurück zum Hauptmenü
  Text 50,50,"SaveGame [ESC] zurück"
  ; Tauscht die Bufferinhalte des Front- und Backbuffers
  Flip
  ; While Schleife Ende
  Wend
; TEST
  Cls
  ; Hauptmenü wieder aufrufen
  MainMenu()
End Function

;--------------------------------------------------------------------------------------
; SPIEL LADEN
Function LoadGame()
  ; Bildschirm löschen
  Cls
  ; Solange keine Taste gedrückt wird das Menü anzeigen
  While Not KeyHit(1)
  ; Erst mal temporär 2 Sekunden Verzögerung, dann zurück zum Hauptmenü
  Text 50,50,"LoadGame [ESC] zurück"
  ; Tauscht die Bufferinhalte des Front- und Backbuffers
  Flip
  ; While Schleife Ende
  Wend
; TEST
  Cls
  ; Hauptmenü wieder aufrufen
  MainMenu()
End Function

;--------------------------------------------------------------------------------------
; SPIEL HISTORIE
Function History()
  ; Bildschirm löschen
  Cls
  ; Solange keine Taste gedrückt wird das Menü anzeigen
  While Not KeyHit(1)
  ; Erst mal temporär 2 Sekunden Verzögerung, dann zurück zum Hauptmenü
  Text 50,50,"History [ESC] zurück"
  ; Tauscht die Bufferinhalte des Front- und Backbuffers
  Flip
  ; While Schleife Ende
  Wend
; TEST
  Cls
  ; Hauptmenü wieder aufrufen
  MainMenu()
End Function

;--------------------------------------------------------------------------------------
; SPIEL CREDITS
Function Credits()
  ; Bildschirm löschen
  Cls
  ; Hintergrund laden (original CreditsBG.jpg)
  CreditsBG = LoadImage ("Dat.003")
  ; Bilder anzeigen
  DrawBlock CreditsBG, 0, 0
  ; Solange keine Taste gedrückt wird das Menü anzeigen
  While Not KeyHit(1)
  ; Titelrahmen in Blau
  Color 0, 0, 255
  Rect 30,30,740,540,0
  ; Textfarbe auf Gelb setzen
  Color 255, 255, 0
  ; Erst mal temporär 2 Sekunden Verzögerung, dann zurück zum Hauptmenü
  Text 50,70,"Credits"
  ; Textfarbe auf Cyan
  Color 0, 255, 255
  Text 50,110,"Dieses Spiel basiert auf dem original Spiel Hanse von Ralf"
  Text 50,130,"Glau und Bernd Westphal aus dem Jahr 1986."
  Text 50,170,"Es handelt sich hierbei um einen Nachbau (Remake) welches"
  Text 50,190,"in Blitz3D, BlitzBasic entwickelt wurde. Diese Version"
  Text 50,210,"ist bewusst im Retro-Look entwickelt wurden."
  Text 50,250,"Entwicklung: SM3D"
  Text 50,310,"Besonderer Dank geht an Mark Sibly für diese hervoragene"
  Text 50,330,"Programmiersprache. An Ralf Glau und Bernd Westphal für"
  Text 50,350,"das tolle Spiel Hanse."
  ; Textfarbe auf Gelb setzen
  Color 255, 255, 0
  Text 50,450,"Zurück zum Hauptmenü [ESC]"
  ; Tauscht die Bufferinhalte des Front- und Backbuffers
  Flip
  ; While Schleife Ende
  Wend
  ; Den CreditsBG wieder aus dem Speicher löschen
  FreeImage CreditsBG
; TEST
  Cls
  ; Hauptmenü wieder aufrufen
  MainMenu()
End Function

;======================================================================================
;
; ToDo:
;
; !!!WICHTIG!!! - Den enormen Speicherverbrauch analysieren und beheben.
; Erklärung: Jedes mal wenn eine der Funktionen aufgerufen wird und das entsprechende
;            Fenster neu gezeichent wir und man dann mit [ESC] wieder zurück springt
;            ins Hauptmenü steigt der Speicherverbrauch im Task-Manager um ca. 2 MB
;

; - NEUES SPIEL
; - SPIEL SPEICHERN
; - SPIEL LADEN
; - HISTORY
;
; SPIEL
;
;======================================================================================


Dieser Code lässt sich so per Copy & Paste übernehmen, lediglich die Bilder müsten ersetzt werden. Ich würde auch die Exe (1,3 MB), den Quellcode (10 KB) und die drei benötigten Dateien (ca. 250 KB) hier hochladen, weiss jedoch nicht ob das geht. Ansonsten kann ich das Archiv auch gerne per Mail zur Verfügung stellen.

Wie sieht man bei der gestarteten Exe was gemeint ist?
Startet die Game.exe, macht den Taskmanger auf, sucht Euch die Game.exe, markiert diese einmal mit Linksklick, wechselt dann auf das Spiel zurück. Benutzt die Menüeinträge und verfolgt im Task-Manager den steigenden Verbrauch des Spieles. Mir ist unerklärlich wie so ein winziges Spiel so viel verbrauchen kann.

Für Fragen stehe ich Euch gerne offen.

Details:
Programmiersprache / IDE : Blitz3D 1.106
Mein OS : Windows 7 64Bit (auf beiden PC's)

MfG SM3D
  • Zuletzt bearbeitet von SM3D am Sa, Jun 02, 2012 1:25, insgesamt einmal bearbeitet
 

Seven

BeitragFr, Jun 01, 2012 22:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ganz einfach; Du hast den bösen Fehler begangen und ein Bild in der Funktion "MainMenu"
geladen. Das Bild wird immer wieder beim Aufruf der Funktion geladen und landet im RAM.

Man läd keine Bilder in Schleifen^^

Eingeproggt

BeitragFr, Jun 01, 2012 22:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Puh, der Code war nicht einfach zu verstehen. Trotz der exzessiven Verwendung von Kommentaren is die Geschichte sehr unübersichtlich. Was Seven da schreibt stimmt im Prinzip. Dass es sich um eine "Schleife" handelt in der du deine Bilder lädst muss man erstmal erkennen. Es ist mehr eine Art "Endlos-Rekursion". Da du aus der MainMenu jedesmal eine Funktion aufrufst und in der erneut das MainMenu. Könnte sein dass dir Return schon weiter hilft bei der Umstrukturierung des Programms. (Aus den "Hilfsfunktionen" einfach "rausspringen" anstatt jedesmal das MainMenu aufzurufen).

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

SM3D

BeitragFr, Jun 01, 2012 22:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe den Fehler nun doch gefunden und behoben, jedoch bleibt ein Grundverbrauch von 40MB was ich viel zu hoch finde für so ein winziges Spiel, aber erst mal egal.

Die Lösung:
- Drei globale Variablen für die drei Bilder gesetzt
- Das laden der Bilder aus den Funstionen herausgenommen und oben im Splashscreen eingefügt

Kann also wenn gewollt gerne gelöscht werden, kann es leider nicht selber. Es sei denn Ihr habt Verbesserungstipps für meinen Code.

>>> Nachtrag : Ja Danke genau was Ihr schreibt habe ich auch bemerkt beim erneuten lesen und testen des Codes. Das mit dem Return werde ich gerne mal antesten, bzw. die Codestruktur versuchen besser aufzubauen.

Jetzt bleibt nur noch die Frage warum das gestartete Spiel ganze 35MB verbrät, für was ? :) Das spiel beinhalten 3 Bilder von je 50-160 KB die und ein wenig Text + die Rahmen.

MfG SM3D
 

Seven

BeitragFr, Jun 01, 2012 23:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Also an sich ist es immer gut zu kommentieren, aber hier ist das schon massig.
Für Aussenstehende ist der Code nun schwer zu überblicken, weil eben alles
kommentiert wurde und man nicht sofort sehen kann, wo das wesentliche
gemacht wird.

Ansonsten würde ich noch mal darüber nachdenken MainMenu() als Funktion beizubelassen.
Für gewöhnlich hat man die Hauptschleife (in dem Fall ist das MainMenu() ) und baut sie dann
größtenteils mit Funktionen aus.

Zum EDIT: 12 MB kann man für BlitzBasic an sich abziehen.
Der Rest... gehörte zu deinen Änderungen dazu, dass du das Laden des
Bildes in "Credits" unterbindest?

EDIT: Guuut, ich habe dein Programm nun laufen lassen und muss sagen, dass ich keine 35 MB bekomme,
also nehme ich an, dass du noch irgendwo Bilder in Funktionen hast.
  • Zuletzt bearbeitet von Seven am Fr, Jun 01, 2012 23:22, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragFr, Jun 01, 2012 23:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Kommentare sind ja nicht falsch, aber...
Code: [AUSKLAPPEN]
; Tauscht die Bufferinhalte des Front- und Backbuffers
Flip
; While Schleife Ende
Wend
Ist das wirklich nötig? Was ein Befehl macht, ist jedem klar, der den Code liest. Warum man etwas bestimmtes macht, wäre viel interessanter.

Du kannst wunderbar mit einer Hauptschleife mit 1x Cls, Waittimer und Flip auskommen, wenn du den Programmteil mit einem Select Case Konstrukt ansteuerst:

BlitzBasic: [AUSKLAPPEN]
Const KEY_ESC=1

Const GS_Menu=1, GS_Play=2, GS_HighScore=3
Global GameState=GS_Menu

;* 60 Bilder die Sekunde sind mehr als genug:
Local FrameTimer=CreateTimer(60)

Repeat
Cls

Select GameState
Case GS_Menu: Menu()
Case GS_Play: Play()
Case GS_HighScore: HighScore()
End Select

WaitTimer(FrameTimer)
Flip(0)
Until KeyHit(KEY_ESC)
Konstanten helfen auch, die Übersicht zu behalten.
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)

SM3D

BeitragFr, Jun 01, 2012 23:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Also jetzt hat und behält es konsequent 35 MB was ich für das bischen Programm immer noch für zu hoch halte.

Die hochtickenden 2MB waren aus den fehlerhaft gesetzten Bildladevorgängen in den Functionen. Dadurch kam es nach längeren switschen zwischen den Menüpunkten schnell zu 50-100 MB und mehr.

Den Credits Hintergrund habe ich nicht unterbunden.

Hier der Code mit weniger Kommentaren und den behobenen Fehlern
Code: [AUSKLAPPEN]

;
; UNITS (Blibliotheken)
; Include "LogUnit.BB"

; GLOBALE KONSTANTE UND VARIABLEN
  Global DebugMode = 1             ; DebugModus ein = 1 / aus = 0
; Global Logdatei                  ; Die Logdatei
  Global GameDate$ = "anno 1359"   ; Das Spiel (ingame) Datum
  Global PlayerNumbers% = 1        ; Die Anzahl der gesamten Spieler
  Global Player$ = "Neuer Spieler" ; Der aktuell aktive Spieler
  Global Version$ = "V0.1"         ; Spielversion
  Global Background                ; Hintergrund vom Hauptmenu
  Global CreditsBG                 ; Hintergrund vom Creditsfenster
  Global Splash                    ; Der Splashscreen

;======================================================================================
;
; MAIN

; INTRO
  Graphics 800, 600, 32, 2       
  Splash = LoadImage ("Dat.001")
  Background = LoadImage ("Dat.002")
  CreditsBG = LoadImage ("Dat.003")
  MaskImage Splash, 255, 0, 0
  SetBuffer BackBuffer()
  DrawBlock Splash, 0, 0
  Flip
  Delay 1000                      ; <<<<< für die Entwicklung niedrig, oder deaktiviert
  FreeImage Splash
  MainMenu()

; = PROGRAMM ENDE =
  FreeImage Splash
  FreeImage CreditsBG
  FreeImage Background
  End

; FUNKTIONEN

; HAUPTMENÜ
  Function MainMenu()
  Cls
  DrawBlock Background, 0, 0
  SetBuffer BackBuffer()
  While Not KeyHit(1)
  Color 0, 0, 255
  Rect 30,30,740,25,0
  Rect 30,57,740,486,0
  Color 255, 255, 255
  Text 50,35,"Hanse Remake Deluxe                @@@ Hauptmenü @@@                         "
  Color 255, 255, 0
  Text 680,35, GameDate$
  Color 255, 255, 0
  Text 210,35, Version$
  Color 0, 255, 255
  Text 50,80,"Bitte wähle Deine gewünschte Option aus, indem Du die in den () stehenden Buchstaben"
  Text 50,100,"drückst."
  Text 50,140,"Spieler: "
  Color 255, 255, 0 ; <<< Gelb für den Spielernamen
  Text 120,140,Player$
  Color 0, 255, 255
  Text 50,200,"Neues Spiel (N)"
  Text 50,220,"Spiel speichern (S)"
  Text 50,240,"Spiel laden (L)"
  Text 50,280,"Historie (H)"
  Text 50,300,"Credits (C)"
  Text 50,320,"Beenden (B)"
  Color 0, 0, 255
  Rect 30,545,740,25,0
  Color 255, 255, 255
  Text 50,550,"Copyrigt (C) 2012 by SM3D"

; Neues Spiel mit Taste (N)
If KeyDown(49) = True
     Text 50, 360, "Neues Spiel wurde gewählt..."
     Delay 1000
     NewGame()
End If

; Spiel speichern mit Taste (S)
If KeyDown(31) = True
     Text 50, 360, "Spiel speichern wurde gewählt..."
     Delay 1000
     SaveGame()
End If

; Spiel laden mit Taste (L)
If KeyDown(38) = True
     Text 50, 360, "Spiel laden wurde gewählt..."
     Delay 1000
     LoadGame()
End If

; Historie mit Taste (H)
If KeyDown(35) = True
     Text 50, 360, "Historie wurde gewählt..."
     Delay 1000
     History()
End If

; Credits mit Taste (C)
If KeyDown(46) = True
     Text 50, 360, "Credits wurde gewählt..."
     Delay 1000
     Credits()
End If

; Beenden mit Taste (B)
If KeyDown(48) = True
     Text 50, 360, "Beenden wurde gewählt... das Spiel wird beendet..."
     Delay 1000
     End
End If

  Flip
  Wend
End Function

; NEUES SPIEL
Function NewGame()
  Cls
  While Not KeyHit(1)
  Text 50,50,"NewGame [ESC] zurück"
  Flip
  Wend
  MainMenu()
End Function

; SPIEL SPEICHERN
Function SaveGame()
  Cls
  While Not KeyHit(1)
  Text 50,50,"SaveGame [ESC] zurück"
  Flip
  Wend
  MainMenu()
End Function

; SPIEL LADEN
Function LoadGame()
  Cls
  While Not KeyHit(1)
  Text 50,50,"LoadGame [ESC] zurück"
  Flip
  Wend
  MainMenu()
End Function

; SPIEL HISTORIE
Function History()
  Cls
  While Not KeyHit(1)
  Text 50,50,"History [ESC] zurück"
  Flip
  Wend
  MainMenu()
End Function

; SPIEL CREDITS
Function Credits()
  Cls
  DrawBlock CreditsBG, 0, 0
  While Not KeyHit(1)
  Color 0, 0, 255
  Rect 30,30,740,540,0
  Color 255, 255, 0
  Text 50,70,"Credits"
  Color 0, 255, 255
  Text 50,110,"Dieses Spiel basiert auf dem original Spiel Hanse von Ralf"
  Text 50,130,"Glau und Bernd Westphal aus dem Jahr 1986."
  Text 50,170,"Es handelt sich hierbei um einen Nachbau (Remake) welches"
  Text 50,190,"in Blitz3D, BlitzBasic entwickelt wurde. Diese Version"
  Text 50,210,"ist bewusst im Retro-Look entwickelt wurden."
  Text 50,250,"Entwicklung: SM3D"
  Text 50,310,"Besonderer Dank geht an Mark Sibly für diese hervoragene"
  Text 50,330,"Programmiersprache. An Ralf Glau und Bernd Westphal für"
  Text 50,350,"das tolle Spiel Hanse."
  Color 255, 255, 0
  Text 50,450,"Zurück zum Hauptmenü [ESC]"
  Flip
  Wend
  MainMenu()
End Function


MfG SM3D
 

Seven

BeitragFr, Jun 01, 2012 23:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Das kann ich nicht ganz nachvollziehen. Ich bekomme nämlich blos ca. 14 MB mit deinem neuen Code
und ich habe alle Menüpunkte durchgewählt, wobei ich natührlich andere Bilder habe^^

Xeres

Moderator

BeitragFr, Jun 01, 2012 23:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Menü fliegt dir irgendwann um die Ohren, da du immer nur neue Funktionen aufrufst, die alten aber nie wieder verlässt.
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)

skey-z

BeitragSa, Jun 02, 2012 0:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Nur mal ein Tipp zur strukturierung, ohne das ganze jetzt durchgelesen zu haben:

BlitzBasic: [AUSKLAPPEN]

;Header
;Angaben

;Includes
Include "*.bb"

;Konstante Inhalte
Const cEND% = 0
Const cSPLASH% = 1
Const cMENU% = 2
Const cGAME% = 3

;Globale Inhalte
Global gamestatge% = cSPLASH

While gameState <> cEND

Select gameState
Case cSPLASH
Splash()
Case cMENU
Menu()
Case cGAME
Game()
End Select
Wend

;folgender Code kann auch in Includes ausgelagert werden und mit 'Include "include/Dateiname.bb"' eingebunden werden

Function Splash()
Local tempState

;Dateien laden
img% = LoadImage("gfx/splash.jpg")

While tempState = gameState
Wend

;Dateien löschen
FreeImage(img)
End Function

Function Menu()
End Function

Function Game()
End Function


Somit kannst du auch die Hauptdatei klein halten und die Übersichtlichkeit verbessern.

Wobei bei heutigen Rechnern 35-40MB keine Probleme bereiten und gerade einmal 1,0-0,5% des Speichers ausmachen
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

SM3D

BeitragSa, Jun 02, 2012 0:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja die Codestrukturierung ist Mist, ich weiss, aber bei mir ergibt sich immer Chaos wenn das nicht will, ich bastel schon 2-3 Tage rum, weil ich nicht auf den Fehler gekommen war. Jedoch hätte ich gleich zu Beginn die Case Variante nehmen sollen.

Wieso beende ich die Functionen nicht ? Wenn ich die mit ESC verlassen springt der doch raus, oder seh ich da etwas falsch?

Und zu den MB, auf meinem großen PC hat die Exe im Taskmanager komischer Weise zu Beginn auch nur 12 MB. Hier auf dem Notebook wie gesagt 35 MB.

Die Bilder die ich original nutze sind :

- Splash.jpg ( 130 KB )
- CreditsBG.jpg (160 KB )
- Background.jpg ( 50 KB )

Das mit dem GameStat finde ich eine gute Idee kenne ich so auch von C++ her. Und ja ich stimme zu das ist a) übersichtlicher b) kompackter. Gestehe ich bin ein schlechter Codedesigner :(. Ich werde das mal umbauen.

Hier mal die Screens :
user posted imageuser posted imageuser posted image

und hier die verwendeten Grafiken:
user posted imageuser posted imageuser posted image

MfG SM3D
  • Zuletzt bearbeitet von SM3D am Sa, Jun 02, 2012 1:22, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragSa, Jun 02, 2012 0:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Funktion erreicht nie ihr Ende oder Return, stattdessen rufst du eine neue Instanz von MainMenu() auf (die ihrerseits nie zu einem Ende kommt).

3 Bilder, a 800x600, mit 4 byte pro Pixel
=3x800x600x4 = ~5,5 MB im Speicher.
Wie groß (oder klein) die Bilder komprimiert gespeichert werden, ist an der Stelle egal.
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)

SM3D

BeitragSa, Jun 02, 2012 0:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Das erklärt einiges, Danke Dir.

Das heisst hier ist maßgebend wie das Bild verarbeitet wird, nicht wie es für den Benutzer auf der Platte liegt, das hab ich natürlich völlig übersehen.

MfG

ps. Wäre dann gelöst, Danke Euch allen für die prompte Hilfe

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group