BlitzMax port and modification:
PS: JFK EO-11110, you're a legend. Thanks for the code.
SuperStrict Graphics 320,240 Local MV:TMazeView = New TMazeView MV.loadMap MV.loadColors Local a:Float Local mxs:Float Local OldTime:Int = 0 Local CurTime:Int HideMouse ' *** MAIN LOOP *** While Not KeyHit(KEY_ESCAPE) Local mxs:Float = (MouseX() - GraphicsWidth() / 2) / 3.0 MoveMouse (GraphicsWidth() / 2), (GraphicsHeight() / 2) Cls CurTime = 1000 / (MilliSecs() - OldTime) OldTime = MilliSecs() If KeyDown(KEY_W) MV.moveForward a EndIf If KeyDown(KEY_S) MV.moveBackward a EndIf If KeyDown(KEY_Q) 'turn left a :+ 2 EndIf If KeyDown(KEY_E) 'turn right a :- 2 EndIf a = (a - mxs) Mod 360 MV.raycast a MV.drawMap a If MV.info <> "" Then DrawText MV.info, 1, (GraphicsHeight() - 20) DrawText "WQSE and mouse to move. FPS:" + CurTime, 1, (GraphicsHeight() - (2 * 20)) Flip 1 Wend End Type TMazeView Field Cols:Int Field Rows:Int Field Grid:Int[,] Field RGB:Byte[,] Field px:Float Field pxold:Float Field pz:Float Field pzold:Float Field premind:Float Field info:String Method New() Cols = 16 Rows = 16 Grid = New Int[cols, rows] RGB = New Byte[10, 3] px = 8.0 pxold = 0.0 pz = 8.0 pzold = 0.0 info = "" EndMethod Method loadMap() RestoreData Map For Local j:Int = 0 To Rows - 1 For Local i:Int = 0 To Cols - 1 ReadData Grid[i, j] Next Next EndMethod Method loadColors() RestoreData Colors For Local i:Int = 0 To 9 ReadData RGB[i, 0] ReadData RGB[i, 1] ReadData RGB[i, 2] Next EndMethod Method checkCollision() If Grid[px, pz] <> 0 premind = px px = pxold If Grid[px, pz] <> 0 px = premind pz = pzold If Grid[px, pz] <> 0 px = pxold EndIf EndIf EndIf EndMethod Method drawMap(a:Float) SetColor 0,255,0 DrawLine (px * 5 - Sin(a) * 2), (pz * 5 - Cos (a) * 2), (px * 5 + Sin(a) * 2), (pz * 5 + Cos(a) * 2) SetColor 255, 0, 0 DrawOval (px * 5 + (Sin(a) * 2)) - 1, (pz * 5 + (Cos(a) * 2)) - 1, 2, 2 SetColor 127, 127, 127 SetBlend ALPHABLEND SetAlpha 0.5 For Local j:Int = 0 To (Rows - 1) For Local i:Int = 0 To (Cols - 1) If Grid[i, j] <> 0 DrawRect (i * 5 - 3), (j * 5 - 3), 5, 5 EndIf Next Next SetBlend SOLIDBLEND EndMethod Method moveForward(a:Float) pxold = px pzold = pz px :+ Sin(a) / 5.0 pz :+ Cos(a) / 5.0 CheckCollision EndMethod Method moveBackward(a:Float) pxold = px pzold = pz px :- Sin(a) / 5.0 pz :- Cos(a) / 5.0 CheckCollision EndMethod Method raycast(a:Float) For Local i:Int = -160 To 159 Local rayx:Float = px Local rayz:Float = pz Local stepx:Float = Sin(a + 0.125 * i) / 50.0 Local stepz:Float = Cos( a + 0.125 * i) / 50.0 Local count:Int = 0 Local touched:Int = 0 While touched = 0 And count < 1000 rayx :+ stepx rayz :+ stepz count :+ 1 If Grid[rayx, rayz] <> 0 Then touched = Grid[rayx, rayz] Wend If touched <> 0 Local h:Float = 7000.0 / count Local bright:Float = (h + 20.0) / 127.0 If bright > 1.0 Then bright = 1.0 SetColor RGB[touched, 0] * bright, RGB[touched, 1] * bright, RGB[touched, 2] * bright DrawLine 160 - i, 120 - h, 160 - i, 120 + h If touched = 9 If info = "" info = "Level Exit found!!! Congratzz!!!" EndIf EndIf EndIf Next EndMethod EndType #Map DefData 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2 DefData 2,9,0,0,1,0,0,0,0,0,0,0,0,0,0,1 DefData 1,0,0,0,0,0,4,3,5,6,5,6,0,0,0,2 DefData 2,0,1,3,4,2,2,0,0,0,0,2,3,0,0,1 DefData 1,2,1,0,0,0,2,1,4,0,0,1,2,2,0,2 DefData 2,0,0,0,4,0,0,0,7,0,0,0,1,0,0,1 DefData 1,0,8,4,3,0,0,0,0,0,0,0,1,2,0,2 DefData 2,0,7,0,0,0,0,0,0,4,5,4,1,0,0,1 DefData 1,0,6,0,0,1,0,0,0,1,0,0,2,2,0,2 DefData 2,0,5,1,2,1,3,0,1,1,0,0,0,0,0,1 DefData 1,0,4,0,0,0,0,0,2,4,2,4,2,2,0,2 DefData 2,0,3,1,0,0,0,0,0,0,3,0,0,1,0,1 DefData 1,0,2,1,1,0,0,0,0,0,0,0,0,1,0,2 DefData 2,0,1,2,3,4,5,4,5,4,5,5,6,3,0,1 DefData 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2 DefData 2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1 #Colors DefData 127,127,255 DefData 64,64,255 DefData 255,127,255 DefData 255,0,0 DefData 0,255,0 DefData 0,0,255 DefData 255,0,255 DefData 0,255,255 DefData 255,255,0 DefData 255,255,255
PS: JFK EO-11110, you're a legend. Thanks for the code.