Bestimmtes Tile auf Tilemap verschwinden lassen.

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

GearTechDE

ehemals 'KillerJo96'

Betreff: Bestimmtes Tile auf Tilemap verschwinden lassen.

BeitragSa, Jun 16, 2012 11:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, ich weiß, dass es einen Thread mit dem Namen schon gibt und habe ihn auch schon tausend mal durchgelesen. Jedoch hat mir das nicht wirklich weitergeholfen. Ich habe jetzt langsam verstanden wie ich mit einem Array umgehen kann. Auch weiß ich, wie Types funktionieren. Im den Thread stand drin das ich die Tiles mit einem Type zeichnen soll oder so ähnlich, wie gesagt ich hab das nicht so ganz verstanden. So hab ich das dann auch gemacht, aber sobald ich ein Tile gezeichnet habe, habe ich eine Framerate von ungefär 1 oder so. Also fängt es total an zu hängen.

Deswegen frage ich euch, ob mir hierbei jemand noch mal helfen kann, denn bei einem Array kann man ja nicht so leicht Delete Karte(x,y) oder so machen... Sad
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragSa, Jun 16, 2012 11:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe nicht so recht, was das Problem sein soll. Wenn du ein Array hast, kannst du einen Wert darin ganz einfach auf 0 setzen. Wenn das Tileset in Frame 0 Leer ist, war's das auch schon.
Wie sieht denn dein Code aus?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

GearTechDE

ehemals 'KillerJo96'

BeitragSa, Jun 16, 2012 11:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Du meinst, ich soll sozusagen einen Leerlauf Frame ins Tileset einbauen, welcher z.B. die Farbe 255,0,255 hat und das rausschneiden, und dann ein würde der Hintergrund gezeichnet werden weil das Tile transparent ist. Nun gut, aber wie kann man das ganze dann bei 3D lösen?
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragSa, Jun 16, 2012 11:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitte erkläre, was genau du machst, raten zu müssen macht es nicht einfacher, dir zu helfen.
Du hast keine 2D Tilemap sondern verteilst Cubes...?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

GearTechDE

ehemals 'KillerJo96'

BeitragSa, Jun 16, 2012 11:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich möchte zuerst einen 2D Tilemap editor machen und dann Minecraft in 3D einfach mal den boden wobei ich mit der maus dann schon ein Cube wegmachen möchte. Bei dem map editor möchte ich mit rechter maustaste das tile entfernen
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragSa, Jun 16, 2012 12:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Diese wage Beschreibung hilft mir nicht weiter. Befindet sich das Problem jetzt in 2D oder 3D? Wo befinden wir uns, was funktioniert nicht?
Code (ausschnittsweise) würde womöglich helfen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

GearTechDE

ehemals 'KillerJo96'

BeitragSa, Jun 16, 2012 12:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, sorry, ich war wohl etwas zu schnell.

Es handelt sich im Prinzip um beides (2d und 3d). jedoch will ich erstmal in 2d schaffen.
Mein ansatzcode in 2D:

BlitzBasic: [AUSKLAPPEN]

Graphics 800,600,32,2
SetBuffer BackBuffer()

Local ft = CreateTimer(60)

Const mapx = 24, mapy = 16
Const tilesize = 32,origin_tile = 16
Global tileset
Dim karte(mapx,mapy)

Type tile

Field tile%
Field x%,y%

End Type

tileset = LoadAnimImage("data/gfx/tileset.png",origin_tile,origin_tile,0,64)
ScaleImage tileset,2,2

For x = 0 To mapx
For y = 0 To mapy

karte(x,y) = 0
t.tile = New tile
t\tile = 0
t\x = x
t\y = y

Next
Next


Repeat
Cls

For x = 0 To mapx
For y = 0 To mapy

For t.tile = Each tile

DrawBlock tileset,t\x*tilesize,t\y*tilesize,karte(x,y)

If MouseHit(2) And MouseX()/tilesize = x And MouseY()/tilesize = y Then

Delete t

End If

Next

Next
Next

Flip
WaitTimer(ft)
Until KeyHit(1)
End


ich möchte also durch rechtsklick das tile löschen was gerade mit der maus überlappt wird. aber das zeichnen dauert schon sooooo ewig und das, weil das type durchgelaufen wird, ist das normal?

Edit:
BlitzBasic: [AUSKLAPPEN]

Graphics 800,600,32,2
SetBuffer BackBuffer()

Local ft = CreateTimer(60)

Const mapx = 24, mapy = 16
Const tilesize = 32,origin_tile = 16
Global tileset,tilecount%
Dim karte(mapx,mapy)

Type tile

Field tile%
Field x%,y%

End Type

tileset = LoadAnimImage("data/gfx/tileset.png",origin_tile,origin_tile,0,64)
ScaleImage tileset,2,2

For x = 0 To mapx
For y = 0 To mapy

t.tile = New tile
t\tile = 1
t\x = x
t\y = y
tilecount = tilecount + 1

Next
Next


Repeat
Cls
For t.tile = Each tile

DrawBlock tileset,t\x*tilesize,t\y*tilesize,t\tile

