commanche.monkey2 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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. GCCollect()
  41. PmapDest.Clear(Color.Black)
  42. App.RequestRender()
  43. UpdateCamera()
  44. UpdateSim()
  45. image.Texture.PastePixmap( PmapDest,0,0 )
  46. canvas.DrawRect( 0,0,WIDTH*2,HEIGHT*2,image )
  47. canvas.DrawText( App.FPS,10,10 )
  48. End
  49. '-----------------------------------------------------------------------------------------------------------
  50. Method LoadMap:Void()
  51. ' Print "in Loadmap"
  52. Dmap = Pixmap.Load("asset::D1.png",PixelFormat.RGBA32)
  53. Cmap = Pixmap.Load("asset::C1W.png",PixelFormat.RGBA32)
  54. If Not Dmap Then Print "no Dmap!"
  55. If Not Cmap Then Print "no Cmap!"
  56. ' Print "dmap=" + Dmap.Width + " " + Dmap.Height
  57. PmapDest = New Pixmap(WIDTH, HEIGHT,PixelFormat.RGBA32)
  58. image=New Image( WIDTH,HEIGHT,TextureFlags.Dynamic )
  59. ' Print PmapDest.Width + "##"
  60. End Method
  61. '-----------------------------------------------------------------------------------------------------------
  62. Method UpdateCamera()
  63. If Keyboard.KeyDown(Key.A|Key.Raw)
  64. Camera.angle+= 2* .0174532925
  65. Endif
  66. If Keyboard.KeyDown(Key.S|Key.Raw)
  67. Camera.x+=4 * Sin(Camera.angle)
  68. Camera.y+=4 * Cos(Camera.angle)
  69. Endif
  70. If Keyboard.KeyDown(Key.D|Key.Raw)
  71. Camera.angle-= 2* .0174532925
  72. Endif
  73. If Keyboard.KeyDown(Key.W|Key.Raw)
  74. Camera.x-=4 * Sin(Camera.angle)
  75. Camera.y-=4 * Cos(Camera.angle)
  76. Endif
  77. If Keyboard.KeyDown(Key.R|Key.Raw)
  78. Camera.height+=2
  79. Endif
  80. If Keyboard.KeyDown(Key.F|Key.Raw)
  81. Camera.height-=2
  82. Endif
  83. If Keyboard.KeyDown(Key.Q|Key.Raw)
  84. Camera.v+=2
  85. Endif
  86. If Keyboard.KeyDown(Key.E|Key.Raw)
  87. Camera.v-=2
  88. Endif
  89. End Method
  90. '-----------------------------------------------------------------------------------------------------------
  91. Method UpdateSim()
  92. Local sinang:Float = Sin(Camera.angle)
  93. Local cosang:Float = Cos(Camera.angle)
  94. Local y3d:Float = -depth * 1.5
  95. For Local i:Int = 0 Until WIDTH
  96. Local x3d:Float = (i - WIDTH / 2) * 1.5 * 1.5
  97. Local rotx:Float = cosang * x3d + sinang * y3d
  98. Local roty:Float = -sinang * x3d + cosang * y3d
  99. Raycast(i, Camera.x, Camera.y, rotx + Camera.x, roty + Camera.y, y3d / Sqrt(x3d * x3d + y3d * y3d))
  100. Next
  101. End Method
  102. '-----------------------------------------------------------------------------------------------------------
  103. Method Raycast(line:Int, x1:Float, y1:Float, x2:Float, y2:Float, d:Float)
  104. Local dx:Float = x2 - x1
  105. Local dy:Float = y2 - y1
  106. Local r:Float = Sqrt(dx * dx + dy * dy)
  107. dx = dx / r
  108. dy = dy / r
  109. Local ymin:Float = 256
  110. For Local i:Int = 1 Until r - 20
  111. x1+=dx
  112. y1+=dy
  113. Local h:Int = Camera.height - Int(((Dmap.GetPixelARGB(Int((x1)) & 1023, Int((y1)) & 1023)) Shr 16) & 255)
  114. Local y3:Float = Abs(d) * i
  115. Local z3:Int = h / y3 * 100 - Camera.v
  116. If (z3 < 0) Then z3 = 0
  117. If(z3 < HEIGHT - 1)
  118. Local col:= Cmap.GetPixelARGB(Int(x1) & 1023, Int(y1) & 1023)
  119. For Local k:Int = z3 Until ymin
  120. PmapDest.SetPixelARGB( line,k,col )
  121. Next
  122. If (ymin > z3) Then ymin = (z3)
  123. Endif
  124. Next
  125. End Method
  126. End
  127. '-----------------------------------------------------------------------------------------------------------
  128. Function Main()
  129. New AppInstance
  130. 'Show raw key mappings...
  131. Print "W->"+Keyboard.KeyName( Key.W | Key.Raw )
  132. Print "A->"+Keyboard.KeyName( Key.A | Key.Raw )
  133. Print "S->"+Keyboard.KeyName( Key.S | Key.Raw )
  134. Print "D->"+Keyboard.KeyName( Key.D | Key.Raw )
  135. New MyWindow("Commanche",WIDTH*2,HEIGHT*2)
  136. App.Run()
  137. End