commanche.monkey2 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. '// Commanche Voxel for Monkey2 by GW, Original code by Sebastian Macke
  2. #Import "<std>"
  3. #Import "<mojo>"
  4. #Import "assets/C1W.png"
  5. #Import "assets/D1.png"
  6. Using std..
  7. Using mojo..
  8. Const WIDTH:Int =512
  9. Const HEIGHT:Int =256
  10. Const MAPW:Int = 1024
  11. Const MAPH:Int = 1024
  12. Global Cmap:Pixmap
  13. Global Dmap:Pixmap
  14. Global PmapDest:Pixmap
  15. Global image:Image
  16. Global depth:Float = 400
  17. Global Camera:tCamera
  18. Class tCamera
  19. Field x:Float = 512 '// x position on the map
  20. Field y:Float = 800 '// y position on the map
  21. Field height:Float = 78 '// height of the camera
  22. Field angle:Float = 0 '// direction of the camera
  23. Field v:Float = -100 '// horizon position (look up And down)
  24. End Class
  25. '-----------------------------------------------------------------------------------------------------------
  26. Class MyWindow Extends Window
  27. Field pm:Pixmap
  28. Field img:Image
  29. '-----------------------------------------------------------------------------------------------------------
  30. Method New(title : String , width : Int , height : Int , flags : WindowFlags =Null)
  31. Super.New(title,width,height,flags)
  32. Camera = New tCamera
  33. ' Print "Loading map"
  34. LoadMap()
  35. ClearColor=Color.Black
  36. SwapInterval=0
  37. End Method
  38. '-----------------------------------------------------------------------------------------------------------
  39. Method OnRender( canvas:Canvas ) Override
  40. PmapDest.Clear(Color.Black)
  41. App.RequestRender()
  42. UpdateCamera()
  43. UpdateSim()
  44. image.Texture.PastePixmap( PmapDest,0,0 )
  45. canvas.DrawRect( 0,0,WIDTH*2,HEIGHT*2,image )
  46. canvas.DrawText( App.FPS,10,10 )
  47. End
  48. '-----------------------------------------------------------------------------------------------------------
  49. Method LoadMap:Void()
  50. ' Print "in Loadmap"
  51. Dmap = Pixmap.Load("asset::D1.png",PixelFormat.RGBA32)
  52. Cmap = Pixmap.Load("asset::C1W.png",PixelFormat.RGBA32)
  53. If Not Dmap Then Print "no Dmap!"
  54. If Not Cmap Then Print "no Cmap!"
  55. ' Print "dmap=" + Dmap.Width + " " + Dmap.Height
  56. PmapDest = New Pixmap(WIDTH, HEIGHT,PixelFormat.RGBA32)
  57. image=New Image( WIDTH,HEIGHT,TextureFlags.Dynamic )
  58. ' Print PmapDest.Width + "##"
  59. End Method
  60. '-----------------------------------------------------------------------------------------------------------
  61. Method UpdateCamera()
  62. If Keyboard.KeyDown(Key.A|Key.Raw)
  63. Camera.angle+= 2* .0174532925
  64. Endif
  65. If Keyboard.KeyDown(Key.S|Key.Raw)
  66. Camera.x+=4 * Sin(Camera.angle)
  67. Camera.y+=4 * Cos(Camera.angle)
  68. Endif
  69. If Keyboard.KeyDown(Key.D|Key.Raw)
  70. Camera.angle-= 2* .0174532925
  71. Endif
  72. If Keyboard.KeyDown(Key.W|Key.Raw)
  73. Camera.x-=4 * Sin(Camera.angle)
  74. Camera.y-=4 * Cos(Camera.angle)
  75. Endif
  76. If Keyboard.KeyDown(Key.R|Key.Raw)
  77. Camera.height+=2
  78. Endif
  79. If Keyboard.KeyDown(Key.F|Key.Raw)
  80. Camera.height-=2
  81. Endif
  82. If Keyboard.KeyDown(Key.Q|Key.Raw)
  83. Camera.v+=2
  84. Endif
  85. If Keyboard.KeyDown(Key.E|Key.Raw)
  86. Camera.v-=2
  87. Endif
  88. End Method
  89. '-----------------------------------------------------------------------------------------------------------
  90. Method UpdateSim()
  91. Local sinang:Float = Sin(Camera.angle)
  92. Local cosang:Float = Cos(Camera.angle)
  93. Local y3d:Float = -depth * 1.5
  94. For Local i:Int = 0 Until WIDTH
  95. Local x3d:Float = (i - WIDTH / 2) * 1.5 * 1.5
  96. Local rotx:Float = cosang * x3d + sinang * y3d
  97. Local roty:Float = -sinang * x3d + cosang * y3d
  98. Raycast(i, Camera.x, Camera.y, rotx + Camera.x, roty + Camera.y, y3d / Sqrt(x3d * x3d + y3d * y3d))
  99. Next
  100. End Method
  101. '-----------------------------------------------------------------------------------------------------------
  102. Method Raycast(line:Int, x1:Float, y1:Float, x2:Float, y2:Float, d:Float)
  103. Local dx:Float = x2 - x1
  104. Local dy:Float = y2 - y1
  105. Local r:Float = Sqrt(dx * dx + dy * dy)
  106. dx = dx / r
  107. dy = dy / r
  108. Local ymin:Float = 256
  109. For Local i:Int = 1 Until r - 20
  110. x1+=dx
  111. y1+=dy
  112. Local h:Int = Camera.height - Int(((Dmap.GetPixelARGB(Int((x1)) & 1023, Int((y1)) & 1023)) Shr 16) & 255)
  113. Local y3:Float = Abs(d) * i
  114. Local z3:Int = h / y3 * 100 - Camera.v
  115. If (z3 < 0) Then z3 = 0
  116. If(z3 < HEIGHT - 1)
  117. Local col:= Cmap.GetPixelARGB(Int(x1) & 1023, Int(y1) & 1023)
  118. For Local k:Int = z3 Until ymin
  119. PmapDest.SetPixelARGB( line,k,col )
  120. Next
  121. If (ymin > z3) Then ymin = (z3)
  122. Endif
  123. Next
  124. End Method
  125. End
  126. '-----------------------------------------------------------------------------------------------------------
  127. Function Main()
  128. New AppInstance
  129. 'Show raw key mappings...
  130. Print "W->"+Keyboard.KeyName( Key.W | Key.Raw )
  131. Print "A->"+Keyboard.KeyName( Key.A | Key.Raw )
  132. Print "S->"+Keyboard.KeyName( Key.S | Key.Raw )
  133. Print "D->"+Keyboard.KeyName( Key.D | Key.Raw )
  134. New MyWindow("Commanche",WIDTH*2,HEIGHT*2)
  135. App.Run()
  136. End