「逆引きRuby/SDL」の編集履歴(バックアップ)一覧はこちら
逆引きRuby/SDL - (2008/05/11 (日) 15:59:52) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
ただの団員用メモです。
何か解釈が変なところとか間違ってるとことか動くけどまずいようなところがあったらコメで教えてください。
#contents
**描画した円を動かす
SDLはサーフェスという単位で画面内に描画するものを管理しているので、描画した円とか線とかを直接オブジェクトとしては扱えません。
+新しいサーフェスを作る
+作ったサーフェスに描画
+メインのサーフェスに貼り付け
こうやってやらないといけないんですよね。
最初これに気付かず、画像を読み込むときの
#highlight(ruby){{
image = SDL::Surface.loadImage("filename")}}
を真似て、
#highlight{{
ball = SDL::Surface.drawFilledCircle(x, y, r, color)
}}
みたいなことやってました。
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, 0x00000000)
> @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本家>http://www.kmc.gr.jp/~ohai/rubysdl_intro.html]]からどうぞ。
ただの団員用メモです。
何か解釈が変なところとか間違ってるとことか動くけどまずいようなところがあったらコメで教えてください。
#contents
**描画した円を動かす
SDLはサーフェスという単位で画面内に描画するものを管理しているので、描画した円とか線とかを直接オブジェクトとしては扱えません。
+新しいサーフェスを作る
+作ったサーフェスに描画
+メインのサーフェスに貼り付け
こうやってやらないといけないんですよね。
最初これに気付かず、画像を読み込むときの
#highlight(ruby){{
image = SDL::Surface.loadImage("filename")}}
を真似て、
#highlight{{
ball = SDL::Surface.drawFilledCircle(x, y, r, color)}}
みたいなことやってました。
drawFilledCircle()メソッドはSDL::Surfaceのインスタンスに対してはたらくメソッドで、勝手に新しいサーフェスを生成してくれるわけじゃないようです。
そういうメソッドもつくってくれないでしょうかねぇ・・・。
↓テスト用のプログラム。きたないけど一応貼っときます。
#highlight(){{
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本家>http://www.kmc.gr.jp/~ohai/rubysdl_intro.html]]からどうぞ。
表示オプション
横に並べて表示:
変化行の前後のみ表示: