Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Flackern auf einer Map verhindern... (https://www.delphipraxis.net/46054-flackern-auf-einer-map-verhindern.html)

Master_RC 17. Mai 2005 15:51


Flackern auf einer Map verhindern...
 
hi leutz!

heute schon der 3. thread zu meinem RPG ;)

yo...
ganz schnell:
wie kann ich es verhindern, dass meine Map/Karte bei jedem Neuzeichnen flackert?
bzw... kann wer folgende funktion verbessern?
Delphi-Quellcode:
procedure MapRenew;
var aai,i,ii,iii: integer; MyRect,MyRect2: TRect; bitmap: TBitmap; ctype: string; center: TPoint;
begin
 if map[charx,chary].Begehbar = false then begin
  charx := map[0,0].startx;
  chary := map[0,0].starty;
  form1.Popup1.Title := 'ACHTUNG:';
  form1.Popup1.Text := 'Der Charakter war auf einem unzulässigen Feld! Er wurde zurückgesetzt!';
 end;
ctype := ini.ReadString('Char','type','');
MyRect2 := Rect(0,0,32,32);
if charx < 1 then charx := 1;
if chary < 1 then chary := 1;
character.mapx := charx;
character.mapy := chary;

form5.paintbox1.canvas.brush.style := bsclear;

center := Point(form5.Paintbox1.Width div 2-16,form5.Paintbox1.Height div 2-16);

for i := -2 to 2 do
  for ii := -2 to 2 do
    try
     MyRect := Rect(i*32+center.x,ii*32+center.y,i*32+center.x+32,ii*32+center.y+32);
     Bitmap:=TBitmap.Create;
      if (charx+i > 0) and (chary+ii > 0) then begin
      if FileExists('IMG/Map/'+map[charx+i,chary+ii].Textur) then begin
        Bitmap.LoadFromFile('IMG/Map/'+map[charx+i,chary+ii].Textur);
      end else Bitmap.LoadFromFile('IMG/Map/none.bmp');
      end else
        Bitmap.LoadFromFile('IMG/Map/none.bmp');
        form5.PaintBox1.Canvas.BrushCopy(MyRect,Bitmap,MyRect2,clfuchsia);
      if (charx+i > 0) and (chary+ii > 0) then begin
        if map[charx+i,chary+ii].Textur2 <> '' then begin
          Bitmap.LoadFromFile('IMG/Map/'+map[charx+i,chary+ii].Textur2);
          form5.PaintBox1.Canvas.BrushCopy(MyRect,Bitmap,MyRect2,clfuchsia);
        end;
      end;
    finally

    end;
MyRect := Rect(center.x,center.y,center.x+32,center.y+32);
 if fileexists('DATA/TEMPLATES/'+ctype+'/char_'+character.gender+'.bmp') then begin
   Bitmap.LoadFromFile('DATA/TEMPLATES/'+ctype+'/char_'+character.gender+'.bmp');
 end else begin
   Bitmap.LoadFromFile('IMG/Map/nochar.bmp');
 end;
form5.PaintBox1.Canvas.BrushCopy(MyRect,Bitmap,MyRect2,clfuchsia);
{for i := 0 to 1000 do begin
 if NPCs[i].name <> '' then begin
  Bitmap.LoadFromFile(NPCs[i].smallpic);
  //MyRect := Rect((NPCs[i].x+center.x)*32,(NPCs[i].y*+center.y)*32,(NPCs[i].x+center.x)*32+32,(NPCs[i].y+center.y)*32+32);
  MyRect := Rect(i*32+center.x,ii*32+center.y,i*32+center.x+32,ii*32+center.y+32);
  form5.PaintBox1.Canvas.BrushCopy(MyRect,Bitmap,MyRect2,clfuchsia);
 end;
end;}
for iii := 0 to 1000 do begin
 if NPCs[iii].name <> '' then begin
  for i := -2 to 2 do begin
   for ii := -2 to 2 do begin
    if NPCs[iii].x = charx + i then begin
     if NPCs[iii].y = chary + ii then begin
      Bitmap.LoadFromFile(NPCs[iii].smallpic);
      MyRect := Rect(i*32+center.x,ii*32+center.y,i*32+center.x+32,ii*32+center.y+32);
      form5.PaintBox1.Canvas.BrushCopy(MyRect,Bitmap,MyRect2,clfuchsia);
     end;
    end;
   end;
  end;
 end;
end;
viel spaß beim lesen ;)

Filou 17. Mai 2005 15:52

Re: Flackern auf einer Map verhindern...
 
Schon
Code:
doublebuffered:=true;
eingestellt?

Master_RC 17. Mai 2005 15:55

Re: Flackern auf einer Map verhindern...
 
ja, also meine paintbox1 liegt auf:

Form5 => Groupbox1 (oder 2) => pbox1

