![]() |
Re: Flackern auf einer Map verhindern...
TFeld:
Delphi-Quellcode:
und die map-variable ist die:
TFeld = record
mapname: string; // Map-Name bgmusic : string; // Die Hintergrundmusik - falls nix, keine Änderung x: Integer; // X-Koordinate y: Integer; // Y-Koordinate Textur : String; // Texturpfad für das Feld Textur2 : String; // 2. Texturen-Ebene Textur3 : String; // 3. Texturen-Ebene (über Held) Begehbar : boolean; // Kann man auf dem Feld laufen oder nicht Teleportx : integer; // Datentyp der die X,Y Koordinate enthält auf welches Teleporty : integer; // Feld teleportiert wird (0/0) für kein Teleportfeld Ereignis1 : string; Ereignis2 : string; maxsizex,maxsizey : integer; startx,starty : integer; end;
Delphi-Quellcode:
map : array[0..1001,0..1001] of TFeld; // maximale Feldanzahl: 1.002.001
|
Re: Flackern auf einer Map verhindern...
Schreib mich mal per ICQ an, UIN is ... oder per eMail ...
Ich werd Dir mal nen bisserl Stütze geben. [edit=sakura] Antworten bitte ins Forum, da sind diese hilfreich für alle ;) Mfg, sakura[/edit] |
Re: Flackern auf einer Map verhindern...
hi leutz!
Ich hab jetzt den Ratschlag befolgt, jedes Bild vorher in einen Array zu laden, damit dieses nicht immer von der Festplatte geholt werden muss. Mein Lösungsansatz: Ich lade lasse das Program erstmal alle Dateien, die mit .bmp aufhören aus diesem Ordner in eine TStringList oder TStrings einlesen. Danach werde ich diese Dateien dann Zeile für Zeile in das Array laden. Bevor ich mein Problem beschreibe, erstmal der Code der Auslesefunktion und dann auch gleich der Fehler ;)
Delphi-Quellcode:
So (versuche) lese ich ein:
// Code entnommen der Codedatenbank "Easy Delphi Helper" ([url]www.delphi-source.de[/url])
procedure GetFilesInDirectory(Directory: String; const Mask: String; List: TStrings; WithSubDirs, ClearList: Boolean); procedure ScanDir(const Directory: String); var SR: TSearchRec; begin if FindFirst(Directory + Mask, faAnyFile - faDirectory, SR) = 0 then try repeat List.Add(Directory + SR.Name) until FindNext(SR) <> 0; finally FindClose(SR); end; if WithSubDirs then begin if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try repeat if ((SR.attr and faDirectory) = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') then ScanDir(Directory + SR.Name + '\'); until FindNext(SR) <> 0; finally FindClose(SR); end; end; end; begin List.BeginUpdate; try if ClearList then List.Clear; if Directory = '' then Exit; if Directory[Length(Directory)] <> '\' then Directory := Directory + '\'; ScanDir(Directory); finally List.EndUpdate; end; end;
Delphi-Quellcode:
Gut...
var sl: TString; //oder eben TStringList - immer der die gleiche Fehlermeldung...
if high(maptiles) > 0 then for ii := 0 to high(maptiles) do begin maptiles[ii].FreeImage; // um vorher die Images aus dem Array zu "entleeren" - stimmt das so? end; GetFilesInDirectory(ExtractFileDir(Application.ExeName)+'\IMG\Map\', '*.*', sl, False, True); // Hier sitzt der Fehler! und hier die Fehlermeldung:
Code:
Gut... ne, schlecht...
---------------------------
Benachrichtigung über Debugger-Exception --------------------------- Im Projekt Xiphoid.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 004956F6 in Modul 'Xiphoid.exe'. Lesen von Adresse 0000004C'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen. --------------------------- OK Hilfe --------------------------- wenn ich jetzt den Teil "GetFilesInDirectory" auslasse, dann funktioniert alles prima (nur er lädt eben die Dateien nicht in die Strinlist ;) ) Wenn ich die Funktion jetzt aber in eine TStringBox laden lasse, dann funktioniert alles prima....... Arrrgh, ich verzweifle! PS: @thebe: ja, wer dich machen, sobald ich zeit hab! :) |
Re: Flackern auf einer Map verhindern...
Hi,
hast Du "sl" vor dem Aufruf von GetFilesInDirectory überhaupt erstellt (also sl := TStringList.Create) ? mfG mirage228 |
Re: Flackern auf einer Map verhindern...
schätze auch mal das SL nicht initialisiert wurde.
Nun, Sakura hat ja im Endeffekt recht, also nehmen wir den umständlichen Weg übers Forum..
Delphi-Quellcode:
TFeld = record
mapname: string; // Map-Name bgmusic : string; // Die Hintergrundmusik - falls nix, keine Änderung x: Integer; // X-Koordinate y: Integer; // Y-Koordinate Textur : String; // Texturpfad für das Feld Textur2 : String; // 2. Texturen-Ebene Textur3 : String; // 3. Texturen-Ebene (über Held) Begehbar : boolean; // Kann man auf dem Feld laufen oder nicht Teleportx : integer; // Datentyp der die X,Y Koordinate enthält auf welches Teleporty : integer; // Feld teleportiert wird (0/0) für kein Teleportfeld Ereignis1 : string; Ereignis2 : string; maxsizex,maxsizey : integer; startx,starty : integer; end; Was mir erstmal stark auffällt, Du hast da ziemlich viel unnützes Zeug drinne. Wenn ich mal die benötigte Größe der Variablen zusammen rechne und mit der Größe der Map multipliziere (ich bin mit davon ausgegangen, daß die Strings 255 Byte beanspruchen, kann ja ne Menge mal drinne sein) dann kommst Du auf knapp 1,8 GB Speicher benutzung für die Map. Wollen wir uns mal die Variablen durchgucken. Mapname: Was ist das ? Der Name des Tiles auf dem man steht ? Soll da denn "Pflasterboden" oder "Sandboden" stehen ? Kann man alles zentralisieren, da belegt es nur einmal den Platz. BGMusic: Schätze mal Pfad zu ner MIDI Datei, nur wieso ? Die Musik wird sich nicht bei jedem Feld ändern, da isses sinnvoll man programmiert sich Regionen, in denen eine bestimmte Midi Musik abgespielt wird. X, Y: Sind vom Typ integer, da man maximal bis 1001|1001 gehen kann, isses recht unsinnig da für jede Variable jeweils 2 Byte übern Haufen zu schmeißen. Wenn ichs mir sogar noch recht überlege, dann sind die beiden Variablen eh nutzlos, weil du die X/Y Koordinaten auf dem Char speichern kannst bzw. für die X/Y Koordinaten ja aufs Feld im Array zugreifst -> Müll. Textur1, Textur2, Textur3: Sind alles Pfadnamen, was mehr als daneben ist. Da kannste eher die Bilder als Hexadezimale Nummern abspeichern, z.b. "0F2A.bmp" und dann damit drauf zugreifen, da haste dann insgesamt nur 6 Byte für alle drei Variablen. Begehbar: 8 Bit benötigt um eigentlich nur 1 Bit zu benutzen. Da würd ich Dir zu ner Bitmaske raten, z.b. werden bei MaxSizeX/Y, StartX/Y, TeleportX/Y nur maximal 10 von 16 bits (nach meinem Vorschlag s.u.) verwendet. Wenn Du das eine Bit da drinne mit versteckst, wird sich niemand beklagen. Mit der Methode hast Du übrigens dann gleich Platz für 35 andere True/False Konditionen, die Du nicht extra abspeichern musst. TeleportX/Y: Siehe oben, da brauchst Du auch maximal pro Variable ein Word und kein Integer. Auch wenn ich die Methode ziemlich daneben finde das so zu machen, isses erstmal eine gute Variante da Du keine Items/Item Events programmiert hast womit man das eher machen könnte. Ereignis1/2: keinen blassen Schimmer was Du anhand von Strings machen möchstes, deshalb kann ich da keine Vorschläge machen. MaxSizeX/Y, StartX/Y: ich denke nicht daß Du die Dinger brauchst, aber ich würde auch hier statt nem Integer ein Word nehmen. Erstmal soviel dazu. Zeig doch mal nen paar Bilder von dem was Du schon hast, oder noch besser das Projekt in der momentanen Verfassung. Da kann man dann noch besser druff eingehen. |
Re: Flackern auf einer Map verhindern...
Zitat:
JEDES mal, aber auch wirklich JEDES MAL denk ich dran, dass ich das initialisiere und dann... WENN ICH ES EINMAL BRUACHE - NICHTS! arrrgh.... danke! ;) Zitat:
Zitat:
ja, iss ne musikdatei (zumindest der pfad - und nicht nur midi ^^ ) ==> wie kann ich eigentlich eine *.mp3-datei "gut" abspielen - ich benutz gerade den weg über ne eingebettete Microscrott Windoof Mediaplayer komponente :roll: Zitat:
PS: wird auch im charakter gespeichert ;) Zitat:
soll ich dann die hex-namen in buchstaben konvertieren oder . . . Zitat:
Zitat:
dann wird eben ausgelesen aus dem string per "copy", etc... und bla bla bla ;) (mir iss nix besseres eingefalln, schulligung! ;) ) Zitat:
Zwecks den Bildern: Ich zeig euch mal ein paar (zur zeit leider nur 1, da andere sich um andere themen kümmern), bedenket jedoch, dass ich das design gegebenermaßen komplett umdesignen werde (also nicht nur 5x5 mapfelder, sondern 7x7 oder so...) UND: es soll ein spiel sein für *etwas* ältere rechner ;) "dem stiefvater gewidmet" ^^ (hab jetzt speziell nur unser themengebiet gepostet ;) ) ![]() |
Re: Flackern auf einer Map verhindern...
Ich weiß jetzt nicht wie weit du schon bist, aber wenn du alles auf Klassen umstellst und auf diese Art "noch mal neu anfängst" oder auch für andere die mit sowas anfangen wollen:
Schau dir mal DelphiX an! Da müsstest du zwar immer noch die Klassen entwerfen (und dein Map-Array würde das auch nicht groß beeinflussen) aber gerade beim Zeichnen wird dir da viel abgenommen (kein Flackern; du kannst Bilder in die ImageList vorladen; die Dinger werden von der SpriteEngine gezeichnet; ...) Außerdem gibts dafür extrem viele Tutorials. Ich glaub hier gabs sogar schon mal ne Frage wie man das in einem RPG einsetzt. [Edit] Hab grad nochmal gesucht aber nicht das gefunden was ich gemeint hatte. Trotzdem sind die Suchen wie ![]() ![]() ![]() ![]() ![]() [/Edit] |
Re: Flackern auf einer Map verhindern...
DelphiX?
mmh... ich hab ne personal von D7 :( schade, dass es bei mir net funzt... trotzdem danke! das mit dem neu anfangen muss ich ja dann sowieso ;) |
Re: Flackern auf einer Map verhindern...
Es gibt soweit ich weiß auch irgendwo eine Version von DelphiX, die mit D7 läuft. (Ich hatte die auch schon mal ...)
*such* ![]() Zitat:
|
Re: Flackern auf einer Map verhindern...
Kann es sein, dass UnDelphiX gerademal 2,1 mb groß ist?
wenn nicht, dann bitte direkten DLl-Link Danke! :thumb: so... jetzt hab ich mir schon gedanken gemacht: Kann man mit dem DelphiX das jetzt auch so machen, dass man die Karte so oft aktualisiert, dass man den Helden bei Tastendruck/etc. auch um jeden einzelnen Pixel versetzt? Wär kewl, also so Diablo/Sacred/DivineDivinity mäßig :stupid: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz