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()