Skip to content

Instantly share code, notes, and snippets.

@mirichi

mirichi/sample.rb Secret

Created Mar 5, 2016
Embed
What would you like to do?
マウスカーソルの位置に白い四角を描画するサンプル
require 'sdl2r'
require_relative 'component'
# create_textureイベントで属性textureに白い四角のテクスチャオブジェクトを設定する機能コンポーネント
class TofuTexture < FeatureComponent
def init_component
super
@parent.init_attribute(:texture, nil)
@parent.add_event_handler(:create_texture, self.method(:on_create_texture))
end
def on_create_texture(renderer)
surface = SDL.create_rgb_surface(0, 100, 100, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000)
SDL.fill_rect(surface, nil, [255, 255, 255, 255])
texture = SDL.create_texture_from_surface(renderer, surface)
@parent.set_attribute(:texture, texture)
end
end
# mouse_moveイベントを受け取って属性x/yを更新する機能コンポーネント
class MouseCursor < FeatureComponent
def init_component
super
@parent.init_attribute(:x, 0)
@parent.init_attribute(:y, 0)
@parent.add_event_handler(:mouse_move, self.method(:on_mouse_move))
end
def on_mouse_move(event)
@parent.set_attribute(:x, event.x)
@parent.set_attribute(:y, event.y)
end
end
# drawイベントを受け取って属性x/yの位置に属性textureを描画する機能コンポーネント
class Drawable < FeatureComponent
def init_component
super
@parent.init_attribute(:x, 0)
@parent.init_attribute(:y, 0)
@parent.init_attribute(:texture, nil)
@parent.add_event_handler(:draw, self.method(:on_draw))
end
def on_draw(renderer)
# 属性及取得
x = @parent.get_attribute(:x)
y = @parent.get_attribute(:y)
texture = @parent.get_attribute(:texture)
# テクスチャのサイズ取得
_, _, w, h = SDL.query_texture(texture)
# 描画
SDL.set_texture_blend_mode(texture, SDL::BLENDMODE_BLEND)
SDL.render_copy(renderer, texture, nil, SDL::Rect.new(x, y, w, h))
end
end
# 白い四角をマウスカーソルの位置に描画する簡易Sprite
class Sprite < Component
def init_component
super
init_attribute(:x, 0)
init_attribute(:y, 0)
init_attribute(:texture, nil)
# 属性textureに白い四角を設定する機能コンポーネント
add_component(TofuTexture)
# mouse_moveイベントを受け取って属性x/yを更新する機能コンポーネント
add_component(MouseCursor)
# drawイベントを受け取って属性x/yの位置に属性textureを描画するコンポーネント
add_component(Drawable)
end
end
# WindowとRenderer作成
window = SDL.create_window("sdl2r Sample Application",
SDL::WINDOWPOS_UNDEFINED,
SDL::WINDOWPOS_UNDEFINED,
640,
480,
SDL::WINDOW_SHOWN)
renderer = SDL.create_renderer(window, -1, 0)
# Sprite作成とテクスチャ準備
sprite = Sprite.new
sprite.post_event(:create_texture, renderer)
# SDL2のタイマは別スレッドでコールバックされるのでRubyでは扱えず、
# sdl2r独自にタイマイベントを発行するように機能追加してある。
timer_event = SDL.register_events(1) # まずイベントIDを取得して
SDL.add_timer_event(16, timer_event) # interval(ms)とイベントIDをadd_timer_eventに渡すと
# このIDでイベントが発行されるようになる
# メイン処理
loop do
# SDL2のイベント処理
while event = SDL.poll_event do
case event.type
when timer_event # 16msごとに発生するように↑で設定したイベント
# 画面のクリア
SDL.set_render_target(renderer, nil)
SDL.set_render_draw_color(renderer, 0, 0, 0, 0)
SDL.set_render_draw_blend_mode(renderer, SDL::BLENDMODE_NONE)
SDL.render_fill_rect(renderer, nil)
# 描画
sprite.post_event(:draw, renderer)
# 画面更新
SDL.render_present(renderer)
# マウス移動のイベント
when SDL::MOUSEMOTION
sprite.post_event(:mouse_move, event)
# 終了
when SDL::QUIT
exit
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment