Cursorsnapping auf einer isometrischen Tilemap

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Horst der Biber

Betreff: Cursorsnapping auf einer isometrischen Tilemap

BeitragDi, Sep 19, 2006 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin

Wollt mal fragen, ob jemand weiss, wie man den Cursor auf einem 32x32er Isoraster snappen lassen kann.

Meine Methode is etwas ungenau, weil sie auf einem 32x16 Blockraster basiert.

Das Tile

Code: [AUSKLAPPEN]
Const TILEX=32
Const TILEY=32

Const MAPX=20
Const MAPY=20

SetGraphicsDriver GLMax2DDriver()
Graphics 800,600,0,60
SetClsColor 230,230,230

SetMaskColor 100,200,0
AutoImageFlags MASKEDIMAGE

Global tile=LoadAnimImage("tile 1zu1.png",TILEX,TILEY,0,2)
Global sel=LoadAnimImage("tile 1zu1.png",TILEX,TILEY,0,2)
Global sx,sy

Global map:Byte[MAPX,MAPY]
For local ix=0 To MAPX-1
For local iy=0 To MAPY-1
map(ix,iy)=1
Next
Next

Repeat
sx=(MouseX()-(MouseX() Mod 16))/16
sy=(MouseY()-(MouseY() Mod 32))/32

Cls

SetColor 255,255,255
ix=0
iy=0
For ix=0 To MAPX-1
For iy=0 To MAPY-1 Step 2
Local zickzack:Byte=ix Mod 2
DrawImage tile,ix*16,iy*16+zickzack*16,map(ix,iy+zickzack)
Next
Next

SetColor 255,80,0

DrawImage sel,sx*16,sy*32 +(sx Mod 2)*16,1

Flip
Until KeyHit(KEY_ESCAPE) Or AppTerminate()
End
  • Zuletzt bearbeitet von Horst der Biber am Di, Sep 19, 2006 18:00, insgesamt einmal bearbeitet
 

Dreamora

BeitragDi, Sep 19, 2006 17:54
Antworten mit Zitat
Benutzer-Profile anzeigen
einfach int(koordinate/32) * 32
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Horst der Biber

BeitragDi, Sep 19, 2006 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Funzt da nicht, weil das ne Isotilemap ist..
 

Dreamora

BeitragDi, Sep 19, 2006 18:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun, du müsstest dann natürlich die Position ebenfalls in deine Iso Perspektive projizieren, wie du es mit den anderen Koordinaten (zeichnen etc) auch machst.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Horst der Biber

BeitragDi, Sep 19, 2006 19:33
Antworten mit Zitat
Benutzer-Profile anzeigen
hm.. kannst des ma coden wie du meinst?

weil so ich wie ich des jetzt versteh würden dann immer lücken zwischen den tiles bleiben..

Code: [AUSKLAPPEN]
Const TILEX=32
Const TILEY=32

Const MAPX=20
Const MAPY=20

SetGraphicsDriver GLMax2DDriver()
Graphics 800,600,0,60
SetClsColor 230,230,230

SetMaskColor 100,200,0
AutoImageFlags MASKEDIMAGE

Global tile=LoadAnimImage("tile.png",TILEX,TILEY,0,2)
Global sel=LoadanimImage("tile.png",TILEX,TILEY,0,2)
Global sx,sy

Global map:Byte[MAPX,MAPY]
Global ix,iy
For ix=0 To MAPX-1
For iy=0 To MAPY-1
map(ix,iy)=1
Next
Next

Repeat
sx=Int(MouseX()/32)*32
sy=Int(MouseY()/32)*32

Cls

SetColor 255,255,255
For ix=0 To MAPX-1
For iy=0 To MAPY-1
DrawImage tile,ix*32,iy*32,map(ix,iy)
Next
Next

SetColor 255,80,0

DrawImage sel,sx,sy,1

Flip
Until KeyHit(KEY_ESCAPE) Or AppTerminate()
End
 

Dreamora

BeitragDi, Sep 19, 2006 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun, ich sehe da keine Iso Koordinatenberechnung

Du hast scheinbar die Grafiken in "IsoPerspektive".

In diesem Falle solltest du dich vielleicht mit der Koordinatenprojektion von 2D nach Iso beschäftigen (wird auch benötigt, damit du so etwas wie eine "Höhe,Tiefe,Breite" hast. Denn eine der 3 Dimensionen existiert einfach mit Tiles alleine nicht)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Horst der Biber

BeitragDi, Sep 19, 2006 21:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Nun, ich sehe da keine Iso Koordinatenberechnung


das liegt daran, dass ich das in dem Beispiel so getan hab, wie du es vorher beschrieben hattest. (int(koordinate/32) * 32)

das mit der isodarstellung lief schon (code is in meinem ersten beitrag) nur ohne gridsnapping... -_-
 

Dreamora

BeitragDi, Sep 19, 2006 21:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Und wo soll es da genau eine Iso Koordinatenberechnung haben?
Das ist eine Zeichnungsroutine für Tiles, soweit ich das sehe (ausser ich hätte etwas übersehen)
ob die Tiles nun quadratisch, rechteckig oder Hex sind ändert nichts. Nur deswegen ist es noch lange nicht Iso.

Wie gesagt, Iso ist eine Projektion von 3D nach 2D, womit sie obwohl es nur 2D Dimensionen hat dennoch Tiefe, Breite und Höhe existieren und auch in die Berechnungen einfliessen.

Und für das Maussnapping musst du die Mauskoordinaten in "Isokoordinaten" umrechnen, sprich sie zurückprojizierten von 2D nach 3D (wie du es in 3D mit CameraPick machen würdest)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
  • Zuletzt bearbeitet von Dreamora am Di, Sep 19, 2006 22:14, insgesamt einmal bearbeitet
 

Ava

Gast

BeitragDi, Sep 19, 2006 22:08
Antworten mit Zitat
Wenn Du mal etwas geschickt nach Iso (womöglich Code oder Tutorials) googelst, wirst Du einige sehr gute Beispiele finden, die Dir auch die Umberechnung der Koordinaten erklären bzw. direkt Formeln dafür anbieten.

Smile

BladeRunner

Moderator

BeitragDi, Sep 19, 2006 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn Du die Koordinaten des Tiles ermitteln willst auf welches die Mau zeigt würde ich Dir raten beim Zeichnen der Tiles zu prüfen ob das gezeichnete Tile sich mit dem Mousezeiger (bzw. dessen Hotspot) schneidet. Wenn ja hast Du dein Tile. Vorteil: Es funktioniert auch wenn das gezeichnete Objekt die Tilegrenzen überschreitet.
Nachteil: eine etwas höhere Berechnungszeit da immer alle Tiles geprüft werden die auch gezeichnet haben.
Dem kannst Du allerdings entgehen indem Du eine grobe Koordinatenprüfung vornimmst - Du kannst alle Tiles ignorieren deren Koordinaten über dem Mouseuzeiger + der Tiletiefe liegen. Seitlich gibt es ebenfalls die Möglichkeit einer Grobeingrenzung, da Du ja anhand der Tilebreite und der Tilenummer weisst wo es liegt. Hier würde ich auch etwaqs Sicherheitsabstand lassen, da ein Objekt das Tile ja seitlich überragen kann. Wieviel Du an Abstand kalkulierst musst Du anhand Deiner Tiles flexibel entscheiden.
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

D2006

Administrator

BeitragDi, Sep 19, 2006 23:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Das hier kriegt man raus, wenn man hier in der Sidebar nach "iso" sucht.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group