インストール
ActiveScriptRubyをインストールしている場合
- RubyForgeからrubysdl-win32-binの最新版をダウンロードします。
- 解凍したら、install.rbをダブルクリックします。こんだけ。
ActiveScriptRubyをインストールしていない場合
- まずActiveScriptRubyをインストールしてください。
学内のマシンにインストール
中京大の演習室のマシンではRubyは動きますがSDLはインストールされていないため動きません。
家のマシンなら前述の方法でSDLはインストールできますが、大学のマシンはCドライブいじくれないためインストールできません。
仕方ないので自由に弄れるHドライブにRubyの実行環境ごと放り込んでパスを通す方法を試してみました。
家のマシンなら前述の方法でSDLはインストールできますが、大学のマシンはCドライブいじくれないためインストールできません。
仕方ないので自由に弄れるHドライブにRubyの実行環境ごと放り込んでパスを通す方法を試してみました。
- RubyForgeから、rubysdl-win32-packageの最新版をDL
- 展開したらrubyという名前のディレクトリが生成されるのでH:\に置く
- 環境変数を設定するためのバッチ(setrubesdlenv.bat)をDLして、H:\に置く
使い方
コマンドプロンプトを立ち上げたら、
コマンドプロンプトを立ち上げたら、
setrubysdlenv.bat
を実行
あとは普通にRuby/SDLのプログラムが実行できます。
描画した円を動かす
SDLはサーフェスという単位で画面内に描画するものを管理しているので、描画した円とか線とかを直接オブジェクトとしては扱えません。
- 新しいサーフェスを作る
- 作ったサーフェスに描画
- メインのサーフェスに貼り付け
こうやってやらないといけないんですよね。
最初これに気付かず、画像を読み込むときの
最初これに気付かず、画像を読み込むときの
image = SDL::Surface.loadImage("filename")
を真似て、
ball = SDL::Surface.drawFilledCircle(x, y, r, color)
みたいなことやってました。
drawFilledCircle()メソッドはSDL::Surfaceのインスタンスに対してはたらくメソッドで、勝手に新しいサーフェスを生成してくれるわけじゃないようです。
そういうメソッドもつくってくれないでしょうかねぇ・・・。
drawFilledCircle()メソッドはSDL::Surfaceのインスタンスに対してはたらくメソッドで、勝手に新しいサーフェスを生成してくれるわけじゃないようです。
そういうメソッドもつくってくれないでしょうかねぇ・・・。
↓テスト用のプログラム。きたないけど一応貼っときます。
require 'sdl'
require 'fpstimer'
class Ball
def initialize(x, y, color, screen)
@screen = screen
@x = x
@y = y
@x_direction = 1
@y_direction = 1
@c = SDL::Surface.new(SDL::SWSURFACE, 10, 10, 16, 0x00000000, 0x00000000, 0x00000000,x00000000)
@c.displayFormat
@c.drawFilledCircle(5,5,5,color)
end
def move
if (@x == 310) or (@x == 0)
@x_direction *= -1
end
if (@y == 230) or (@y == 0)
@y_direction *= -1
end
@x += (5 * @x_direction)
@y += (2 * @y_direction)
@screen.put(@c, @x, @y)
end
end
SDL.init(SDL::INIT_VIDEO)
screen = SDL.setVideoMode(320, 240, 16, SDL::SWSURFACE)
ball_a = Ball.new(10, 20, [0, 0, 255], screen)
ball_b = Ball.new(30, 100, [255, 0, 0], screen)
timer = FPSTimerSample.new
timer.reset
loop do
while event = SDL::Event2.poll
case event
when SDL::Event2::Quit
exit
end
end
screen.fillRect(0, 0, 320, 240, [ 0, 0, 0 ])
ball_a.move
ball_b.move
timer.wait_frame do
screen.updateRect(0, 0, 0, 0)
end
end
fsptimerは必須じゃないけど一応使ってみました。
入手はRuby/SDL本家からどうぞ。
入手はRuby/SDL本家からどうぞ。
HWSURFACEを利用して描画を高速化する
SDL.setVideoMode(320, 240, 16, SDL::SWSURFACE)
を、
SDL.setVideoMode(320, 240, 16, SDL::HWSURFACE)
に書き換えると、WindowsならDirectXを利用して描画してくれるので描画がかなり高速になります。
total
-
today
-
yesterday
-
-
today
-
yesterday
-
添付ファイル