forked from Obsolete/naka-chan-dayo
Initial commit.
This commit is contained in:
commit
73d1206edb
22
shard.yml
Normal file
22
shard.yml
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
name: naka
|
||||||
|
version: 0.0.1
|
||||||
|
|
||||||
|
authors:
|
||||||
|
- Lukc <lukc@upyum.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
Experimental Löve-like APIs for game programming.
|
||||||
|
# Future description’s gonna be like “Game Programming no Aidoru!”.
|
||||||
|
|
||||||
|
# Currently, game and libraries are merged, because everything’s still a WIP.
|
||||||
|
# It’ll change, though. Soon. Probably.
|
||||||
|
targets:
|
||||||
|
main:
|
||||||
|
main: src/main.cr
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
sdl:
|
||||||
|
github: ysbaddaden/sdl.cr
|
||||||
|
branch: master # No upstream tag or branches provided. :(
|
||||||
|
|
||||||
|
license: EUPLv1.2
|
153
src/main.cr
Normal file
153
src/main.cr
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
|
||||||
|
require "sdl"
|
||||||
|
require "sdl/image"
|
||||||
|
|
||||||
|
## Helper code comes here
|
||||||
|
|
||||||
|
class Naka
|
||||||
|
def self.init
|
||||||
|
SDL.init SDL::Init::VIDEO
|
||||||
|
SDL::IMG.init SDL::IMG::Init::PNG
|
||||||
|
|
||||||
|
at_exit { SDL.quit }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Naka::Renderer < SDL::Renderer
|
||||||
|
end
|
||||||
|
|
||||||
|
class Naka::Window
|
||||||
|
alias Flags = LibSDL::WindowFlags
|
||||||
|
alias Position = LibSDL::WindowPosition
|
||||||
|
|
||||||
|
getter renderer
|
||||||
|
|
||||||
|
def initialize(title, width, height,
|
||||||
|
x : Position = Position::UNDEFINED,
|
||||||
|
y : Position = Position::UNDEFINED,
|
||||||
|
flags : Flags = Flags::SHOWN)
|
||||||
|
|
||||||
|
@window = SDL::Window.new(title, width, height, x, y, flags)
|
||||||
|
@renderer = Naka::Renderer.new @window
|
||||||
|
end
|
||||||
|
|
||||||
|
def newImage(file_path) : SDL::Texture
|
||||||
|
SDL::IMG.load file_path, @renderer
|
||||||
|
end
|
||||||
|
|
||||||
|
# FIXME: We’ll probably want options for scaling, rotations, and so on.
|
||||||
|
def draw(texture : SDL::Texture, x : Int32, y : Int32)
|
||||||
|
@renderer.copy texture,
|
||||||
|
dstrect: SDL::Rect[x, y, texture.width, texture.height]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Naka::Timer
|
||||||
|
getter start
|
||||||
|
getter last_update
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
@start = Time.now
|
||||||
|
@last_update = @start
|
||||||
|
end
|
||||||
|
|
||||||
|
def step
|
||||||
|
now = Time.now
|
||||||
|
|
||||||
|
dt = now.epoch_ms - @last_update.epoch_ms
|
||||||
|
|
||||||
|
@last_update = now
|
||||||
|
|
||||||
|
dt
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Naka::Event
|
||||||
|
class Quit
|
||||||
|
end
|
||||||
|
|
||||||
|
class Draw
|
||||||
|
getter window : Naka::Window
|
||||||
|
|
||||||
|
def initialize(@window)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Update
|
||||||
|
getter dt : Int64
|
||||||
|
|
||||||
|
def initialize(@dt)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# FIXME: THIS MAIN LOOP IS **NOT** READY FOR PRODUCTION
|
||||||
|
# Update events are still missing, and both Draw and Update should
|
||||||
|
# be time-based.
|
||||||
|
# Why having a `window` parameter instead of making a Window#loop method?
|
||||||
|
# Because we may want to have a `windows` parameter in the future, although
|
||||||
|
# unlikely. But still possible.
|
||||||
|
def self.loop(window, &block)
|
||||||
|
max_fps = 60
|
||||||
|
max_dt = 1000. / 60
|
||||||
|
|
||||||
|
timer = Naka::Timer.new
|
||||||
|
|
||||||
|
renderer = window.renderer
|
||||||
|
|
||||||
|
::loop do
|
||||||
|
exit_requested = false
|
||||||
|
|
||||||
|
while event = SDL::Event.poll
|
||||||
|
r_value = yield case event
|
||||||
|
when SDL::Event::Quit
|
||||||
|
Naka::Event::Quit.new
|
||||||
|
else # FIXME: Most event types may need proper Naka:: classes.
|
||||||
|
event
|
||||||
|
end
|
||||||
|
|
||||||
|
if r_value == Naka::Event::Quit
|
||||||
|
exit_requested = true
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
break if exit_requested
|
||||||
|
|
||||||
|
dt = timer.step
|
||||||
|
|
||||||
|
r_value = yield Naka::Event::Update.new dt
|
||||||
|
|
||||||
|
break if r_value == Naka::Event::Quit
|
||||||
|
|
||||||
|
renderer.draw_color = SDL::Color[255, 255, 255, 255]
|
||||||
|
renderer.clear
|
||||||
|
|
||||||
|
yield Naka::Event::Draw.new window
|
||||||
|
|
||||||
|
renderer.present
|
||||||
|
|
||||||
|
sleep 0.001
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
## Actual application code comes here
|
||||||
|
|
||||||
|
Naka.init
|
||||||
|
|
||||||
|
window = Naka::Window.new "Test", 640, 480
|
||||||
|
|
||||||
|
naka = window.newImage "naka.png"
|
||||||
|
|
||||||
|
Naka::Event.loop window do |event|
|
||||||
|
case event
|
||||||
|
when Naka::Event::Quit
|
||||||
|
next Naka::Event::Quit
|
||||||
|
when Naka::Event::Update
|
||||||
|
p "Update(#{event.dt})"
|
||||||
|
when Naka::Event::Draw
|
||||||
|
p "Draw"
|
||||||
|
event.window.draw naka, 20, 20
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in New Issue
Block a user