Types and Array verknüpfen
Übersicht

![]() |
theotheoderichBetreff: Types and Array verknüpfen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo zusammen,
trotzt Suche habe ich bisher noch nicht so die für mich perfekte Lösung gefunden ![]() 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 ![]() |
||
Gruß
TheoTheoderich -- The box label said, "Requires Windows XP or better.", so I bought an Amiga Computer. |
![]() |
ChriseBetreff: Re: Types and Array verknüpfen |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group