Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Problem mit Sprites ... (DelphiX) (https://www.delphipraxis.net/62486-problem-mit-sprites-delphix.html)

fabiO 5. Feb 2006 13:40


Problem mit Sprites ... (DelphiX)
 
Hallo,

Ich bin gerade dabei ien 2D-RPG zu "machen".
Zur zeit kämpfe ich mit der Level-Erstellung, sprich mit der Platzierung der Sprites auf der Map.
Ich mache dies mithilfe einer Textdatei, in der ich die Struktur des Level vorher festlege.
Mein Problem besteht jetzt darin, dass ich auf der Karte Steine platzieren möchte, was kein Problem ist.
Das Problem liegt bei dem Untergrund der Stein, sprich worauf sie stehen, auf Gras oder auf schlichter Erde.

Ich möchte das, wenn ein Stein in einer "grasigen" Umgebung steht, auch sein Untergrund Gras ist, und wenn um ihn herum erde ist, dann soll er eben auch auf Erde stehen.

Ich habe dazu schon eine function geschrieben, mit welcher ich den Untergrund der Nachbarfelder (x-1 -> x+1, y-1 -> y+1) prüfe. Ist der Grasanteil größer als der Erdeanteil, so bekommt der Stein einen Gras-Untergrund, ansonsten eine erdigen. Doch irgendwie funktioniert sie nicht für alle Steine, und eben daraus werd ich nicht schlau.

Hat jemand vielleicht ne Idee, wie man das anders lösen könnte ? Ich poste ma ein bisschen Code, damit man sich was unter meinem gelabber vorstellen kann :)

