-
-
Save mirichi/e40b79c6caf4fc1a6a9a to your computer and use it in GitHub Desktop.
マウスカーソルの位置に白い四角を描画するサンプル
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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