Quick Grid Related Problem

BlitzMax Forums/BlitzMax Beginners Area/Quick Grid Related Problem

Hi all,

Just a quicky here, that I hope someone can advise me on. I have a grid that is 100x64 of 48x48 tiles. I just need to be able to set a variable to show me which X 'tile' I'm in, and which Y 'tile' I'm in. So it's the CaveX and CaveY variables, at the bottom of my code snippet.

This works fine when I don't scroll the screen, but goes skewhiff when I scroll around my map.

Here's the simple grid / movement routine.

	For x=0 To CaveWidth 'Draw a basic grid as a guide
		For y=0 To CaveHeight
			DrawRect (x*TileWidth)-OffsetX,(y*TileHeight)-OffsetY,TileWidth,TileHeight
		Next
	Next
	SetColor 0,0,0
	For x=0 To CaveWidth
		For y=0 To CaveHeight
			DrawRect ((x*TileWidth)+1)-OffsetX,((y*TileHeight)+1)-OffsetY,TileWidth-1,TileHeight-1
		Next
	Next
	
	If KeyDown(Key_Right) Then 'Move right across the map
		OffsetX:+4
	End If
	If KeyDown(Key_Left) Then 'Move left across the map
		OffsetX:-4
	End If
	If KeyDown(Key_Up) Then 'Move up the map
		OffsetY:-4
	End If
	If KeyDown(Key_Down) Then 'Move down the map
		OffsetY:+4
	End If

	SetColor 255,255,255
	
	CaveX=Floor(MouseX())/48
	CaveY=Floor((MouseY()+40)/40)-1


Cheers!
M

I don't know what you are doing, but I think it should be like this:
        CaveX=Floor((MouseX()+offsetx)/48)
	CaveY=Floor((MouseY()+offsety)/48)


Hi,

Cheers for that, I gave it a try, but it does'nt work correctly, as it shifts the 'current' square over to the right when I scroll.

Thanks though!
M.

I tryed it like this and it works:
SuperStrict
Local tilewidth:Int = 48
Local tileheight:Int = 48
Local offsetx:Int = 0
Local offsety:Int = 0
Local cavewidth:Int = 100
Local caveheight:Int = 100
Local x:Int
Local y:Int
Local cavex:Int = 40
Local cavey:Int = 50

Graphics 1024,768
Repeat
	Cls
	SetColor 200,200,0
	For x=0 To CaveWidth 'Draw a basic grid as a guide
		For y=0 To CaveHeight
			DrawRect (x*TileWidth)-OffsetX,(y*TileHeight)-OffsetY,TileWidth,TileHeight
		Next
	Next
	SetColor 0,0,0
	For x=0 To CaveWidth
		For y=0 To CaveHeight
			DrawRect ((x*TileWidth)+1)-OffsetX,((y*TileHeight)+1)-OffsetY,TileWidth-1,TileHeight-1
		Next
	Next
	
	If KeyDown(Key_Right) Then 'Move right across the map
		OffsetX:+4
	End If
	If KeyDown(Key_Left) Then 'Move left across the map
		OffsetX:-4
	End If
	If KeyDown(Key_Up) Then 'Move up the map
		OffsetY:-4
	End If
	If KeyDown(Key_Down) Then 'Move down the map
		OffsetY:+4
	End If

	SetColor 255,255,255
	
	CaveX=Floor(MouseX()+offsetx)/48
	CaveY=Floor((MouseY()+offsety)/48)
	DrawText cavex+"  "+cavey,20,20
Flip
Until KeyDown(key_escape)

maybe if you show more code, I can figure out what you are doing wrong.

Not a problem, your help is appreciated! :)

'Cave Editor v0.1
'(C) Matt Vinyl 
'Version Date: 01/06/2008


'--------General Declarations

Graphics 1024,768 'Screen width and height in pixels

SetBlend Alphablend

Const TileWidth=48 'Width of tile in pixels
Const TileHeight=48 'Height of tile in pixels
Const CaveWidth=100 'Width of cave in tiles
Const CaveHeight=64 'Height of cave in tiles

Type Tile 'Set up the tile type
	Field X 'X position of the tile
	Field Y 'Y position of the tile
	Field Tile 'The tile number
	Field State 'Tile state, has tile been parsed
End Type

Global Cave[CaveWidth,CaveHeight] 'Dimension the cave

Global OffsetX=0 'Movement offset flag (width)
Global OffsetY=0 'Movement offset flag (height)

Global CaveX=0 'X of currently selected grid tile
Global CaveY=0 'Y of currently selected grid tile

Global CurrentTile=1 'The currently selected tile to place in the map

Global TileCount=102

Global State=0 'A flag that denotes the current state of the programme
'0=Startup
'99=User as quit

HideMouse 'Hide the default mouse cursor


'--------Media Declarations

Global Tiles=LoadAnimImage ("gfx\tiles.png",48,48,0,TileCount) 'Load in the tile graphics


'--------Core Loop

Repeat

	Cls
	Fnc_Grid
	Fnc_Quit()
	Fnc_Debug()
	Flip

Until State=99 'Carry out loop until user quits


'--------Functions

Function Fnc_Quit() 'Quit the programme

	If KeyHit(Key_Escape) Then State=99

End Function

Function Fnc_Debug() 'Debug routines, to be removed before final version

	DrawText "MouseX:",0,0
	DrawText MouseX(),104,0
	DrawText "MouseY:",0,12
	DrawText MouseY(),104,12
	DrawText "CaveX:",0,24
	DrawText CaveX,104,24
	DrawText "CaveY:",0,36
	DrawText CaveY,104,36
	DrawText "Current Tile:",0,48
	DrawText CurrentTile,104,48

End Function

Function Fnc_Grid() 'Control moving around the grid
	
	SetColor 100,100,100
	
	For x=0 To CaveWidth 'Draw a basic grid as a guide
		For y=0 To CaveHeight
			DrawRect (x*TileWidth)-OffsetX,(y*TileHeight)-OffsetY,TileWidth,TileHeight
		Next
	Next
	SetColor 0,0,0
	For x=0 To CaveWidth
		For y=0 To CaveHeight
			DrawRect ((x*TileWidth)+1)-OffsetX,((y*TileHeight)+1)-OffsetY,TileWidth-1,TileHeight-1
		Next
	Next
	
	If KeyDown(Key_Right) Then 'Move right across the map
		OffsetX:+4
	End If
	If KeyDown(Key_Left) Then 'Move left across the map
		OffsetX:-4
	End If
	If KeyDown(Key_Up) Then 'Move up the map
		OffsetY:-4
	End If
	If KeyDown(Key_Down) Then 'Move down the map
		OffsetY:+4
	End If

	SetColor 255,255,255
	
	'CaveX=Floor((MouseX()+OffsetX)/48)
	'CaveY=Floor((MouseY()+OffsetY)/48)
	'CaveX=Floor(MouseX())/48 'Work out current grid square X
	'CaveY=Floor((MouseY()+40)/40)-1 'Work out current grid square Y
	DrawImage Tiles,CaveX*48,CaveY*48,CurrentTile 'Show current tile in position X Y

	If KeyHit(Key_Equals) Then 'Cycle through available tiles
		If CurrentTile<TileCount-1 Then 
			CurrentTile:+1
		Else
			CurrentTile=0
		End If
	End If
	If KeyHit(Key_Minus) Then
		If CurrentTile>0 Then 
			CurrentTile:-1
		Else
			CurrentTile=TileCount-1
		End If
	End If

End Function



Here's what I have so far. Note that I have commented out the two attempts I've tried so far.

do you want it to snap to grid?
do you want it to maintain aproximate screen position?
do you want it to move with the grid and disregard current mouse position?

is this what you want?
'Cave Editor v0.1
'(C) Matt Vinyl 
'Version Date: 01/06/2008


'--------General Declarations

Graphics 1024,768 'Screen width and height in pixels

SetBlend Alphablend

Const TileWidth=48 'Width of tile in pixels
Const TileHeight=48 'Height of tile in pixels
Const CaveWidth=100 'Width of cave in tiles
Const CaveHeight=64 'Height of cave in tiles

Type Tile 'Set up the tile type
	Field X 'X position of the tile
	Field Y 'Y position of the tile
	Field Tile 'The tile number
	Field State 'Tile state, has tile been parsed
