Types and Array verknüpfen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

theotheoderich

Betreff: Types and Array verknüpfen

BeitragSo, Mai 24, 2009 10:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,
trotzt Suche habe ich bisher noch nicht so die für mich perfekte Lösung gefunden Confused

Gegeben sind folgende Vorraussetzungen:

- Array mit 128x128 Feldern --> tile(128,128,26)
von denen sind immer nur ein Teil sichtbar


- Types für Raucheffekte die auf Feldern erzeugt werden können:

Type smoketype
Field id
Field x
Field y
Field Pixx#
Field Pixy#
Field dir
Field img
Field frame#
Field framemax
End Type

Global smoke.smoketype

Die Types sollen quasi an ihre Felder auf denen sie erstellt werden gebunden sein. Daher auch X,Y bei den Types.

Wenn jetzt nun alle sichtbaren Tiles berechnet werden, so sollen auch nur die SmokeTypes gezeichnet werden, die auch sichtbar sind.
Allerdings sollen jetzt nicht wieder alle Types durchlaufen und auf Sichtbarkeit geprüft werden.

Types sortieren bringt m. E. nicht so viel, wonach sollte ich sie sortieren.

Irgendwie stehe ich jetzt seit drei Tagen auf dem Schlauch....

....probiert habe ich es schon mit einem Zwischenarray, welches sich merkt, welche Types sichtbar sind, funktionierte aber auch nicht so doll.

Bin für jeden Tipp dankbar Very Happy
Gruß
TheoTheoderich
--
The box label said, "Requires Windows XP or better.", so I bought an Amiga Computer.

Chrise

Betreff: Re: Types and Array verknüpfen

BeitragSo, Mai 24, 2009 10:48
Antworten mit Zitat
Benutzer-Profile anzeigen
ich versteh zwar nicht ganz, was du meinst. Aber vll könntest du ja irgendwie die Handles speichern und dann immer mit Object aufrufen?
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

Eingeproggt

BeitragSo, Mai 24, 2009 11:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Wenn jetzt nun alle sichtbaren Tiles berechnet werden, so sollen auch nur die SmokeTypes gezeichnet werden, die auch sichtbar sind.


Sorry falls da nch etwas Restalkohol mitredet aber:
Wo ist das Probem? Du vergleichst die Koordinaten deines Rauches einfach mit dem "Viewport"... also den Koordinaten des Ausschnitts der gerad sichtbar ist. Etwa so:

Code: [AUSKLAPPEN]
If smoke\x>map_scroll_x and smoke\x<map_scroll_x+gfx_width Then
  If smoke\y>map_scroll_y and smoke\y<map_scroll_y+gfx_height Then
    ;Zeichnen
  Endif
Endif


mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Noobody

BeitragSo, Mai 24, 2009 11:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest ein weiteres Array mit Types erstellen Code: [AUSKLAPPEN]
Dim TypeArray.TSmoke( MapWidth, MapHeight )


Beim Erstellen steckst du den Rauch in das Array und kannst so nur die sichtbaren zeichnen (dafür geht halt nur ein Rauchtype pro Tile, ausser, du fügst noch eine dritte Dimension beim Array hinzu).
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

theotheoderich

BeitragSo, Mai 24, 2009 11:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Antworten,

das Problem liegt an einer etwas anderen Stelle, die ich noch nicht beschrieben hatte.

Das ganze spielt auf einer Iso-Tilemap und soll Raucheffekte für z. B. Fabriken liefern.

Die Iso Map wird in mehreren Layern gezeichnet. Vereinfacht dargestellt erst der Untergrund, dann Gebäude und Raucheffekte.

Das Problem ist, dass ich die sichtbaren Types nicht einfach zeichnen kann, da sie sich sonst mit den Gebäuden überlappen würden.
Die Gebäude werden von hinten nach vorne gezeichnet, so dass die vordersten Gebäude die dahinterstehenden überlappen. Genau so soll es auch mit den Raucheffekten sein. Der Rauch einer Fabrik soll z. B. von einem davor stehenden Hochhaus verdeckt sein.

Wenn ich nun für jedes sichtbare Tile, das gezeichnet wird, die kompletten Types mit ForEach durchgehen würde und dann nur die zum Tile passenden Types zeichnen würde, dann klappt es.
Aber das wäre ja der PerformanceKiller überhaupt Wink

Würde ich einfach nur die sichtbaren Types einzeichnen, so würden sie immer hinter oder vor den Gebäuden liegen aber nicht in die Tiefe gestaffelt.


Ist ein bissl schwer zu beschreiben, wahrscheinlich denke ich wieder zu kompliziert.

So wie Noobody geschrieben hat, habe ich es in meiner Programmversion letztes Jahr gemacht, aber es nimmt sehr viel Speicher weg, da ich insgesamt 4 Dimensionen brauche:
Dim TypeArray.TSmoke( MapWidth, MapHeight, Schornstein (max. 4 möglich), 64 (mögliche Anzahl Rauchwolken))
Gruß
TheoTheoderich
--
The box label said, "Requires Windows XP or better.", so I bought an Amiga Computer.

Noobody

BeitragSo, Mai 24, 2009 12:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, das mit den vier Dimensionen nimmt in der Tat einiges an Speicher weg, zumal ja die vierte Dimension 64 Rauchwolken umfassen soll.
Du kannst aber den Speicherverbrauch massiv verringern, indem du deine Types sortierst.

Dadurch kannst du dein Array von vier auf drei Dimensionen zurückstufen (sieht dann ungefähr so aus Code: [AUSKLAPPEN]
Dim SmokeArray.TSmoke( MapWidth, MapHeight, Schornstein )

Der Type, der in SmokeArray( X, Y, Schornstein ) liegt, ist dann die erste Rauchwolke. Alle Types, die zu einer X/Y Position und dem gleichen Schornstein gehören, ordnest du dann in der Typeliste hintereinander. Erstellst du einen neuen Type, so könnte das ungefähr so aussehen Code: [AUSKLAPPEN]
Function CreateSmoke( X, Y, Schornstein )
   Local Smoke.TSmoke = New TSmoke
   
   ; Hier wäre dann Erstellungskram
   
   If SmokeArray( X, Y, Schornstein ) = Null Then ;An diesem Schornstein befindet sich noch kein Rauch
      SmokeArray( X, Y, Schornstein ) = Smoke ;Ab ins Array
   Else ;Hier ist schon Rauch, also hängen wir die Rauchwolke hinten an die Liste an
      Local Current.TSmoke = SmokeArray( X, Y, Schornstein )
      Local Successor.TSmoke = After Current
      
      While True
         If Current\X <> Successor\X Or Current\Y <> Successor\Y Or Current\Schornstein <> Successor\Schornstein Then
            Insert Smoke After Current ;Hinten an die Liste anhängen
            Exit ;Nix wie raus hier
         Else
            Current = Successor
            Successor = After Current
            
            If Successor = Null Then
               Insert Smoke After Last TSmoke
               Exit
            EndIf
         EndIf
      Wend
   EndIf
End Function


Die Zeichenroutine würde dann diese Liste abrattern und den Rauch zeichnen Code: [AUSKLAPPEN]
Function DrawSmoke( TileX, TileY, Schornstein )
   If SmokeArray( X, Y, Schornstein ) <> Null Then
      Local Current.TSmoke = SmokeArray( X, Y, Schornstein )
      Local Successor.TSmoke = After Current
      
      While True
         DrawSmoke( Current )
         
         If Successor = Null Then Exit
         If Current\TileX <> Successor\TileX Or Current\TileY <> Successor\TileY Or Current\Schornstein <> Successor\Schornstein Then Exit
         
         Current = Successor
         Successor = After Current
      Wend
   EndIf
End Function


Damit wird der Speicherverbrauch für das Array 64mal kleiner, womit die Arraymethode einigermassen benutzbar sein sollte.

Ich hoffe, ich habe das einigermassen verständlich erklärt Razz
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group