If MouseDown(2) And MouseX()/tilesize = t\x And MouseY()/tilesize = t\y Then

Delete t
tilecount = tilecount -1

End If

Next

Text 0,0,tilecount

Flip
WaitTimer(ft)
Until KeyHit(1)
End


so funzt es jetz aber jetz arbeite ich ja nich mehr mit nem array, und das speichern wird schwerer.
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragSa, Jun 16, 2012 12:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem scheint mir zu sein, dass du Arrays und Types noch nicht vollständig verstanden hast.
Du erstellst ein Array:
Code: [AUSKLAPPEN]
Dim karte(mapx,mapy)

Das kann integer beinhalten, aber benutzen tust du es nicht. Stattdessen erzeugst du mapx mal mapy tile-Objekte.
Was du tun wolltest war vielleicht:
Code: [AUSKLAPPEN]
Dim karte.tile(mapx,mapy)

karte(x,y) = New tile
karte(x,y)\tile = 0
karte(x,y)\x = x
karte(x,y)\y = y

Es ist kein Wunder, wenn die drei Schleifen ewig brauchen, rechne mal nach, wie oft da durchiteriert wird!

Ist im Beginners-Corner besser aufgehoben, daher:
~VERSCHOBEN~
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
  • Zuletzt bearbeitet von Xeres am Sa, Jun 16, 2012 12:23, insgesamt einmal bearbeitet

GearTechDE

ehemals 'KillerJo96'

BeitragSa, Jun 16, 2012 12:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wusste garnicht das man sie so miteinandern kombinieren kann. Danke für den Tipp.
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragSa, Jun 16, 2012 12:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Benutze hier kein For...Each Type Konstrukt. Ein Array ist perfekt für eine Tilemap. Man kann die Koordinaten berechnen, um nur den Bildausschnitt zu verarbeiten und direkt jeden Eintrag bearbeiten.
Bei Types muss man ggf. alle Objekte überprüfen bevor man etwas mit ihnen anstellt, dass ist nur in Sonderfällen Wünschenswert.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

PhillipK

BeitragSa, Jun 16, 2012 12:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Puh, zugegeben, ich bin nicht ganz in blitzbasic drinne, aber etwas lässt mich doch stutzen:

Wenn ichs richtig verstanden habe, kann man Types in BB durchlaufen, wie in blitzmax eine for-eachin schleife.

Dh, mir erscheint der grund für die verschachtelung nicht ganz:

For x to mapx
for y to mapy
for jeden-type-eintrag ?

Vorher erstellst du für jedes X,Y einen type und legst einen wert in Karte ab.
Also wäre es nur praktisch, wenn du ENTWEDER x,y abklapperst ODER das Type - könnte dein "aber das zeichnen dauert schon sooooo ewig" erklären Smile

Aber wie gesagt, ich bin nicht ganz auf der höhe was bb angeht.
Um meinen gedankenganz vorzurechnen:
mapX = 24.
mapY = 16
Macht: 384 blöcke (ergo auch 384 type einträge)
Dh: 384x werden 384 typeinträge durchlaufen, was einem wert von 147456 entspricht.

Da ich keine ahnung habe, wie man in bb koordinaten mit typeeinträgen verknüpfen kann, rate ich einfach mal dazu, die Koordinate im Tileset mit ins Type zu legen und die verschachtelung aus der hautpschleife rauszunehmen.

Dazu kommt, das ich ein strikter fan davon bin, update und zeichnen zu trennen.
Da ich hier allerdings auch nicht so recht weiß, wie das gehen soll, mal eine kleine idee zur änderung:

BlitzBasic: [AUSKLAPPEN]

Repeat
Cls

Local mX = MouseX() ; hier ablegen, um unnötige funktionsaufrufe zu dezimieren
Local mY = MouseY() ; s.o.
Local mouse_mapX = mX / tilesize ;auf das raster der bloecke bringen!
Local mouse_mapY = mY / tilesize

Local RMB = MouseHit(2) ;speichern. Da blitzmax bei MouseHit() das event direkt auch löscht, nehme ich an, das BB das genauso handhabt. Könnte ein grund sein, warum dein Tile nicht verschwindet :)

For t.tile = Each tile

DrawBlock tileset,t\x*tilesize,t\y*tilesize,karte(x,y)

If RMB And t\tile_pos_x = mouse_mapX And t\tile_pos_y = mouse_mapY Then

Delete t

End If

Next


Flip
WaitTimer(ft)
Until KeyHit(1)


So sollte es, von der logik her, klappen.
Schöner wäre es allerdings, direkt über das Dim feld arbeiten zu können, aber da müssen die profis her.
Mit dem Dim feld hättest du auch die möglichkeit, die aufrufe extrem zu veringern, wenn du mit einer größeren map arbeitest, du über die bildschirmbreiten hinausgeht.

GearTechDE

ehemals 'KillerJo96'

BeitragSa, Jun 16, 2012 12:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Jahh, Danke ich habe es jetzt bei mir eingebaut. Es funktioniert so wie ich es haben wollte.

Danke Wink
Mit freundlichen Grüßen: GearTechDE

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group