End Type

Global Cave[CaveWidth,CaveHeight] 'Dimension the cave

Global OffsetX=0 'Movement offset flag (width)
Global OffsetY=0 'Movement offset flag (height)

Global CaveX=0 'X of currently selected grid tile
Global CaveY=0 'Y of currently selected grid tile

Global CurrentTile=1 'The currently selected tile to place in the map

Global TileCount=102

Global State=0 'A flag that denotes the current state of the programme
'0=Startup
'99=User as quit

HideMouse 'Hide the default mouse cursor


'--------Media Declarations

Global Tiles=LoadAnimImage ("gfx\tiles.png",48,48,0,TileCount) 'Load in the tile graphics


'--------Core Loop

Repeat

	Cls
	Fnc_Grid
	Fnc_Quit()
	Fnc_Debug()
	Flip

Until State=99 'Carry out loop until user quits


'--------Functions

Function Fnc_Quit() 'Quit the programme

	If KeyHit(Key_Escape) Then State=99

End Function

Function Fnc_Debug() 'Debug routines, to be removed before final version

	DrawText "MouseX:",0,0
	DrawText MouseX(),104,0
	DrawText "MouseY:",0,12
	DrawText MouseY(),104,12
	DrawText "CaveX:",0,24
	DrawText (CaveX+(offsetx/TileWidth)),104,24 '************** ***********************
	DrawText "CaveY:",0,36
	DrawText (CaveY+(offsety/TileHeight)),104,36 '*********** ************************
	DrawText "Current Tile:",0,48
	DrawText CurrentTile,104,48
	DrawText Offsety+"  "+offsetx,104,60 '***********************************

End Function

Function Fnc_Grid() 'Control moving around the grid

	SetColor 100,100,100
	
	For x=0 To CaveWidth 'Draw a basic grid as a guide
		For y=0 To CaveHeight
			DrawRect (x*TileWidth)-OffsetX,(y*TileHeight)-OffsetY,TileWidth,TileHeight
		Next
	Next
	SetColor 0,0,0
	For x=0 To CaveWidth
		For y=0 To CaveHeight
			DrawRect ((x*TileWidth)+1)-OffsetX,((y*TileHeight)+1)-OffsetY,TileWidth-1,TileHeight-1
		Next
	Next

	If KeyDown(Key_Right) Then 'Move right across the map
		OffsetX:+4
	End If
	If KeyDown(Key_Left) Then 'Move left across the map
		OffsetX:-4
	End If
	If KeyDown(Key_Up) Then 'Move up the map
		OffsetY:-4
	End If
	If KeyDown(Key_Down) Then 'Move down the map
		OffsetY:+4
	End If

	SetColor 255,255,255

	Local sx = (offsetx Mod TileWidth) '***********************
	Local sy = (offsety Mod TileHeight)'***********************
	CaveX=Floor((MouseX())/TileWidth)'********************
	CaveY=Floor((MouseY())/TileHeight)'**********************
	'CaveX=Floor(MouseX())/48 'Work out current grid square X
	'CaveY=Floor((MouseY()+40)/40)-1 'Work out current grid square Y
'****************************************************
	'DrawImage Tiles,CaveX*TileWIdth-sx,CaveY*TileHeight-sy,CurrentTile 'Show current tile in position X Y
	 DrawRect CaveX*TileWidth-sx,CaveY*TileHeight-sy,40,40 'Show current tile in position X Y
'****************************************************
	If KeyHit(Key_Equals) Then 'Cycle through available tiles
		If CurrentTile<TileCount-1 Then 
			CurrentTile:+1
		Else
			CurrentTile=0
		End If
	End If
	If KeyHit(Key_Minus) Then
		If CurrentTile>0 Then 
			CurrentTile:-1
		Else
			CurrentTile=TileCount-1
		End If
	End If

End Function

[edit]
my mistake. minor adjustment on tipo.
that is why I always use superstrict

Ah, thankyou, that is spot on! It's those Mod / Floor / Math functions that always throw me!

Superstrict: Yes, I really should get into the habit of using that. ;)

Cheers!
M