| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- import sdl2
- import ../cons
- type
- EPlayer {.pure.}= enum
- Human,
- Robot
- Player* {.requiresInit.} = object
- x: float32
- y: float32
- renderer: RendererPtr
- case kind*: EPlayer
- of Human:
- name:string # у человека есть имя
- of Robot:
- id*: int # пример уникального поля для бота
- proc NewHuman*(x: float32=0, name:string="user", renderer:RendererPtr): Player =
- assert(name!="", "NewHuman(): name is empty")
- Player(
- kind:Human,
- x: x,
- y: (WindowHeight + PaddleHeight) / 2,
- renderer:renderer,
- name:name,
- )
- proc NewRobot*(x: float32=0, renderer:RendererPtr): Player =
- Player(
- kind:Robot,
- x: x,
- y: (WindowHeight + PaddleHeight) / 2,
- renderer:renderer,
- id:100,
- )
- proc Stop*(sf:Player)=
- discard
- proc update*(sf:var Player, dy, ballY: float32) =
- let speed=300.0
- if ballY>sf.y:
- sf.y = sf.y + dy*speed
- else:
- sf.y = sf.y - dy*speed
- sf.y = max(sf.y, 0)
- sf.y = min(sf.y, WindowHeight - PaddleHeight)
- echo("ballY=", $ballY, " robotY=", $sf.y, " dy=", $dy)
- proc update*(sf:var Player, dt: float32)=
- discard
- proc draw*(sf: Player) =
- case sf.kind:
- of Human:
- sf.renderer.setDrawColor 255, 0, 0, 255 # red
- of Robot:
- sf.renderer.setDrawColor 0, 0, 255, 255 # blue
- var r = rect(
- cint(sf.x), cint(sf.y),
- cint(PaddleWidth), cint(PaddleHeight)
- )
- sf.renderer.fillRect(r)
- proc `x`*(sf:Player):float32{.inline.}=
- return sf.x
- proc `y`*(sf:Player):float32{.inline.}=
- return sf.y
- proc `y=`*(sf:var Player, val:float32){.inline.}=
- sf.y=val
- proc control(sf:var Player){.inline.}=
- if sf.y < 0:
- sf.y=0
- elif sf.y + PaddleHeight > WindowHeight:
- sf.y = WindowHeight - PaddleHeight
- proc Down*(sf:var Player, dt:float32){.inline.}=
- # echo("Human.Down(): dt=", (dt*1000).int, " msec")
- sf.y -= PaddleSpeed * dt
- sf.control()
- proc Up*(sf:var Player, dt:float32){.inline.}=
- # echo("Human.Up(): dt=", (dt*1000).int, " msec")
- sf.y += PaddleSpeed * dt
- sf.control()
|