@bradford6
You're right the camera shouldn't shake when lightning strikes, but I just thought it added to the effect. Actualy, thunder can create vibrations, so there you go.
Storm center sounds like a good idea too.
@FBEpyon
Here is your code:
Strict
Const MapWidth:Int = 10, MapHeight:Int = 10 'Define map size
Const CellSize:Float = 32 'Define cell size
Global CollisionMap:Int [MapWidth,MapHeight] 'Create map array
Local P1_X:Float, P1_Y:Float 'The player's position
Local P1_AABB:Float [] = [-16.0,0.0,16.0,16.0] 'The player's bounding box
'Create some walls:
CollisionMap[2,2] = 1
CollisionMap[2,3] = 1
CollisionMap[2,4] = 1
CollisionMap[3,2] = 1
CollisionMap[5,5] = 1
CollisionMap[5,6] = 1
CollisionMap[5,7] = 1
CollisionMap[4,5] = 1
CollisionMap[3,5] = 1
Graphics 640,480,0
While Not KeyHit(KEY_ESCAPE)
P1_X :+ (KeyDown(KEY_RIGHT) - KeyDown(KEY_LEFT)) * 2'Move player along X axis
P1_Y :+ (KeyDown(KEY_DOWN) - KeyDown(KEY_UP)) * 2 'Move player along Y axis
'Test for collision and seperate objects:
AABB_To_Map_Collision(P1_X,P1_Y,P1_AABB)
Cls
'Draw Map:
For Local MapX:Int = 0 To MapWidth - 1
For Local MapY:Int = 0 To MapHeight - 1
Local ScreenX:Int = MapX * CellSize
Local ScreenY:Int = MapY * CellSize
If CollisionMap[MapX,MapY] <> 0 SetColor 255,0,0 Else SetColor 0,64,0
DrawRect ScreenX,ScreenY,CellSize,Cellsize
Next
Next
'Draw Player:
SetColor 255,255,255
DrawRect P1_X+P1_AABB[0],P1_Y+P1_AABB[1],P1_AABB[2],P1_AABB[3]
Flip
FlushMem
Wend
Function AABB_To_Map_Collision (_X:Float Var,_Y:Float Var,_AABB:Float [])
'Convert x/y coordinates to map cell space:
Local MapCellX:Int = _X / CellSize
Local MapCellY:Int = _Y / CellSize
Local CollisionDetected:Byte = False
'Loop through each possible collision:
For Local MapX:Float = MapCellX - 1 To MapCellX + 1
For Local MapY:Float = MapCellY - 1 To MapCellY + 1
If MapX >= 0 And MapX <= MapWidth - 1 And MapY >= 0 And MapY <= MapHeight - 1
If CollisionMap[MapX,MapY] <> 0
Local Map_AABB:Float [] = [0.0,0.0,CellSize,CellSize]
'Check for a collision on each axis:
If (_AABB[0] + _X > Map_AABB[0] + Map_AABB[2] + MapX * CellSize) Continue
If (_AABB[0] + _AABB[2] + _X < Map_AABB[0] + MapX * CellSize) Continue
If (_AABB[1] + _Y > Map_AABB[1] + Map_AABB[3] + MapY * CellSize) Continue
If (_AABB[1] + _AABB[3] + _Y < Map_AABB[1] + MapY * CellSize) Continue
'If we get this far we have a collision:
CollisionDetected = True
'Determine the shortest seperation vector and seperate the object:
Local vx1:Float,vx2:Float,vx3:Float,vx4:Float
vx1 = (Map_AABB[0] + MapX * CellSize) - (_AABB[0] + _AABB[2] + _X)
vx2 = (Map_AABB[0] + Map_AABB[2] + MapX * CellSize) - (_AABB[0] + _X)
Local vy1:Float,vy2:Float,vy3:Float,vy4:Float
vy1 = (Map_AABB[1] + MapY * CellSize) - (_AABB[1] + _AABB[3] + _Y)
vy2 = (Map_AABB[1] + Map_AABB[3] + MapY * CellSize) - (_AABB[1] + _Y)
If (vy1*-1) < vy2 Then vy3 = vy1 Else vy3 = vy2
If (vx1*-1) < vx2 Then vx3 = vx1 Else vx3 = vx2
If vx3 < 0 vx4 = vx3 * -1 Else vx4 = vx3
If vy3 < 0 vy4 = vy3 * -1 Else vy4 = vy3
If vx4 > vy4
_Y :+ vy3
Else
_X :+ vx3
End If
End If
End If
Next
Next
Return CollisionDetected
End Function