2d_camera.odin 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // This is a port of https://github.com/raysan5/raylib/blob/master/examples/core/core_2d_camera.c
  2. package raylib_example_2d_camera
  3. import k2 "../../.."
  4. import "core:math/rand"
  5. import "core:math"
  6. import "core:log"
  7. MAX_BUILDINGS :: 100
  8. SCREEN_WIDTH :: 800
  9. SCREEN_HEIGHT :: 450
  10. main :: proc() {
  11. context.logger = log.create_console_logger()
  12. k2.init(SCREEN_WIDTH, SCREEN_HEIGHT, "Karl2D: 2d camera (raylib [core] example - 2d camera)")
  13. k2.set_window_position(500, 100)
  14. player := k2.Rect { 400, 280, 40, 40 }
  15. buildings: [MAX_BUILDINGS]k2.Rect
  16. building_colors: [MAX_BUILDINGS]k2.Color
  17. spacing: f32
  18. for i in 0..<MAX_BUILDINGS {
  19. w := rand.float32_range(50, 200)
  20. h := rand.float32_range(100, 800)
  21. buildings[i] = {
  22. x = -6000 + spacing,
  23. y = SCREEN_HEIGHT - 130 - h,
  24. w = w,
  25. h = h,
  26. }
  27. spacing += w
  28. building_colors[i] = {
  29. u8(rand.int_max(40) + 200),
  30. u8(rand.int_max(40) + 200),
  31. u8(rand.int_max(50) + 200),
  32. 255,
  33. }
  34. }
  35. camera := k2.Camera {
  36. origin = { SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2},
  37. zoom = 1,
  38. }
  39. for !k2.window_should_close() {
  40. k2.process_events()
  41. if k2.key_is_held(.Right) { player.x += 2 }
  42. else if k2.key_is_held(.Left) { player.x -= 2 }
  43. camera.target = { player.x + 20, player.y + 20 }
  44. if k2.key_is_held(.A) { camera.rotation -= 1 }
  45. else if k2.key_is_held(.S) { camera.rotation += 1 }
  46. if camera.rotation > 40 { camera.rotation = 40 }
  47. else if camera.rotation < -40 { camera.rotation = -40 }
  48. camera.zoom = math.exp(math.log(camera.zoom, math.E) + f32(k2.get_mouse_wheel_delta() * 0.1))
  49. if camera.zoom > 3 { camera.zoom = 3 }
  50. else if camera.zoom < 0.1 { camera.zoom = 0.1 }
  51. if k2.key_went_down(.R) {
  52. camera.zoom = 1
  53. camera.rotation = 0
  54. }
  55. k2.clear({ 245, 245, 245, 255 })
  56. k2.set_camera(camera)
  57. k2.draw_rect({-6000, 320, 13000, 8000}, k2.DARKGRAY)
  58. for i in 0..<MAX_BUILDINGS {
  59. k2.draw_rect(buildings[i], building_colors[i])
  60. }
  61. k2.draw_rect(player, k2.RED)
  62. k2.draw_line({camera.target.x, -SCREEN_HEIGHT * 10}, {camera.target.x, SCREEN_HEIGHT * 10 }, 1, k2.GREEN)
  63. k2.draw_line({-SCREEN_WIDTH*10, camera.target.y}, {SCREEN_WIDTH*10, camera.target.y}, 1, k2.GREEN)
  64. k2.set_camera(nil)
  65. k2.draw_text("SCREEN AREA", {640, 10}, 20, k2.RED)
  66. k2.draw_rect({0, 0, SCREEN_WIDTH, 5}, k2.RED)
  67. k2.draw_rect({0, 5, 5, SCREEN_HEIGHT - 10}, k2.RED)
  68. k2.draw_rect({SCREEN_WIDTH - 5, 5, 5, SCREEN_HEIGHT - 10}, k2.RED)
  69. k2.draw_rect({0, SCREEN_HEIGHT - 5, SCREEN_WIDTH, 5}, k2.RED)
  70. k2.draw_rect({10, 10, 250, 113}, {102, 191, 255, 128})
  71. k2.draw_rect_outline({10, 10, 250, 113}, 1, k2.BLUE)
  72. k2.draw_text("Free 2d camera controls:", {20, 20}, 10, k2.BLACK)
  73. k2.draw_text("- Right/Left to move Offset", {40, 40}, 10, k2.DARKGRAY)
  74. k2.draw_text("- Mouse Wheel to Zoom in-out", {40, 60}, 10, k2.DARKGRAY)
  75. k2.draw_text("- A / S to Rotate", {40, 80}, 10, k2.DARKGRAY)
  76. k2.draw_text("- R to reset Zoom and Rotation", {40, 100}, 10, k2.DARKGRAY)
  77. k2.present()
  78. }
  79. k2.shutdown()
  80. }