Tileruudukon koordinaatisto on kiinnitetty siten, että "salmiakin" ylänurkan tile tottelee koordinaatteja (1, 1). X kasvaa oikealle alaviistoon ja Y vastaavasti vasemmalle alaviistoon.
Koodia:
Code: Select all
SCREEN 640, 480, 0, 1
SetWindow "Koordinaatistomuunnos isometriseen ruudukkoon"
Global gMouseTileX, gMouseTileY As Integer
Dim OrigX, OrigY, TileRX, TileRY, W, H As Integer
OrigX = 275 //Ruudukon sijainti
OrigY = 100
TileRX = 20 //Tilen mitat
TileRY = 10
W = 15 //Tileruudukon mitat (tilejä)
H = 12
Dim mx, my, mvx, mvy, i As Integer
Repeat
mx = MouseX()
my = MouseY()
mvx = MouseMoveX()
mvy = MouseMoveY()
//Hiiren klikkaus siirtää ruudukkoa
If MouseDown(1) Then
OrigX = OrigX + mvx
OrigY = OrigY + mvy
EndIf
getMouseIsoCoords(OrigX,OrigY,TileRX,TileRY, mx, my)
Color 255, 255, 255
ClearText
AddText "MouseX: " + mx
AddText "MouseY: " + my
AddText "OrigX: " + OrigX
AddText "OrigY: " + OrigY
AddText "TileX: " + gMouseTileX
AddText "TileY: " + gMouseTileY
//Ruudukon piirto
For i = 0 To W
Line OrigX + i*TileRX, OrigY + i*TileRY, OrigX - H*TileRX + i*TileRX, OrigY + H*TileRY + i*TileRY
Next i
For i = 0 To H
Line OrigX - i*TileRX, OrigY + i*TileRY, OrigX + W*TileRX - i*TileRX, OrigY + W*TileRY + i*TileRY
Next i
//Merkitään tile, jonka päällä hiiri on
If gMouseTileX > 0 And gMouseTileX <= W And gMouseTileY > 0 And gMouseTileY <= H Then
Color 255, 0, 0
Circle OrigX + (gMouseTileX - 1)*TileRX - (gMouseTileY - 1)*TileRX, OrigY + (gMouseTileX - 1)*TileRY + gMouseTileY*TileRY, 3
EndIf
DrawScreen
Forever
//PARAMTERIT:
//Ruudukon yläkulma on pisteessä (Ax, Ay)
//tileRadiusX ja -Y ovat tilen leveyden ja korkeuden puolikkaat
//(Px, Py) on piste, jolle koordinaatistomuunnos suoritetaan (yleensä hiiren sijainti)
Function getMouseIsoCoords(Ax#, Ay#, tileRadiusX#, tileRadiusY#, Px#, Py#)
Dim v0x#, v0y#, v1x#, v1y#, v2x#, v2y# As Float
Dim dot00#, dot01#, dot02#, dot11#, dot12# As Float
Dim invDenom#, x#, y# As Float
v0x# = -tileRadiusX
v0y# = tileRadiusY
v1x# = tileRadiusX
v1y# = tileRadiusY
v2x# = Px# - Ax#
v2y# = Py# - Ay#
dot00# = v0x#*v0x# + v0y#*v0y#
dot01# = v0x#*v1x# + v0y#*v1y#
dot02# = v0x#*v2x# + v0y#*v2y#
dot11# = v1x#*v1x# + v1y#*v1y#
dot12# = v1x#*v2x# + v1y#*v2y#
invDenom# = 1.0 / (dot00 * dot11 - dot01 * dot01)
gMouseTileX = RoundUp((dot00 * dot12 - dot01 * dot02) * invDenom)
gMouseTileY = RoundUp((dot11 * dot02 - dot01 * dot12) * invDenom)
EndFunction