BPS #12: Speichern & Laden - Auswertung

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Xeres

Moderator

Betreff: BPS #12: Speichern & Laden - Auswertung

BeitragSo, Sep 18, 2011 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Na, dann zeigt doch mal, was ihr so geschafft habt!

Das war die Aufgabe

Postet hier eure Ergebnisse, Codes, Gedanken. Lernt von den anderen, seht euch deren Quelltext an und versucht euren eigenen zu verbessern.

Diskussion
Postet zu euren Codes stets eine kurze Erklärung mit euren Gedanken in denen ihr simpel gesagt die Frage "Wieso habe ich XY auf diese Art gelöst?" beantwortet. Beiträge, die nur den Code enthalten werden wir aus dem Thread entfernen.

Nächste Aufgabe
In zwei Wochen, wird die Musterlösung nach editiert und die nächste Aufgabe eingestellt.

Viel Spaß & viel Erfolg!

Musterlösung:
BlitzMax: [AUSKLAPPEN]
SuperStrict
'* Die Variablen werden mit den Standardwerten initialisiert
Local gfx_w:Int = 512, gfx_h:Int = 512
Local color_R:Int = 0, color_G:Int = 128, color_B:Int = 0

'* Falls der Speicherstand existiert...
If FileType("optionen.save")=1 Then
Local FileStream:TStream = OpenFile("optionen.save")
'* ...wird die Datei geöffnet, und ausgelesen
color_R = FileStream.ReadInt()
color_G = FileStream.ReadInt()
color_B = FileStream.ReadInt()
FileStream.Close()
'* nicht vergessen Dateien zu schließen!
EndIf
'* Die Variablen enthalten nun entweder die Standardwerte ODER die geladenen.

Graphics(gfx_w, gfx_h)
Local FrameTimer:TTimer = TTimer.Create(60)
SetClsColor(color_R, color_G, color_B)
SetColor(0, 0, 0)

Repeat
Cls

'* Mit den Tasten Q/A, W/S, E/D lässt sich die Hintergrundfarbe ändern.
'* Mod wird hier benutzt, um die Variablen auf Werte zwischen null und 255 zu begrenzen
If KeyDown(KEY_Q) Then color_R = (color_R + 2 + 256) Mod 256
If KeyDown(KEY_A) Then color_R = (color_R - 2 + 256) Mod 256
If KeyDown(KEY_W) Then color_G = (color_G + 2 + 256) Mod 256
If KeyDown(KEY_S) Then color_G = (color_G - 2 + 256) Mod 256
If KeyDown(KEY_E) Then color_B = (color_B + 2 + 256) Mod 256
If KeyDown(KEY_D) Then color_B = (color_B - 2 + 256) Mod 256
SetClsColor(color_R, color_G, color_B)

SetColor(0, 0, 0)
DrawRect((gfx_w / 2) - 64, (gfx_h / 2) - 16, 128, 32)
SetColor(255, 255, 255)
DrawText(color_R + ", " + color_G + ", " + color_B, (gfx_w / 2) - 50, (gfx_h / 2) - 8)

Flip(0)
FrameTimer.wait()
Until KeyHit(KEY_ESCAPE) Or AppTerminate()

'* Bevor das Programm beendet wird, speichern wir die Variablen-Werte:
'* Writefile wird eine neue Datei erstellen:
Local FileStream:TStream = WriteFile("optionen.save")
'* Auf die richtige Reihenfolge beim Speichern achten!
FileStream.WriteInt(color_R)
FileStream.WriteInt(color_G)
FileStream.WriteInt(color_B)
'* Und wieder: Nicht vergessen ordentlich zu schliessen:
FileStream.Close()

'* Nach dem Speichern kann beendet werden.
End
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)
  • Zuletzt bearbeitet von Xeres am Mo, Okt 03, 2011 11:32, insgesamt 2-mal bearbeitet

skey-z

BeitragMo, Sep 19, 2011 20:15
Antworten mit Zitat
Benutzer-Profile anzeigen
So, dann mache ich mal den Anfang, folgender Code funktioniert zwar, aber so ganz zufrieden bin ich damit noch nicht.

Es werden 3 Slider für die Farben rot, grün und blau erstellt, diese lassen sich per Maus verschieben.
Wenn ein Slider verändert wird, wird die veränderte Farbe in einem Array geändert und in der Hauptschleife wird der neue CLS-Wert eingestellt.

Beim laden wird die datei color.cfg gesucht, ist diese nicht vorhanden, werden alle werte auf 128 voreingestellt, beim schließen werden die Werte in die vorgenannte Datei gespeichert.

BlitzMax: [AUSKLAPPEN]


Rem
BPS#12 - Speichern & Laden
skey-z
EndRem


'Saubere Programmierung
SuperStrict

'Einstellungen
Local width:Int = 800
Local height:Int = 600
Local timer:TTimer = CreateTimer(60)


'Programmeinstellungen
Local quit:Byte = False
Local index:Int = False
Local colors:String[] = ["red", "green", "blue"]
Local color:Int[] = [128, 128, 128]
Local path:String = "color.cfg"

'Eingabeabfrage
Local kh_esc:Byte 'Beenden
Local kh_spc:Byte 'Zufallsfarbe
Local kh_ret:Byte 'Farbe einstellen

Local mx:Int, my:Int 'Mausposition
Local mh1:Byte, md1:Byte 'linke Maustaste

'Fenster erstellen
Graphics width, height

'GUI_erstellen
For Local i:Int = 0 To 2
TSlider.Create(colors[i], 5, 5+(i*30))
Next

'Hintergrundfarben laden
Local file:TStream = ReadStream(path)

If file Then
For Local slider:TSlider = EachIn TSlider._list

For Local i:Int = 0 To 2
If colors[i] = slider._name Then
color[i] = ReadInt(file)
slider._value = color[i]
EndIf
Next
Next
CloseFile(file)
EndIf

'Hauptschleife
While Not quit

'Einheitliche Framerate
Local ticks:Int = WaitTimer(timer)


'Eingabe abfangen
kh_esc = KeyHit(KEY_ESCAPE)
kh_spc = KeyHit(KEY_SPACE)

mx = MouseX()
my = MouseY()
mh1 = MouseHit(1)
md1 = MouseDown(1)


'Eingabe verarbeiten
If kh_esc Or AppTerminate() Then quit = True


'Programm aktualisieren
If mh1 Or md1 Then
For Local slider:TSlider = EachIn TSlider._list
If (slider._x < mx) And (mx < (slider._x+slider._w)) Then
If (slider._y < my) And (my < (slider._y+slider._h)) Then

Local value:Int = mx - slider._x
slider.Update(value)

For Local i:Int = 0 To 2

If slider._name = colors[i] Then
color[i] = slider._value
EndIf

Next
EndIf
EndIf
Next
EndIf

'Hintergrundfarbe setzen
SetClsColor(color[0], color[1], color[2])

'Zeichnen
TSlider.Draw()

'Bildschirm aktualisieren
Flip 0
Cls
Wend

SaveColor(path, color)

TSlider.DeleteAll()

'Hintergrundfarbe von Datei laden und als Array zurück geben
Function LoadColor:Int[](path:String)

Local file:TStream = ReadStream(path)
Local color:Int[3]

If file Then
color[0] = ReadInt(file)
color[1] = ReadInt(file)
color[2] = ReadInt(file)
CloseStream(file)

Return color
Else
EndIf
End Function

'Hintergrundfarbe in Datei speichern
Function SaveColor(path:String, rgb:Int[])

Local file:TStream = WriteStream(path)

If Not file Then
Notify("Datei '" + path+ "' konnte nicht erstellt werden")
Else
WriteInt file, rgb[0]
WriteInt file, rgb[1]
WriteInt file, rgb[2]
CloseStream(file)
EndIf

End Function

Type TSlider

'Wertemaximum
Const _range:Int = 256

'Liste
Global _list:TList = CreateList()
Field _link:TLink

'Eigenschaften
Field _x:Int
Field _y:Int
Field _w:Int
Field _h:Int
Field _name:String
Field _value:Int

'Konstruktor
Method New()
_link = _list.addlast(Self)
End Method

'Destruktor
Method Destroy()
_link.Remove()
End Method


'Aktualisieren
Method Update(value:Int)

If value < _range Then
_value = value
EndIf

End Method


'Erstellen
Function Create:TSlider(name:String, x:Int, y:Int, w:Int=255, h:Int=25)

Local slider:TSlider = New TSlider
slider._x = x
slider._y = y
slider._w = w
slider._h = h
slider._name = name
slider._value = 128

Return slider
End Function


'Malen
Function Draw:Int()

For Local slider:TSlider = EachIn TSlider._list

'Slider Hintergrund
SetColor(128, 128, 128)
DrawRect slider._x-1, slider._y-1, slider._w+2, slider._h+2

'Slider Balken
SetColor(GetColor(slider._name, "red"), GetColor(slider._name, "green"), GetColor(slider._name, "blue"))
DrawRect slider._x, slider._y, slider._value, slider._h

'Slider Wert
SetColor(255, 255, 255)
DrawText slider._value, (slider._x+(slider._w/2)-TextWidth(slider._value)/2), (slider._y+(slider._h/2)-TextHeight(slider._value)/2)
Next
End Function

'Löschen
Function DeleteAll:Int()
For Local slider:Tslider = EachIn TSlider._list
slider.Destroy()
Next
End Function
End Type


'Separate Funktionen

Function GetColor:Int(color:String, id:String)

Select color
Case "red"
Select id
Case "red"
Return 255
End Select
Case "green"
Select id
Case "green"
Return 255
End Select
Case "blue"
Select id
Case "blue"
Return 255
End Select
End Select

Return 0
End Function


Ich weiß, dass es nicht das Nonplusultra ist, aber es funktioniert, ich bin auch noch an einer Version dran, wo die Types direkt in einem Array gespeichert werden, um es noch ein wenig zu optimieren, aber aus Zeitmangel weiß ich noch nicht, ob es fertig wird.

