|
@@ -15,13 +15,11 @@ type
|
|
|
isRun = true
|
|
isRun = true
|
|
|
game:Pong
|
|
game:Pong
|
|
|
dt: float32=0
|
|
dt: float32=0
|
|
|
- counter: uint64
|
|
|
|
|
- previousCounter: uint64=0
|
|
|
|
|
event:Event
|
|
event:Event
|
|
|
|
|
|
|
|
proc NewApp():App=
|
|
proc NewApp():App=
|
|
|
if_SDL_fail(not sdl2.init(INIT_VIDEO or INIT_TIMER or INIT_EVENTS)):
|
|
if_SDL_fail(not sdl2.init(INIT_VIDEO or INIT_TIMER or INIT_EVENTS)):
|
|
|
- "SDL2 initialization failed"
|
|
|
|
|
|
|
+ "NewApp(): SDL2 initialization failed"
|
|
|
|
|
|
|
|
let window = createWindow(
|
|
let window = createWindow(
|
|
|
title = "PingPong",
|
|
title = "PingPong",
|
|
@@ -48,17 +46,18 @@ proc NewApp():App=
|
|
|
let font=NewFont(font0, renderer)
|
|
let font=NewFont(font0, renderer)
|
|
|
|
|
|
|
|
let game = NewPong(font, renderer)
|
|
let game = NewPong(font, renderer)
|
|
|
- let counter = getPerformanceCounter()
|
|
|
|
|
let sf=App(
|
|
let sf=App(
|
|
|
window:window,
|
|
window:window,
|
|
|
renderer:renderer,
|
|
renderer:renderer,
|
|
|
font:font,
|
|
font:font,
|
|
|
game:game,
|
|
game:game,
|
|
|
- counter:counter,
|
|
|
|
|
event:defaultEvent,
|
|
event:defaultEvent,
|
|
|
)
|
|
)
|
|
|
return sf
|
|
return sf
|
|
|
|
|
|
|
|
|
|
+var
|
|
|
|
|
+ keyUp, keyDown:bool
|
|
|
|
|
+
|
|
|
proc loop(sf:var App){.inline.}=
|
|
proc loop(sf:var App){.inline.}=
|
|
|
case sf.event.kind
|
|
case sf.event.kind
|
|
|
of QuitEvent:
|
|
of QuitEvent:
|
|
@@ -69,21 +68,22 @@ proc loop(sf:var App){.inline.}=
|
|
|
# Теперь безопасно проверяем конкретные клавиши
|
|
# Теперь безопасно проверяем конкретные клавиши
|
|
|
case sf.event.key.keysym.scancode
|
|
case sf.event.key.keysym.scancode
|
|
|
of SDL_SCANCODE_UP:
|
|
of SDL_SCANCODE_UP:
|
|
|
- sf.game.keyUp(sf.dt)
|
|
|
|
|
|
|
+ keyUp=true
|
|
|
of SDL_SCANCODE_DOWN:
|
|
of SDL_SCANCODE_DOWN:
|
|
|
- sf.game.keyDown(sf.dt)
|
|
|
|
|
|
|
+ keyDown=true
|
|
|
else:
|
|
else:
|
|
|
discard
|
|
discard
|
|
|
of KeyUp:
|
|
of KeyUp:
|
|
|
# Останавливаем движение, когда стрелки отпущены
|
|
# Останавливаем движение, когда стрелки отпущены
|
|
|
case sf.event.key.keysym.scancode
|
|
case sf.event.key.keysym.scancode
|
|
|
- of SDL_SCANCODE_UP, SDL_SCANCODE_DOWN:
|
|
|
|
|
- sf.game.stopHuman()
|
|
|
|
|
|
|
+ of SDL_SCANCODE_UP:
|
|
|
|
|
+ keyUp=false
|
|
|
|
|
+ of SDL_SCANCODE_DOWN:
|
|
|
|
|
+ keyDown=false
|
|
|
else:
|
|
else:
|
|
|
discard
|
|
discard
|
|
|
else:
|
|
else:
|
|
|
discard
|
|
discard
|
|
|
- sf.game.update(sf.dt)
|
|
|
|
|
|
|
|
|
|
proc run(sf:var App)=
|
|
proc run(sf:var App)=
|
|
|
defer: sdl2.quit()
|
|
defer: sdl2.quit()
|
|
@@ -91,16 +91,46 @@ proc run(sf:var App)=
|
|
|
defer: sf.renderer.destroy()
|
|
defer: sf.renderer.destroy()
|
|
|
defer: ttfQuit()
|
|
defer: ttfQuit()
|
|
|
|
|
|
|
|
|
|
+ var
|
|
|
|
|
+ lastTime = getTicks() # Время на предыдущем кадре
|
|
|
|
|
+ fpsTimer = getTicks() # Таймер для обновления счетчика FPS
|
|
|
|
|
+ frameCount = 0 # Счетчик отрисованных кадров
|
|
|
|
|
+ fps = 0 # Итоговый FPS для вывода
|
|
|
|
|
+
|
|
|
while sf.isRun:
|
|
while sf.isRun:
|
|
|
- sf.previousCounter = sf.counter
|
|
|
|
|
- sf.counter = getPerformanceCounter()
|
|
|
|
|
|
|
+ # 1. Считаем время между кадрами (в миллисекундах)
|
|
|
|
|
+ let currentTime = getTicks()
|
|
|
|
|
|
|
|
- sf.dt = (sf.counter - sf.previousCounter).float / getPerformanceFrequency().float
|
|
|
|
|
|
|
+ # Переводим в секунды (разделив на 1000), чтобы использовать как dt
|
|
|
|
|
+ sf.dt = (currentTime - lastTime).float / 1000.0
|
|
|
|
|
+ lastTime = currentTime
|
|
|
|
|
+
|
|
|
|
|
+ # 2. Считаем FPS (обновляем раз в секунду, чтобы текст не мерцал)
|
|
|
|
|
+ inc frameCount
|
|
|
|
|
+ if currentTime - fpsTimer >= 1000:
|
|
|
|
|
+ fps = frameCount
|
|
|
|
|
+ frameCount = 0
|
|
|
|
|
+ fpsTimer = currentTime
|
|
|
|
|
+
|
|
|
|
|
+ # Выводим FPS напрямую в заголовок окна для теста
|
|
|
|
|
+ sf.window.setTitle(("Pong Game | FPS: " & $fps).cstring)
|
|
|
|
|
|
|
|
sf.event = defaultEvent
|
|
sf.event = defaultEvent
|
|
|
while pollEvent(sf.event):
|
|
while pollEvent(sf.event):
|
|
|
sf.loop()
|
|
sf.loop()
|
|
|
|
|
+ if keyUp:
|
|
|
|
|
+ sf.game.keyUp(sf.dt)
|
|
|
|
|
+ elif keyDown:
|
|
|
|
|
+ sf.game.keyDown(sf.dt)
|
|
|
|
|
+ else:
|
|
|
|
|
+ sf.game.stopHuman()
|
|
|
|
|
+ sf.game.update(sf.dt)
|
|
|
|
|
+ let
|
|
|
|
|
+ txtFps="FPS: " & $fps
|
|
|
|
|
+ color:Color=(r:255,g:255,b:0,a:255)
|
|
|
sf.game.draw()
|
|
sf.game.draw()
|
|
|
|
|
+ sf.font.text(txtFps, 50, 50, color)
|
|
|
|
|
+ sf.renderer.present()
|
|
|
|
|
|
|
|
proc main =
|
|
proc main =
|
|
|
var app=NewApp()
|
|
var app=NewApp()
|