player.nim 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import sdl2
  2. import ../cons
  3. type
  4. EPlayer {.pure.}= enum
  5. Human,
  6. Robot
  7. Player* {.requiresInit.} = object
  8. x: float32
  9. y: float32
  10. renderer: RendererPtr
  11. case kind*: EPlayer
  12. of Human:
  13. name:string # у человека есть имя
  14. of Robot:
  15. id*: int # пример уникального поля для бота
  16. proc NewHuman*(x: float32=0, name:string="user", renderer:RendererPtr): Player =
  17. assert(name!="", "NewHuman(): name is empty")
  18. Player(
  19. kind:Human,
  20. x: x,
  21. y: (WindowHeight + PaddleHeight) / 2,
  22. renderer:renderer,
  23. name:name,
  24. )
  25. proc NewRobot*(x: float32=0, renderer:RendererPtr): Player =
  26. Player(
  27. kind:Robot,
  28. x: x,
  29. y: (WindowHeight + PaddleHeight) / 2,
  30. renderer:renderer,
  31. id:100,
  32. )
  33. proc Stop*(sf:Player)=
  34. discard
  35. proc update*(sf:var Player, dy, ballY: float32) =
  36. let speed=300.0
  37. if ballY>sf.y:
  38. sf.y = sf.y + dy*speed
  39. else:
  40. sf.y = sf.y - dy*speed
  41. sf.y = max(sf.y, 0)
  42. sf.y = min(sf.y, WindowHeight - PaddleHeight)
  43. echo("ballY=", $ballY, " robotY=", $sf.y, " dy=", $dy)
  44. proc update*(sf:var Player, dt: float32)=
  45. discard
  46. proc draw*(sf: Player) =
  47. case sf.kind:
  48. of Human:
  49. sf.renderer.setDrawColor 255, 0, 0, 255 # red
  50. of Robot:
  51. sf.renderer.setDrawColor 0, 0, 255, 255 # blue
  52. var r = rect(
  53. cint(sf.x), cint(sf.y),
  54. cint(PaddleWidth), cint(PaddleHeight)
  55. )
  56. sf.renderer.fillRect(r)
  57. proc `x`*(sf:Player):float32{.inline.}=
  58. return sf.x
  59. proc `y`*(sf:Player):float32{.inline.}=
  60. return sf.y
  61. proc `y=`*(sf:var Player, val:float32){.inline.}=
  62. sf.y=val
  63. proc control(sf:var Player){.inline.}=
  64. if sf.y < 0:
  65. sf.y=0
  66. elif sf.y + PaddleHeight > WindowHeight:
  67. sf.y = WindowHeight - PaddleHeight
  68. proc Down*(sf:var Player, dt:float32){.inline.}=
  69. # echo("Human.Down(): dt=", (dt*1000).int, " msec")
  70. sf.y -= PaddleSpeed * dt
  71. sf.control()
  72. proc Up*(sf:var Player, dt:float32){.inline.}=
  73. # echo("Human.Up(): dt=", (dt*1000).int, " msec")
  74. sf.y += PaddleSpeed * dt
  75. sf.control()