Zudem habe ich das Problem, dass ich ein Array von 0-2 (rgb[i]) erstelle, aber wenn ich dann aus die einzelnen Array Einträge zugreifen will(SetClsColor(rgb[0]._value, etc)) wird mir gesagt, dass ich versuche auf ein Feld oder eine Methode eines nicht vorhandenen Objektes zugreifen möchte.
Falls mir dazu jemand einen Tipp per PN, nicht unbedingt hier in diesem Thema, es sei den es ist erwünscht, schreiben möchte, wäre ich sehr dankbar.

[Edit]
Das Array ist als rgb[3]:TSlider initalisiert, falls das weiter hilft

[Edit2]
Ahh ok, hat sich erledigt, man sollte auch beim erstellen das Objekt zurückgeben, typischer Anfängerfehler Wink

[Edit3]
Und hier noch mal Objektbasiert

BlitzMax: [AUSKLAPPEN]

Rem

BPS#12 - speichern und laden

End Rem


SuperStrict

'Programmeinstellung_________

'Fenster
Local width:Int = 800
Local height:Int = 600
AppTitle = "Hintergrundfarbe - speichern/laden"

'System
Local quit:Byte = False
Local timer:TTimer = CreateTimer(60)
Local color:String[] = ["red", "green", "blue"]
Local rgb:TSlider[3]
Local path:String = "color.cfg"

'Input
Local kh_esc:Byte
Local kh_spc:Byte
Local mx:Int, my:Int
Local md1:Int
'____________________________


'Typeeinstellungen___________
Type TSlider

'Maximalwert
Const _range:Int = 256

'Liste
Global _list:TList = CreateList()
Field _link:TLink

'Eigenschaften
Field _name:String
Field _x:Int, _y:Int
Field _w:Int, _h:Int
Field _value:Int = 128

'Konstruktor
Method New()
_link = _list.AddLast(Self)
End Method

'Destruktor
Method Destroy()
_link.Remove()
End Method

'Slider erstellen
Function Create:TSlider(name:String, x:Int, y:Int, color:Int=128, w:Int=255, h:Int=25)

Local slider:TSlider = New TSlider
slider._name = name
slider._x = x
slider._y = y
slider._w = w
slider._h = h
slider._value = color

Return slider
End Function

'Slider aktualisieren
Function Update:TSlider(mx:Int, my:Int)

For Local slider:TSlider = EachIn TSlider._list

If (slider._y < my) And (my < (slider._y+slider._h)) Then
If (slider._x-1 < mx) And (mx < (slider._x+slider._w+1)) Then
slider._value = mx-slider._x
EndIf
EndIf
Next

End Function


'Slider zeichnen
Function Draw()
For Local slider:TSlider = EachIn TSlider._list

Local half:Int = slider._range/2

'Hintergrund
SetColor(half, half, half)
DrawRect slider._x-1, slider._y-1, slider._w+2, slider._h+2

'Farbe
SetColor (GetColor(slider._name, "red"), GetColor(slider._name, "green"), GetColor(slider._name, "blue"))
DrawRect slider._x, slider._y, slider._value, slider._h

'Beschreibung
SetColor(255, 255, 255)
DrawText slider._value, (slider._x+(slider._w/2)-TextWidth(slider._value)/2), (slider._y+(slider._h/2)-TextHeight(slider._value)/2)
Next
End Function

'Slider speichern
Function Save(path:String)

Local file:TStream = WriteStream(path)

If Not file Then
Notify("Datei '" + path + "' konnte nicht erstellt werden")
Else
For Local slider:TSlider = EachIn TSlider._list
WriteInt(file, slider._value)
Next
CloseStream(file)
EndIf
End Function
End Type
'____________________________

Graphics width, height

'Slider/Color erstellen
Local file:TStream = ReadStream(path)
If file Then
For Local i:Int = 0 To 2
rgb[i] = TSlider.Create(color[i], 5, 5+(i*30), ReadInt(file))
Next
CloseStream(file)
Else
For Local i:Int = 0 To 2
rgb[i] = TSlider.Create(color[i], 5, 5+(i*30))
Next
EndIf


'HAUPTSCHLEIFE_______________
While Not quit

Local ticks:Int = WaitTimer(timer)

'Eingabe abfragen
kh_esc = KeyHit(KEY_ESCAPE)

mx = MouseX()
my = MouseY()
md1 = MouseDown(1)

'Eingabe verarbeiten
If kh_esc Or AppTerminate() Then quit = True

If md1 Then TSlider.Update(mx, my)
SetClsColor(rgb[0]._value, rgb[1]._value, rgb[2]._value)

'Anzeige
TSlider.Draw()

Flip 0
Cls
Wend
'____________________________


'Datei Speichern
TSlider.Save(path)

End


'Separate Funktionen_________
Function GetColor:Int(color:String, id:String)

Select color
Case "red"
Select id
Case "red"
Return 255
End Select
Case "green"
Select id
Case "green"
Return 255
End Select
Case "blue"
Select id
Case "blue"
Return 255
End Select
End Select

Return 0
End Function
'____________________________
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group