main.fnl 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. ; (local (speed ball-speed) (values 1 200))
  2. (local (w h) (love.window.getMode))
  3. ; (local _state {:x 100 :y 100 :dx 2 :dy 1 :left (- (/ h 2) 50) :right (- (/ h 2) 50)})
  4. ; (global state {:x 100 :y 100 :dx 2 :dy 1 :left (- (/ h 2) 50) :right (- (/ h 2) 50)})
  5. ; (var pause false)
  6. (local keys {:a [:left -1] :z [:left 1] :up [:right -1] :down [:right 1]})
  7. ;; (fn on-paddle? []
  8. ;; (or (and (< state.x 20)
  9. ;; (< state.left state.y) (< state.y (+ state.left 100)))
  10. ;; (and (< (- w 20) state.x)
  11. ;; (< state.right state.y) (< state.y (+ state.right 100)))))
  12. (local Pong {})
  13. (fn Pong.new [cls]
  14. (let [t {:x 100 :y 100
  15. :dx 2 :dy 1
  16. :left (- (/ h 2) 50) :right (- (/ h 2) 50)
  17. :speed 1 :ball-speed 200
  18. :pause false}]
  19. (setmetatable t cls)))
  20. (fn Pong.on-paddle? [self]
  21. (or (and (< self.x 20)
  22. (< self.left self.y) (< self.y (+ self.left 100)))
  23. (and (< (- w 20) self.x)
  24. (< self.right self.y) (< self.y (+ self.right 100)))))
  25. (global pong nil)
  26. {
  27. :name "pong"
  28. :init (fn init []
  29. (set pong (Pong:new)))
  30. :update (fn update [dt set-mode]
  31. (when (not pong.pause)
  32. (set pong.x (+ pong.x (* pong.dx dt ball-speed)))
  33. (set pong.y (+ pong.y (* pong.dy dt ball-speed)))
  34. (each [key action (pairs keys)]
  35. (let [[player dir] action]
  36. (when (love.keyboard.isDown key)
  37. (tset state player (+ (. state player) (* dir speed))))))
  38. (when (or
  39. (< pong.y 0)
  40. (> pong.y h))
  41. (set pong.dy (- 0 pong.dy)))
  42. (when (pong.on-paddle?)
  43. (set pong.dx (- 0 pong.dx)))
  44. (when (< pong.x 0)
  45. (set-mode "mode.end" "2"))
  46. (when (> pong.x w)
  47. (set-mode "mode.end" "1"))))
  48. :keypressed (fn keypressed [key set-mode]
  49. (when (= "p" key)
  50. (set pong.pause (not pong.pause))))
  51. :draw (fn draw [m]
  52. (when (not pong.pause)
  53. (love.graphics.rectangle "fill" 10 pong.left 10 100)
  54. (love.graphics.rectangle "fill" (- w 20) pong.right 10 100)
  55. (love.graphics.circle "fill" pong.x pong.y 10))
  56. (when (pong.pause)
  57. (love.graphics.printf "Press 'p' to unpause" 0 (/ h 3) w "center")))
  58. }