So I'm making a personal map editor, Just completed a small portion of the grid snapping (In between the comments 'FROM HERE' to 'TO HERE'). I find my method for the grid snapping to be very sloppy, Was wondering if anyone knew a better method for a relevant grid snap? Also, I'm very sure there's better methods for almost everything in the code, if you see where then please feel free to point it out
Gosub _SetUp
Make object cube 10,5
Point camera 0,Object position X(10),Object position Y(10), Object position Z(10)
ID=11
Make matrix 1,500,500,50,50
DO `Main do/loop
Gosub _Camera
Gosub _Pick
Gosub _SelectObject
TEXT 10,10,Temp1$
TEXT 10,30,Temp3$
TEXT 10,80,Str$(PickX#)
TEXT 10,100,Str$(PickZ#)
SYNC
LOOP
_SetUp:
Sync on : Sync rate 30
DesktopWidth#=Desktop width() : DesktopHeight#=Desktop height() : DesktopDepth#=Screen depth()
HalfDesktopWidth#=Desktop width()/2 : HalfDesktopHeight#=Desktop Height()/2
Set display mode DesktopWidth#,DesktopHeight#,DesktopDepth# : Set window title "Engine" : Maximize window
Backdrop on : Color backdrop RGB(0,0,0) : Set image colorkey 0,0,0
Autocam off : Position camera 0,-30,30,-30 : Fog distance 0 : Set camera range 1,1000
hide light 0 : Set ambient light 75
RETURN
_Pick:
pick screen mousex(),mouseY(),1
PickX# = get pick vector x()
PickY# = get pick vector y()
PickZ# = get pick vector z()
dy# = -camera position y()/pickY#
PickX# = PickX#*dy# + camera position x()
PickZ# = PickZ#*dy# + camera position z()
`FROM HERE! <--------------------------------------------------------------------------------------------------------------------------
GRID=10
Temp10=PickX#
Temp1$=Str$(Temp10)
Temp2$=Right$(Temp1$,1)
Temp1=Val(Temp2$)
IF Temp1 > GRID/2 AND Temp1 <=9
Temp2=GRID-Temp1
PickX#=PickX#+Temp2
ENDIF
IF Temp1 <= GRID/2 AND Temp1 >0
Temp2=GRID-Temp1
PickX#=PickX#+Temp2
ENDIF
Temp11=PickZ#
Temp3$=Str$(Temp11)
Temp4$=Right$(Temp3$,1)
Temp3=Val(Temp4$)
IF Temp3 > GRID/2 AND Temp3 <=9
Temp4=GRID-Temp3
PickZ#=PickZ#+Temp4
ENDIF
IF Temp3 <= GRID/2 AND Temp3 >0
Temp4=GRID-Temp3
PickZ#=PickZ#+Temp4
ENDIF
`TO HERE! <-----------------------------------------------------------------------------------------------------------------------------
IF Selected>0 THEN Position object Selected,Floor(PickX#),0,Floor(PickZ#)
RETURN
_SelectObject:
IF MouseClick()=1 AND LeftMouseClickDelay=0 THEN LeftMouseClickDelay=1; Selected = Pick object(MouseX(),MouseY(),10,11) `Is no item held? Then lets grab it!
IF MouseClick()=0 AND LeftMouseClickDelay=1 THEN LeftMouseClickDelay=2 `Did we let go of left click after just grabbing the item?
IF MouseClick()=1 AND LeftMouseClickDelay=2 THEN Selected=0; LeftMouseClickDelay=3 `Are we holding an item and trying to drop it? Then lets drop it!
IF MouseClick()=0 AND LeftMouseClickDelay=3 THEN LeftMouseClickDelay=0 `Did we let of of left click after droping the item? Then let's get ready to grab a new one!
RETURN
_Camera:
`Rotation
TempCamRotX#=MouseMoveX()
TempCamRotY#=MouseMoveY()
Position mouse HalfDesktopWidth#,HalfDesktopHeight#
Inc CamRotX#, TempCamRotX#/5
Inc CamRotY#, TempCamRotY#/5
CamRotX#=Wrapvalue(CamRotX#)
CamRotY#=Wrapvalue(CamRotY#)
Rotate camera 0,CamRotY#,CamRotX#,0
`move
IF Keystate(17)=1 THEN Move camera 0,5
IF Keystate(31)=1 THEN Move camera 0,-5
IF Keystate(30)=1 THEN Turn camera left 0,90 : Move camera 0,5 : Turn camera right 0,90
IF Keystate(32)=1 THEN Turn camera right 0,90 : Move camera 0,5 : Turn camera left 0,90
RETURN
Look around with the mouse, move around with W/A/S/D & select the block with the left mouse click (same to drop it)
Thanks for any help! ^^