Die Level-TXT Datei...
Code:
21111111111111111111111111111113
1 H    O•    """""""""""""""""1
1       SSSS      S~~~S"S"""""1
1•             """" """"""S"S""1
1             """" ""•"""""S"""1
1     •           S"SSS"+""S"""1
1  S         """"S"""L"""SS"""1
1  SS        ""S"S""""""""""""1
1•  S~~~~SSS ""S""""O"SS""""""1
1          •  ""S""""""SS""""""1
1   •  SS    """"""SSSSS""""""1
1SSS  S S SS""""S"""""""""""1
1"+""""S""S""SS""""""""""""""""1
1"S""L"""""""SSSS"S"SSSSS"""SS"1
1"SSS"""SSS""""L""""S"""""S""""1
1"""S~~~SSSS""""""SS""SSS""S"""1
1""SS""""SSSSSSS""S"""""S""S"""1
1""SS"""""""""""""1""""""""11""1
1""""""""""""S""""""""S""""""""1
41111111111111111111111111111115

' ' = Boden
 " = Gras
 S = Stein
 1  = vertikale- bzw. horizontale Mauer
 2  = linke obere Mauer
 3  = rechte obere Mauer
 4  = linke untere Mauer
 5  = rechte untere Mauer
 ~  = Strom
 +  = Schwert
 L = Lederrüstung
 O = Schild
 •  = Gold
 H = Haus
Ich lese diese TXT in eine Stringlist ein, und kopiere deren Inhalt dann in ein Array of String.
Dann wird mit einer Schleife Zeile für Zeile, jedes Zeichen ausgelesen, und je nach seinem Inhalt ein Sprite created... hier mal ein Beispiel, falls das Zeichen ein S, also ein Stein, ist:

Delphi-Quellcode:
  for j := 0 to 19 do begin                                  // j = Zeile
    for i := 1 to length(TXTArray[j]) do                   // i = Zeichen
    begin
      c := copy(TXTArray[j], i, 1);                        // Char wird kopiert

//////////////////////////   falls Char = Stein ...  ////////////////////////


      if c = 'S' then
      begin
        with TStein.Create(DXSpriteEngine1.Engine) do      // Wand bei X,Y platzieren
          begin
            x := i * 32 - 32;
            y := j * 32;
          end;

        if Stein_Umgebung(i,j) = 1 then                    // falls mehr Gras als Erde...
        with TGras.Create(DXSpriteEngine1.Engine) do
          begin
            x := i * 32 - 32;
            y := j * 32;
          end;

        if Stein_Umgebung(i,j) = 2 then                    // falls mehr Erde als Gras...
        with TBoden.Create(DXSpriteEngine1.Engine) do
          begin
            x := i * 32 - 32;
            y := j * 32;
          end;
      end
Hier die Funktion, um die Untergründe der Nachbarn zu bestimmen:

Delphi-Quellcode:
function Stein_Umgebung(SteinX, SteinY : Integer) : Integer;
var erde, gras, a, b : Integer;
begin
  erde := 0;
  gras := 0;
  for a := SteinX-1 to SteinX+1 do
    for b := SteinY-1 to SteinY+1 do
    begin
    if (a <> SteinX) and (b <> SteinY) then
    begin
    if (copy(TXTArray[a], b, 1)) = '"' then
      inc(gras);
    if (copy(TXTArray[a], b, 1)) = ' ' then
      inc(erde);
    end;
    end;
  if gras > erde then Stein_Umgebung := 1;
  if erde > gras then Stein_Umgebung := 2;
end;
Und hier sieht man, was ich meine, es klappt nicht bei allen Steinen... :(

http://web29.go-space.net/fabio/dp3.jpg

Also ich hoffe ich konnte zeigen was ich will, wenn nicht sagt bescheid, dann versuch ich dass Gewirr zu entwirren :)

Gruß fabiO

Christian Seehase 5. Feb 2006 13:52

Re: Problem mit Sprites ... (DelphiX)
 
Moin Fabi,

eine Sache hast Du auf jeden Falls schon einmal unberücksichtigt gelassen, nämlich dass die Werte von erde und gras gleich sein können. In diesem Falle wird das Ergebnis unbestimmt sein.
Ausserdem könntest Du, statt des Funktionsnamens, die, in einer Funkion immer automtisch definierte, Variable Result für das Ergebnis verwenden.

Was mir nicht ganz klar ist:
Wenn Du erst den gesamten Untergrund festlegst, warum willst Du dann den für die Steine ändern?
Warum genügt es nicht, den Untergrund zu nehmen, der an den Koordinaten ist, an denen ein Stein gesetzt werden soll?

fabiO 5. Feb 2006 15:02

Re: Problem mit Sprites ... (DelphiX)
 
zu 1.) jo das mit result stimmt, hab nich dran gedacht... ich hab erstma nur diese beiden Möglichkeiten in Betracht gezogen, aber hast schon recht, diese andere Möglichkeit bleibt vorerst außer Acht...

zu 2.) Ich lege ja so zu sagen nicht den ganzen Untergrund fest, ich lege fest wo z.B. Erde und wo Gras ist, aber wenn ich einen Stein hinsetzte, kann ich nicht festlegen, was für ein Untergrund an dieser Stelle sein soll, da das Zeichen ja schon durch das 'S' vom stein belegt ist, verstehste ?

Christian Seehase 5. Feb 2006 15:09

Re: Problem mit Sprites ... (DelphiX)
 
Moin Fabi,

ja, jetzt habe ich es verstanden.
Dann sehe ich da noch zwei Möglichkeiten:
  1. Du nimmst zwei verschiedene Werte für 'Stein', z.B. s für Stein auf Gras, und S für Stein auf Erde
  2. Du machst es mit Ebenen.
    Eine Ebene (Array) für den Untergrund, wo dann eben steht, ob es sich um Erde oder Gras handelt, und eine mit den Objekten, die auf der ersten Ebene stehen.

Die erste Variante dürfte sich etwas leichter einbauen lassen, bei dem was Du schon hast, die zweite ist flexibler.
Wenn Du z.B., noch einen neuen Untergrund einbauen willst (z.b. Holz, Wasser), müsstest Du, ohne Ebenen, alle Routinen, die den Untergrund errechen neu schreiben.

fabiO 5. Feb 2006 15:49

Re: Problem mit Sprites ... (DelphiX)
 
Hi chrissi,

du musst gedankenleser sein ;)
Als ich deinen ersten Post gelesen hab, bin ich irgendwie auf die zweite Variante, mit den ebenen, gekommen :)
Jetzt funktionierts größtenteils 1A, gibt nur noch manche exotische Stellen, an denen etwas falsch is, aber ansonsten Tip Top ;)

Danke für deine hilfe!

Gruß fabiO


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