AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Flackern auf einer Map verhindern...

Ein Thema von Master_RC · begonnen am 17. Mai 2005 · letzter Beitrag vom 3. Jun 2005
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Master_RC
Master_RC

Registriert seit: 18. Jan 2005
459 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: Flackern auf einer Map verhindern...

  Alt 18. Mai 2005, 14:15
TFeld:
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;
und die map-variable ist die:
map : array[0..1001,0..1001] of TFeld; // maximale Feldanzahl: 1.002.001
Ein Volk ist nur soviel wert, wie es dessen Toten ehrt.
  Mit Zitat antworten Zitat
Thebe

Registriert seit: 25. Jul 2004
Ort: Wedel
78 Beiträge
 
Delphi 6 Enterprise
 
#12

Re: Flackern auf einer Map verhindern...

  Alt 18. Mai 2005, 15:34
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]
  Mit Zitat antworten Zitat
Benutzerbild von Master_RC
Master_RC

Registriert seit: 18. Jan 2005
459 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: Flackern auf einer Map verhindern...

  Alt 22. Mai 2005, 16:27
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:
// 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;
So (versuche) lese ich ein:

Delphi-Quellcode:
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!
Gut...
und hier die Fehlermeldung:
Code:
---------------------------
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  
---------------------------
Gut... ne, schlecht...
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!
Ein Volk ist nur soviel wert, wie es dessen Toten ehrt.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#14

Re: Flackern auf einer Map verhindern...

  Alt 22. Mai 2005, 16:31
Hi,

hast Du "sl" vor dem Aufruf von GetFilesInDirectory überhaupt erstellt (also sl := TStringList.Create) ?

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Thebe

Registriert seit: 25. Jul 2004
Ort: Wedel
78 Beiträge
 
Delphi 6 Enterprise
 
#15

Re: Flackern auf einer Map verhindern...

  Alt 22. Mai 2005, 17:32
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.
  Mit Zitat antworten Zitat
Benutzerbild von Master_RC
Master_RC

Registriert seit: 18. Jan 2005
459 Beiträge
 
Delphi 7 Enterprise
 
#16

Re: Flackern auf einer Map verhindern...

  Alt 27. Mai 2005, 19:34
Zitat:
Hi,

hast Du "sl" vor dem Aufruf von GetFilesInDirectory überhaupt erstellt (also sl := TStringList.Create) ?

mfG
mirage228
ähm... ich hasse mich
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:
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.
z.B. "start.xmp" -> also die datei, die die map enthält

Zitat:
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.
ja, iss mir auch schon aufgefallen, ich speicher die sogar schon in ner globalen var ab, hab die da abba noch net rausgenommen (bitte jetzt nicht nach meinem IQ fragen )
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

Zitat:
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.
danke! ich hab mich eh schon gewundert, warum ich die vars nie einsetze
PS: wird auch im charakter gespeichert

Zitat:
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.
wie meinst du das?
soll ich dann die hex-namen in buchstaben konvertieren oder . . .


Zitat:
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.
was ist eine "Bitmaske"? bzw. wie soll ich das machen?


Zitat:
Ereignis1/2: keinen blassen Schimmer was Du anhand von Strings machen möchstes, deshalb kann ich da keine Vorschläge machen.
z. B. "Ereignis1 := 'GiveGold:500';"
dann wird eben ausgelesen aus dem string per "copy", etc... und bla bla bla
(mir iss nix besseres eingefalln, schulligung! )

Zitat:
MaxSizeX/Y, StartX/Y: ich denke nicht daß Du die Dinger brauchst, aber ich würde auch hier statt nem Integer ein Word nehmen.
Mist, iss wie bei den "Coord X,Y", brauch ich also da rinne nicht...

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 )

http://knuddelkater.kn.funpic.de/USE...oid/Ingame.JPG
Ein Volk ist nur soviel wert, wie es dessen Toten ehrt.
  Mit Zitat antworten Zitat
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#17

Re: Flackern auf einer Map verhindern...

  Alt 27. Mai 2005, 22:18
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 Hier im Forum suchenDelphiX Tutorial, Hier im Forum suchenDelphiX RPG, Hier im Forum suchenDelphiX Rollenspiel, Hier im Forum suchenDelphiX Map und Hier im Forum suchenDelphiX Karte sehr erfolgreich
[/Edit]
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
Benutzerbild von Master_RC
Master_RC

Registriert seit: 18. Jan 2005
459 Beiträge
 
Delphi 7 Enterprise
 
#18

Re: Flackern auf einer Map verhindern...

  Alt 27. Mai 2005, 23:26
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
Ein Volk ist nur soviel wert, wie es dessen Toten ehrt.
  Mit Zitat antworten Zitat
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#19

Re: Flackern auf einer Map verhindern...

  Alt 28. Mai 2005, 11:31
Es gibt soweit ich weiß auch irgendwo eine Version von DelphiX, die mit D7 läuft. (Ich hatte die auch schon mal ...)

*such*

Gefunden!

Zitat:
UnDelphiX is a unofficial version of DelphiX powered by the official JEDI DirectX headers
[...]
The latest version of UnDelphiX is a DirectX 8.1 version for Delphi 7.0 by Guthrie Ward.
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
Benutzerbild von Master_RC
Master_RC

Registriert seit: 18. Jan 2005
459 Beiträge
 
Delphi 7 Enterprise
 
#20

Re: Flackern auf einer Map verhindern...

  Alt 28. Mai 2005, 12:58
Kann es sein, dass UnDelphiX gerademal 2,1 mb groß ist?

wenn nicht, dann bitte direkten DLl-Link

Danke!


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
Ein Volk ist nur soviel wert, wie es dessen Toten ehrt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz