pong.nim 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import sdl2
  2. import ./player
  3. import ./ball
  4. import ./cons
  5. import ./scores
  6. import ./font
  7. import ./collision
  8. type
  9. Pong* = ref object
  10. isRun: bool
  11. human, robot: Player
  12. ball: Ball
  13. renderer:RendererPtr
  14. scores: Scores
  15. collision:Collision
  16. proc NewPong*(font:Font, renderer:RendererPtr): Pong =
  17. var
  18. human=NewHuman(cons.PaddleWidth, "user", renderer)
  19. robot=NewRobot(cons.WindowWidth - 2 * cons.PaddleWidth, renderer)
  20. scores= NewScores(font)
  21. ball=NewBall(renderer, scores)
  22. Pong(
  23. isRun: true,
  24. renderer:renderer,
  25. human: human,
  26. robot: robot,
  27. ball: ball,
  28. scores: scores,
  29. collision:NewCollision(human, robot, ball)
  30. )
  31. proc keyDown*(sf:var Pong, dt:float32)=
  32. sf.human.Up(dt)
  33. proc keyUp*(sf:var Pong, dt:float32)=
  34. sf.human.Down(dt)
  35. proc stopHuman*(sf: var Pong)=
  36. sf.human.Stop()
  37. proc update*(sf:var Pong, dt: float32) =
  38. sf.collision.update()
  39. sf.human.update(dt)
  40. sf.robot.update(dt, sf.ball.y)
  41. let
  42. distRobot = (sf.ball.y + BallRadius) - (sf.robot.y + PaddleHeight / 2)
  43. req = BallUpdateReq(
  44. dTime:dt,
  45. distRobot:distRobot,
  46. isColHuman:sf.collision.isCollisionHuman,
  47. isColRobot:sf.collision.isCollisionRobot,
  48. humanX:sf.human.x,
  49. robotX:sf.robot.x
  50. )
  51. sf.ball.update(req)
  52. proc draw*(sf:var Pong) =
  53. sf.renderer.setDrawColor 0, 0, 0, 255 # black
  54. sf.renderer.clear()
  55. sf.human.draw()
  56. sf.robot.draw()
  57. sf.ball.draw()
  58. sf.scores.draw()