AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Problem mit Sprites ... (DelphiX)
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Sprites ... (DelphiX)

Ein Thema von fabiO · begonnen am 5. Feb 2006 · letzter Beitrag vom 5. Feb 2006
Antwort Antwort
fabiO

Registriert seit: 5. Dez 2004
Ort: Jena
41 Beiträge
 
Delphi 6 Personal
 
#1

Problem mit Sprites ... (DelphiX)

  Alt 5. Feb 2006, 13:40
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 = 'Sthen
      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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Problem mit Sprites ... (DelphiX)

  Alt 5. Feb 2006, 13:52
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?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
fabiO

Registriert seit: 5. Dez 2004
Ort: Jena
41 Beiträge
 
Delphi 6 Personal
 
#3

Re: Problem mit Sprites ... (DelphiX)

  Alt 5. Feb 2006, 15:02
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 ?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Problem mit Sprites ... (DelphiX)

  Alt 5. Feb 2006, 15:09
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
fabiO

Registriert seit: 5. Dez 2004
Ort: Jena
41 Beiträge
 
Delphi 6 Personal
 
#5

Re: Problem mit Sprites ... (DelphiX)

  Alt 5. Feb 2006, 15:49
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:50 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