ich habs sowohl bei der form, als auch bei der groupbox angemacht => nix :(

Spessi 18. Mai 2005 02:24

Re: Flackern auf einer Map verhindern...
 
Also, ich habe es bei mir direkt ins OnCreate-Ereignis der Form geschrieben, bei mir flackert nichts.. Aber ich glaub da war noch was, was ich auch umgestellt habe, mir fällts aber im moment echt nich ein, ist ja auch schon spät :) Ich guck heut abend wenn ich aufwache nochmal, evtl. find ich was.

(Oder war es doch nur DoubleBuffered:=true? Naja, wie gesagt, ich guck dann nochmal)


mfg Spessi

Luckie 18. Mai 2005 02:48

Re: Flackern auf einer Map verhindern...
 
Zeichne alles auf ein Bitmap im Speicher und kopiere das dann mit BitBlt auf den Canvas der Paintbox.

Thebe 18. Mai 2005 07:44

Re: Flackern auf einer Map verhindern...
 
1. das TBitmap.Create VOR die zwei ineinander verschachtelten FOR Schleifen packen, das Bitmap wird immer wieder neu kreiert für jedes Map Tiles und das alte nicht freigegeben.

2. Ein Bitmap.Free am Ende der Procedure wäre auch nicht schlecht.

3. Du solltest die Bitmaps für jedes Tile Art im Speicher vorrätig lassen, die BMPs immer und immer wieder von der Platte auszulesen ist absoluter Käse, die Festplatte ist nicht ansatzweise so schnell wie der RAM Speicher.

4. Eine Map besteht eigentlich immer aus 3 Ebenen (Layer). Einmal der Map Untergrund der sich so schnell nicht ändern (sprich fast schon einmal zeichnen und gut is), dann der Items Layer der sich durch deine / NPC Interaktion ändern kann und letztendlich der Char Layer. Um bisschen Optimierung reinzukriegen, erstell eine Bitmap wo einmal (wenns gebraucht wird) die Map Tiles drauf gezeichnet werden und gut ist. Dann kannst Du deine Items und Chars über diesen Untergrund laufen lassen..


Ach ja, ich weiß Du wirst mich hassen, aber in deinem Interesse empfehle ich Dir: Lern ein bisschen OOP.

Delphi-Quellcode:
for iii := 0 to 1000 do begin
if NPCs[iii].name <> '' then begin
Vielleicht kannst Du so ein Zeug momentan noch machen, nur irgendwann wirste damit so richtig Probleme kriegen. Sieh es als Erfahrungs- und Weiterbildungschance an.

Master_RC 18. Mai 2005 09:07

Re: Flackern auf einer Map verhindern...
 
iss mir ja klar, dass es einige kritik gibt -> immerhin hab ich ja nach verbesserungen gesucht :)

also...
wie soll ich denn dann die karte aufbauen, wenn es denn nach OOP laufen soll?
bis jetzt isses "map: array[0..5000,0.5000] of TFeld" (oder so ähnlich)

gut...
wegen dem BitBlt:
Die Funktion hoffe ich steht in der Delphi-Hilfe :)
Und wie zeichne ich dann auf ein Bitmap im SPeicher?
einfach bitmap.create und dann per canvas genauso die bilder draufhaun wie bei der paintbox per canvas (hätt ich mir jetzt mal so vorgestellt :gruebel: )

und wie soll ich dann die ganzen bilder zwischenspeichern? :(

Thebe 18. Mai 2005 11:30

Re: Flackern auf einer Map verhindern...
 
Zitat:

also...
wie soll ich denn dann die karte aufbauen, wenn es denn nach OOP laufen soll?
bis jetzt isses "map: array[0..5000,0.5000] of TFeld" (oder so ähnlich)
Tut mir leid, aber die 2D Tile Matrix einer 2D Map ist das letzte was man OOP-mäßg machen kann. Wäre das eine 3D Map, wäre das schon wieder was anderes...

Anderes Beispiel: Charaktere...

Chars haben in den meisten RPGs Attribute wie Stärke, Intelligenz, Lebenspunkte, Mana, was weiß ich..
Diese 4 Beispiele wären innem Record einfach nur Variablen vom Typ Byte z.B. Nu haste ne Code Passage - meinetwegen im Programmcode für den Kampf, ein Char trifft den anderen mit nem Schwert - in der es heißt

Delphi-Quellcode:
if DerAndereCharWurdeGetroffen then
   DerAndereCharRecord.Lebenspunkte := DerAndereCharRecord.Lebenspunkte - 10;
Nu musst Du direkt danach darauf eingehen was dem anderen Char passiert. Stirbt er ? Kommt er in einen kritischen Bereich mit der Lebensenergie bei dem seine Stärke vllt halbiert wird ? Wenns Du es mit Records angehst, musst du bei JEDER Zuweisung einer Variablen selbstständig checken was im Anschluß darauf passiert. Mag bei dieser einen Passage schnuppe sein, weil das is dann ein Aufruf von einer Procedure hintendran mehr. Aber glaub mir, es wird nicht bei dieser einen Passage bleiben (Ich bin z.Zt. der Programmierteil von einem Ultima Online Freeshard (MMORPG), ich weiß wie dreckig anstrengend so ein Teil werden kann).

Nimm statt dessen lieber Klassen und statt Variablen Properties. Jedesmal wenn der Variable was zugewiesen wird, kannst Du in dem speziellen Fall drauf reagieren und musst das ganze nur einmal programmieren, sprich Ereignisorientiert programmieren, den Rest erledigt Delphi für Dich.

Nächstes Beispiel: Wie ich schon sagte, alles was Du an Bitmaps hast EINMAL einladen, dann immer aus diesen Bitmaps zeichnen. Bei ner Klasse kannst schon gleich im Konstruktor die Bitmap einladen, im Destruktur wird sie freigegeben. Zwischendurch kannst immer druff zugreifen und brauchst Dich sonst um nichts kümmern.

Nächstes Beispiel: Waffen, Items, Monster, alles Mögliche..
Man programmiert für die eine Grundgattung (meinetwegen Waffen) eine Basisklasse, sei es nun TBaseWeapon. Davon leitest Du die anderen Klassen ab, z.b. TBastardschwert. Wenn Du nun in der basisklasse das Grundverhalten von Waffen programmierst, wirkt sich das auf alle Nachfahren dieser Klasse aus, Du brauchst in deinem TBastardschwert nur vllt die Eigenschaften wie Schaden, Schadenstyp usw. ändern. Das wars.

Was aber nun, wenn Du mit deinen Records ein Schwert hättest, was ein komplett anderes Verhalten hat als z.b. so nen Standard Schwert. Lass es ein vergiftetes Schwert sein, oder eins was gelb leuchtet un den Gegner in Flammen steckt. Du musst beim Schadenscode überall abchecken, welches Schwert benutzt wird und darauf reagieren. Dadurch wird dieser Programmcode lang, kompliziert und unübersichtlich. Mit meiner Methode würdest einfach ein TFlammenschwert von TBaseWeapon ableiten und eine Methode überschreiben, die den Schaden zufügt.

Nächstes Beispiel: Interfaces
Ein Interface in einer Klasse zu implementieren bedeutet, man Klassen ansprechen, die nicht von einander abgeleitet sind, bzw. einen gleichen Vorfahren besitzen.
Bei Ultima Online (RunUO Server) gibbets ein Interface namens IEntity. Das beherbergt die Felder X, Y, Z, MapPlane (gibt verschiedene Maps dort). Dieses IEntity ist in der Basisklasse für Items und für Chars drinne. Ich könnte somit also einfach über dieses Interface gleichermaßen Items und Chars ansprechen, ohne mit der Wimper zu zucken was ich da nun eigentlich verschiebe. Mit Records musst Du entweder erstmal überladene Proceduren machen, die entweder Items oder Chars als Parameter annehmen ODER aber Du musst eine allgemeine Procedure machen und dann in dieser Procedure nachchcecken was Du eigentlich verschiebst und dann darauf reagieren.

Ich weiß Du siehst momentan nicht wirklich den Sinn dahinter, warum Du auf OOP umsteigen solltest und ich muss auch eingestehen, ich weiß noch nit wie fortgeschritten dein Spiel ist. Aber ich weiß GANZ GENAU, sobald das Ding an Komplexität zunimmt die über hin und her gehen und Chars anschnacken hinausgeht, wirst Du Dich vor lauter IF-Bedingungen nicht mehr retten können, solltest Du auf der Records-Schiene draufbleiben. Drum tu Dir selbst ein Gefallen, wechsel auf Klassen. Wenn erstmal das Spiel komplex ist, kannste das knicken, dann stampfst Du alles ein und fängst von vorne an weil Du kein Land mehr siehst.

- Thebe

Master_RC 18. Mai 2005 12:19

Re: Flackern auf einer Map verhindern...
 
vielen dank!! hat mir sehr geholfen! :top:

nur...
ich hab mit klassen sehr wenig erfahrung.. :(

was meien map anbelangt sollte sie so bleiebn, wenn ich richtig gelesen hab...

und das mit den if-gewurschtel ist schon passiert (noch blick ich noch durch! :D )

das mit den bitmaps würde ich mir dann so vorstellen, dass ich einen array mach und in den dann alle (bekannten) bilde reinlad, bzw. dann eben ausles. richtig so?

yo...

Thebe 18. Mai 2005 14:08

Re: Flackern auf einer Map verhindern...
 
in etwa
wenn Du mir noch sagst welche "Felder" in dem Record für deine Map und deine Chars drinne is kann ich Dir nen Beispiel schreiben wie man da sehr schön was draus mit ner Klasse machen kann..

Master_RC 18. Mai 2005 14:15

Re: Flackern auf einer Map verhindern...
 
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:
Delphi-Quellcode:
map : array[0..1001,0..1001] of TFeld; // maximale Feldanzahl: 1.002.001

Thebe 18. Mai 2005 15:34

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]

Master_RC 22. Mai 2005 16:27

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:
// 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! :)

mirage228 22. Mai 2005 16:31

Re: Flackern auf einer Map verhindern...
 
Hi,

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

mfG
mirage228

Thebe 22. Mai 2005 17:32

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.

Master_RC 27. Mai 2005 19:34

Re: Flackern auf einer Map verhindern...
 
Zitat:

Hi,

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

mfG
mirage228
ähm... ich hasse mich :x
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 :roll: (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 :roll:

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 :thumb:
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

Flogo 27. Mai 2005 22:18

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 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]

Master_RC 27. Mai 2005 23:26

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 ;)

Flogo 28. Mai 2005 11:31

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*

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.

Master_RC 28. Mai 2005 12:58

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:

Flogo 28. Mai 2005 13:48

Re: Flackern auf einer Map verhindern...
 
2,95 MB sinds bei mir (http://turbo.gamedev.net/UnDelphiX_D7.zip)

Zitat:

Zitat von Master_RC
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?

Ja das geht. Die Map (und alles andere auch) wird von der "SpriteEngine" gezeichnet und dieses Zeichnen wird von einem Timer aufgerufen. Der DXTimer ist dabei so eingestellt, dass er - wenn du das Intervall auf 0 stellst - so oft wie möglich zeichnet. Mit der DxInput-Kompo kannst du dann die Tastendrücke abfragen und in Bewegung umsetzen.

Luckie 28. Mai 2005 14:01

Re: Flackern auf einer Map verhindern...
 
Sag mal, hat das überhaupt noch was mit dem ursprünglichen Thema zu tun? Jetzt fragst du nach Bitmasken, wie man MP3s abspielt, wie deine Klasse am besten aufgebaut sein soll usw. Eventuell sollte man das Topic in "Wir programmieren zusammen ein Rollernspiel" umbenennen.

Es sollte eigentlich bekannt sein, dass für jede neue Frage auch ein neuer Thread aufzumachen ist.

Master_RC 28. Mai 2005 14:46

Re: Flackern auf einer Map verhindern...
 
Zitat:

Zitat von Flogo
2,95 MB sinds bei mir (http://turbo.gamedev.net/UnDelphiX_D7.zip)

Zitat:

Zitat von Master_RC
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?

Ja das geht. Die Map (und alles andere auch) wird von der "SpriteEngine" gezeichnet und dieses Zeichnen wird von einem Timer aufgerufen. Der DXTimer ist dabei so eingestellt, dass er - wenn du das Intervall auf 0 stellst - so oft wie möglich zeichnet. Mit der DxInput-Kompo kannst du dann die Tastendrücke abfragen und in Bewegung umsetzen.

Und du bist auch sicher, dass die auf Dephi7 Personal funzen?
mmh.. gut... tutos gibts ja bestimmt genug, da such ich mir noch eins raus :)
// EDIT: arbeitet UNDelphiX genauso wie DelphiX - also die gleichen tutos?


@luckie:
nunja, das waren ja nur nebenfragen, die ja nicht beantwortet werden müssen/sollen (und die gibts in so ziemlich jeden thread).
Ich werd schon ein neues Thema aufmachen, wenns denn wirklich brenzlich wird :)

@alle:
Gut, ich werd das dann mal mit (Un)DelphiX ausprobieren. Wenn es Fragen gibt, dann werden die hier sich rgestellt. :)
Nochmals danke! ;)

Flogo 29. Mai 2005 13:53

Re: Flackern auf einer Map verhindern...
 
Zitat:

Zitat von Master_RC
Und du bist auch sicher, dass die auf Dephi7 Personal funzen?

Ja, die Datei ist ja speziell für D7 und welche Lizenz du hast spielt keine Rolle
(Ich hab sie gestern auch auf meinem D7 PE installiert)

Zitat:

Zitat von Master_RC
// EDIT: arbeitet UNDelphiX genauso wie DelphiX - also die gleichen tutos?

Ja


@luckie:
Immerhin hilft doch DelphiX das Flackern bei der Map zu verhindern ;-)

Master_RC 3. Jun 2005 11:40

Re: Flackern auf einer Map verhindern...
 
k, es funzt bei mir :)

Tutos werd ich dann alleien suchen - somit wärs dann ende erstmal, THX! ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 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