Ganz bestimmtes Type löschen?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Gizeh

Betreff: Ganz bestimmtes Type löschen?

BeitragMi, Nov 08, 2006 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Ihr Lieben Smile

Ich suche Hilfe Smile Und zwar: In einem Editor soll jedes gesetzte Tile (jeweils ein Type) nach Bedarf jederzeit auch wieder gelöscht werden sollen.
D.h. auch wenn ich nach dem Setzen eines Tiles schon zig andere gesetzt habe, und erst dann das alte wieder löschen möchte (z.B. mit erneutem darauf klicken, und intern mit Delete) - wie greife ich exakt darauf zu?

Bekannt sind für jedes Tile (für jeden erstellten Type) dessen Position (Spalte und Reihe - also beispielsweise Selected\col und Selected\row) - kann mir das irgendwie helfen, auf das spezielle Type zuzugreifen und es gezielt zu löschen?

Eine Möglichkeit, die mir einfällt wäre höchstens, bei jedem Setzen eines Tiles im Editor eine Zähl-Variable mitlaufen zu lassen - und dann bei einem Löschen die entsprechende Anzahl mit Before durch die Types zurückzugehen, und so dann auf das entsprechende und zu löschende zuzugreifen - aber das scheint mir unelegant?

Falls ich ganz und gar auf dem Holzweg sein sollte, wäre ich in dem Falle auch froh über generelle Tipps, wie man in einem Tile-Editor gesetzte Tiles am elegantesten wieder löschen kann (optisch sowie speichermäßig).

Gruß! Smile
  • Zuletzt bearbeitet von Gizeh am Mi, Nov 08, 2006 15:49, insgesamt einmal bearbeitet

Blitzcoder

Newsposter

BeitragMi, Nov 08, 2006 15:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst ja mir Before, After, Last etc. die Types durchgehen. Am einfachsten mit For each (siehe Onlinehilfe) . Falls du einzelne Felder löschen willst, das geht nicht. Du kannst sie nur auf 0 setzten. Löschen geht so:

Code: [AUSKLAPPEN]

type Ttile
    field x,y
End Type

for tmp.Ttile = each Ttile
    if tmp\x=10 and tmp\y=13 then delete tmp
next


Evtl. musst du dann natürlich die umliegenden Tiles umsetzten, z.B. alle darunter eins hoch setzten. Dazu kannst du noch eine schleife setzten, die dann alle Tiles, bei denen x=10 und y>13 eins nach oben setzten.
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)

PSY

BeitragMi, Nov 08, 2006 15:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoi,

also wenn Du ne 2D-Tilemap hast, wo nur x und y der Tiles gespeichert ist, hätt ich auf Types verzichtet und ein Dimfeld benutzt:


dim level(100,100)

global bombe = 12
global spieler = 20
global wand = 33


die einzelnen tiles würden dann so aussehn:

level (20,15) = wand
level (20,16) = wand
level (20,17) = wand
level (90,15) = spieler


Zu den Types:
Da ja Selected\col und Selected\row bekannt ist, musst Du per Schleife alle Types durchgehn und auf Übereinstimmung checken.

L8er,
PSY

(edit) muh. Blitzcoder war schneller. Sollte sich Blitzposter nennen Wink

Gizeh

BeitragMi, Nov 08, 2006 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
user posted image Ahhhh!

Danke für den Denkanstoss! Ja, das war genau das, was ich suchte Smile

Zitat:

for tmp.Ttile = each Ttile
if tmp\x=10 and tmp\y=13 then delete tmp
next


Zitat:

Zu den Types:
Da ja Selected\col und Selected\row bekannt ist, musst Du per Schleife alle Types durchgehn und auf Übereinstimmung checken.




PS: Ich benutze Types, da ich ja nicht nur die Grafiken, sondern zugleich auch die Eigenschaften der jeweiligen Tiles (z.B. benötigte Treffer usw.) mit speichere.
 

c64

BeitragDo, Nov 09, 2006 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
HI, sorry wollt schon heute morgen antworten ging aber aus Zeittechnischen gründen leider nicht und ja du hast schon eine Lösung.

!! ABER !!


