Anonymous
11-21-2005, 06:15 PM
this is how i do 8*8 collision on 16*16 tiles.
Code:
Function Tru_walk ( o As _char_type, dirtemp As Integer, layout As Integer Ptr Ptr, x2 As uInteger, y2 As uInteger, psfing As Byte = 0 )
Dim As Integer layercheck, x_offset, y_offset, x_tile, y_tile, mx, my, x, y
Dim As Integer x_assist, y_assist
Dim As Integer crawl_factor
unpack_1x3 ( x2, mx, x )
unpack_1x3 ( y2, my, y )
Dim As Integer mx2 = ( mx \ 2 ), my2 = ( my \ 2 )
x_tile_2 = o.x \ mx2
y_tile_2 = o.y \ my2
x_offset_2 = o.x Mod mx2
y_offset_2 = o.y Mod my2
walk_grids_x = o.real_x \ mx2
walk_grids_y = o.real_y \ my2
If x_offset_2 <> 0 Then walk_grids_x += 1 Else x_jmp = 1
If y_offset_2 <> 0 Then walk_grids_y += 1 Else y_jmp = 1
Dim layerscan( 2 ) As Byte => { 1, 1, 1 }
For layercheck = 0 To 2
Select Case dirtemp Mod 2
Case 0
crawl_factor = walk_grids_x
Case 1
crawl_factor = walk_grids_y
End Select
For crawl = 0 To crawl_factor - 1
Select Case dirtemp
Case 0
y_assist = ( y_tile_2 - y_jmp )
x_assist = ( x_tile_2 + crawl )
Case 1
x_assist = ( walk_grids_x - 1 ) + x_tile_2 + x_jmp
y_assist = ( y_tile_2 + crawl )
Case 2
x_assist = ( x_tile_2 + crawl )
y_assist = ( walk_grids_y - 1 ) + y_tile_2 + y_jmp
Case 3
x_assist = ( x_tile_2 - x_jmp )
y_assist = ( y_tile_2 + crawl )
End Select
'' what tile
crawltile = ( _
( _
y_assist * my2 _ ''
) \ my _
) * x _
+ _ '' add
( _
( _
x_assist * mx2 _
) \ mx _
)
'' what quad inside the tilespace u hit. 1, 2
walk_index = ( _ '' 3, 4
( _
y_assist Mod 2 _
) * 2 _
) _
+ _ '' add
( _
x_assist Mod 2 _
) + 1
'' store this result
layerscan( layercheck ) And = Not( _
Bit( layout[layercheck][crawltile], 16 - walk_index ) _
)
Next
Next
Dim As Integer tile_free = layerscan( 0 ) And layerscan( 1 ) And layerscan( 2 )
Function = tile_free
End Function