Autor |
Beitrag |
Zlatan
      
Beiträge: 175
|
Verfasst: Di 22.02.11 17:34
Nehmen wir an ich habe ein spiel mit mehreren leveln (jedes Level hat eigene form)
Ich wollte einen button erstellen, dass man nach level 5 abspeichern kann
dass heißt wenn ich morgen das programm starten würde, würde ich mit level 6 anfangen.
Geht das und Wie?
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Di 22.02.11 17:41
Du kannst z.B. Level=6 speichern. Wenn du das lädst, dann weißt du, dass 6 der nächste Level wäre.
Dazu musst du ne Datei anlegen. Entweder ne TIniFile z.B, oder per AssignFile
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 22.02.11 17:47
Oder Du Speicherst automatisch wenn der Level 5 geschafft ist. So wie es viele andere Spiele auch machen  Diese Info packst Du, wie Xion schon geschrieben hat in eine Datei.
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Zlatan 
      
Beiträge: 175
|
Verfasst: Di 22.02.11 17:48
Tut mir wirklich leid aber das kapier ich jetzt nicht 
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Di 22.02.11 17:52
Es gibt keine Funktion "Speichern" in Delphi. Ich glaub dir ist das unklar, weil du gar nicht weißt, was speichern eigentlich heißt
Was du willst ist ein Arbeitsspeicher-Abbild, so das beim nächsten Start das Programm exakt so startet, wie es beenden wurde. Das ist wohl eher nicht so sinnvoll (dann würde ja jede Word Datei das komplette Word-Programm enthalten).
Du musst also was Speichern, damit dein Programm sich selbst wieder richtig konfigurieren kann. Dafür reicht es ja, dass du sagst, welche Form angezeigt wurde z.B. Diese zeigst du dann wieder an, wenn man das Programm startet. Und das musst du in eine Datei reinschreiben (von Hand).
Tutorial zu TIniFile: www.kuknet.de/tutorial1.pdf
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 22.02.11 18:04
Xion hat folgendes geschrieben : | ....Und das musst du in eine Datei reinschreiben (von Hand). |
Wolln mal so nicht sein.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| var PIni: TIniFile; begin Pini:= TIniFile.Create(Pfad und name der ini); try Pini.WriteInteger('Spiel', 'Level', Level); finally Pini.Free; end; end; var PIni: TIniFile; begin Pini:= TIniFile.Create(Pfad und name der ini); try level:= Pini.ReadInteger('Spiel', 'Level', ''); finally Pini.Free; end; end; | als Beispiel!
Hoffe Du kannst damit was anfangen
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Für diesen Beitrag haben gedankt: Zlatan
|
|
KleinesPferd
      
Beiträge: 29
|
Verfasst: Mi 23.02.11 16:07
ALFs Vorschlag ist einer der elegantereren
Eine anschaulicherere Alternative wäre ein TMemo einzubinden. Dessen Inhalt kannst du mit memo1.lines.safotofile("Dateiname.txt") speichern und genauso mit loadfromfile("Dateiname") wieder laden.
Wenn du nun ein Level erfolgreich fertig hast, machst du
Delphi-Quelltext 1: 2: 3:
| memo1.clear; memo1.lines.add("4"); memo1.lines.safetofile("Dateiname.txt"); |
Zum auslesen machst du einfach beim Form1.onshow ->
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| if fileexists("Dateiname") then begin memo1.lines.loadfromfile("Dateiname"); if memo1.lines.count>0 then try level:=strtoint(memo1.lines[0]); except level:=0; end; |
Bei ALFs Source würde ich in Zeile 17 level:= Pini.ReadInteger('Spiel', 'Level', ' 0'); eintragen. Somit hat die Variable level immer einen definierten Wert.
Desweiteren solltest du Aufpassen, ich GLAUBE unter Vista und W7 hat man als normaler User keine Schreibrechte im Ordner Dokumente und Einstellungen, sowie im Ordner Programme oder Windows... So als Hinweis wo du die Datei denn nun speichern magst.
Grüße
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 23.02.11 16:14
Moin!
KleinesPferd hat folgendes geschrieben : | Eine anschaulicherere Alternative wäre ein TMemo einzubinden. |
Das mag zwar anschaulich sein, aber wenig zu empfehlen. Damit missbrauchst du eine visuelle Komponente für die Datenhaltung.  Das Gleiche erreicht man auch mit z.B. einer TStringList, aber ohne den Overhead der GUI-Kompo.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
KleinesPferd
      
Beiträge: 29
|
Verfasst: Mi 23.02.11 19:13
Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
Das ist vollkommen Richtig. Deswegen habe ich auch ALFs Vorschlag präferiert.
Und eine reine TStringList auch auch nicht sehr anschaulich.
Und wenn es um das Programm geht, wo die Maus kleine Gänge langeschoben wird, und eine Kollisionsabfrage anhand von Panels gemacht werden, oder Buttons, da spielt der Overhead auch nimmer eine große Rolle.
Sauber ist es nicht, schön auch nicht. Aber seeeeehr anschaulich
Grüße
|
|
gnomecoder
      
Beiträge: 51
Erhaltene Danke: 5
|
Verfasst: Mi 23.02.11 21:13
du könntest auch über eine Verschlüsslung nachdenken. Kann ja auch ganz simpel sein.
Wenn da eine ini datei mit dem inhalt Level=10 zb. liegt, könnte man leicht schummeln.
nur so als tipp 
|
|
Zlatan 
      
Beiträge: 175
|
Verfasst: Mi 23.02.11 21:40
Ist schon gut habe eine andere möglichkeit gefunden ohne eine datei zu erstellen 
|
|