pong.fnl 1.9 KB

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