Also für eine Map ist das echt easy und nix für ungut aber die vorgeschlagenen Lösungen entsprechen nicht dem, das was ich für gut halte Smile aber es sind Lösungen und auch keine falschen Wink.


Für eine Map würde ich noch nichteinmal ein Dimfeld nemen sondern eine Bank, und die Tiles würde ich als Type nemen so wie du es ja hast. So nun zum eigentlichen.

Code: [AUSKLAPPEN]


;/////////////////////////////////////////////////////
;/
;/
;/

Function Add_tile(MapID,pos_X,pos_Y,Layer=1)   
      
       If MapID
            
          HandleMap2D (MapID)
         
          BytePos      =   MapPos2Byte ( pos_X,pos_Y,Layer )

         Tile         =   New     Ttile
         Tile\ID      =   Handle (Tile)
         TIle\IMG     =   wall_002

          ;tile\PhysOBJ = Create_PhysObj_plane (pos_X*map\tile_sze_x,pos_y*map\tile_sze_y,map\tile_sze_x,map\tile_sze_y)

         PokeInt  ( map\map,bytepos,Tile\ID)
         
       EndIf
      
End Function

;/
;/
;/
;/////////////////////////////////////////////////////



;/////////////////////////////////////////////////////
;/
;/
;/

Function HandleTile(TileID)   
      
       If TileID
      
                   tile = Object ttile(tileID)
         
         Return tile\ID
         
         
       EndIf
      
End Function

;/
;/
;/
;/////////////////////////////////////////////////////



;/////////////////////////////////////////////////////
;/
;/
;/

Function DeleteTILE (TILEID)
      
       HandleTILE (TILEID)
      
       Delete TILE
      
End Function

;/
;/
;/
;/////////////////////////////////////////////////////




;---------------------------------------------------------------------------

;/////////////////////////////////////////////////////
;/
;/
;/

Function MapPos2byte (pos_X,pos_Y,Layer=1)

       Return ( ( pos_X + pos_y * map\sze_x) * 4 ) + ( (layer-1)  * (map\sze_X * map\sze_Y)  ) 
                      
End Function
   
;/
;/
;/
;/////////////////////////////////////////////////////

;---------------------------------------------------------------------------



;---------------------------------------------------------------------------

;/////////////////////////////////////////////////////
;/
;/
;/

Function Get_tile(MapID,pos_X,pos_Y, Layer = 1 )   
      
       If MapID
            
          HandleMap2D (MapID)
         
          BytePos = MapPos2Byte ( pos_X,pos_Y,Layer )

         TleID   = PeekInt (MAP\MAP,Bytepos)

          Return TleID
      
       EndIf
      
End Function

;/
;/
;/
;/////////////////////////////////////////////////////



Lass dir einfach mal diese Functionen durch den Kopf gehen Wink , achso es ist nur als denkansatz gedacht bzw. im Prinzip schon eine echt gute Lösung letztenendes musst du selber wissen wie du es lösen möchtest.


[Code2Text]

(ADD_TILE ) : Tile Addn und ID vergeben
(Handle_TILE) : ID Benutzen um Tile anzusprechen
(Delete_TILE) : ID Benutzen um Tile anzusprechen, und dann löschen


[/Code2Text]
Betreten verboten! Kinder haften für ihre Eltern!

Schranz0r

BeitragFr, Nov 10, 2006 1:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja Types sind da nicht gut.

Entweder :

Dim oder ein Array
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!HAUPTSACH et kost VIEL!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Jolinah

BeitragFr, Nov 10, 2006 11:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Entweder :

Dim oder ein Array


Wie wärs mit nem Type Array Wink

Genau so gut wie man Dim map#(10, 10) schreiben kann (float) geht das auch mit Types:

Code: [AUSKLAPPEN]
Type Tile
  Field layer1
  Field layer2
  Field layer3
End Type

Dim map.Tile(20, 20)

For y = 0 to 19
  For x = 0 to 19
    map(x, y) = new Tile
    map(x, y)\layer1 = 10
  Next
Next

map(5, 0)\layer2 = 20


So hat man den Vorteil dass es nicht 3-Dimensionale Arrays braucht für die Layer, auch wenn es natürlich genau gleich viel Speicher belegt. Aber ich finde es so irgendwie übersichtlicher.

Edit: Zudem kann man dann die Tiles immer noch mit For each durchgehen ohne dass man für x und y eine eigene For-Schleife machen muss (falls man einfach mal alle durchgehen will und x, y nicht wichtig ist). Löschen kann man die Types auch direkt per x und y Angabe.

BladeRunner

Moderator

BeitragFr, Nov 10, 2006 11:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Entweder :

Dim oder ein Array

Ein Dim ist ein array.

Und es spricht nichts gegen eine Typemap,wenn man sie vernünftig verwaltet.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Gizeh

BeitragFr, Nov 10, 2006 11:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Dank Euch für die Ansätze - ich werde sie überdenken!
Very Happy

x-pressive

BeitragFr, Nov 10, 2006 12:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei einem tile based game sind zwei Dinge wichtig:

Arrow Wenn man pro Feld mehrere Eigenschaften speichern möchte, Types verwenden. Nur so lassen sich viele Informationen sauber verwalten.

Arrow Bei einem tile based game ist es essentiell, das man jederzeit gezielt (und vor allem schnell!) auf ein bestimmtes Tile zugreifen kann, in dem man einfach nur die Zeile und Spalte angibt. Du kannst nicht jedesmal durch alle Tiles loopen, nur um ein bestimmtes Feld zu finden.

Also benutzt man am besten ein Array aus Type-Variablen. So kannst du beliebig viele Eigenschaften pro Tile speichern und jederzeit direkt auf jedes einzelne Feld zugreifen (durch Spalten- und Zeilennummer).

BlitzBasic: [AUSKLAPPEN]
; TYPE: EIN FELD AUF DEM SPIELFELD
Type TFeld
Field typ$
Field col%
Field row%
Field eigenschaft1%
Field eigenschaft2%
End Type

; SPIELFELD ERSTELLEN (ARRAY AUS TYPE-CONTAINERN)
; ALLE FELDER HABEN AM ANFANG DEN WERT "NULL"
Dim Spielfeld.TFeld(10,10)

; EIN BEISPIEL-TILE SETZEN (SPALTE 3, ZEILE 5):
Spielfeld(3,5) = New TFeld
Spielfeld(3,5)\typ$ = "HAUS"
Spielfeld(3,5)\col = 3
Spielfeld(3,5)\row = 5
Spielfeld(3,5)\eigenschaft1 = 123 ; IRGENDWAS

; EIGENSCHAFT EINES BESTIMMTEN TILES ÄNDERN:
Spielfeld(3,5)\typ$ = "SCHUPPEN"

; EIN TILE WIEDER VOM SPIELFELD LÖSCHEN:
Delete Spielfeld(3,5)

; TESTEN, OB EIN BESTIMMTES TILE EXISTIERT:
If Spielfeld(3,5) = Null Then RuntimeError "FELD EXISTIERT NICHT (LEER)!"
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

PSY

BeitragFr, Nov 10, 2006 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
sehr gute sache, xpressive. Exclamation

das beispiel sollte irgendwo gepinnt werden.
fragen zu maps/tiles im zusammenhang mit arrays\types tauchen doch andauernd auf

just my 2ct,
psy

Jolinah

BeitragFr, Nov 10, 2006 22:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab ja oben in etwa das gleiche gepostet, aber x-pressive hats besser beschrieben Wink Bin auch der Meinung, das ist in dem Fall wo mehrere Eigenschaften pro Tile gespeichert werden müssen, die sauberste Variante in BB. So Sachen wie map(5, 3, 0) = 1; map(5, 3, 1) = 70 usw. gehen zwar auch, aber ich finde es verwirrend.
  • Zuletzt bearbeitet von Jolinah am Fr, Nov 10, 2006 22:58, insgesamt einmal bearbeitet

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Nov 10, 2006 22:58
Antworten mit Zitat
Benutzer-Profile anzeigen
...Man kann auch direkt auf ein Type verweisen. Siehe dazu:
ql:Object
ql:Handle

u.a. im Code des Beitrags https://www.blitzforum.de/foru...hp?t=19846

@x-pressive
Echt schöndes Beispiel. Die Vielfalt der Types und das Zusammenspiel von Types und Dims wahren mir bisher noch nicht so nahe gelegt wie das Beispiel von dir da oben...

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group