<   2010年 08月 ( 8 )   > この月の画像一覧

ruby/sdlのevent=SDL::Event.pollに手を入れてみます。
rubygameと言うライブラリーを使ってみた。
eventの管理方法は良いが、使い方が複雑だった。
だから必要な部分だけ、いただいちゃいました。ごちそうさま。
簡単にしたと言っても直ぐにピンとこないと思います。
ここは、習うより慣れろ。だ!
Don't think,Feel!
@handle_list にHandleクラスをキー、Procをバリューにして入れと置く。
この使い方だけ解れば、そうパターンが多いものじゃないから、大丈夫でしょ。
ジョイスティックをもってないので、ジョイスティックのイベントを作ってません。
ジョイスティックのイベントを使いたい人はHandle#initializeの中で@mathod = :whichにするようにプログラムを書いてやれば良いと思う。
後、SDL::Event.push(event)を使えばwiiリモコンやwii ボードに繋げそうな匂いがしますね。
今回のプログラムは矢印キーの右左で四角が移動。マウスの左クリックしながらの移動。


#!/usr/bin/env ruby

require 'rubygems'
require 'sdl'

class Handle
def initialize(evnt_class,event_sym_or_button=nil)
@event_class = evnt_class
@const = event_sym_or_button
if @const
if @event_class == SDL::Event::KeyDown || @event_class == SDL::Event::KeyUp
@method = :sym
elsif @event_class == SDL::Event::MouseButtonDown || @event_class == SDL::Event::MouseButtonUp
@method = :button
end
end
end
def match?(event)
if @const
event.kind_of?(@event_class) && @const == event.method(@method).call
else
event.kind_of?(@event_class)
end
end
end

class Cell
attr_accessor :x,:y,:w,:h,:bg_color
def initialize(surface)
@home = surface
@x,@y,@w,@h = 200,200,30,30
@surface = SDL::Surface.new(SDL::SWSURFACE,@w,@h,@home)
@bg_color = [255,255,100]
end
def update
@surface.fill_rect(0,0,@w,@h,@bg_color)
end
def blit
SDL::Surface.blit(@surface,0,0,@w,@h,@home,@x,@y)
end
def collide_point?(x,y)
@x < x && @x + @w > x && @y < y && @y + @h > y
end
end

class Phase
def initialize(screen)
@surface = screen
@w,@h = @surface.w,@surface.h
@cell = Cell.new(@surface)
@dx = 0
@handle_list = {
Handle.new(SDL::Event::KeyDown,SDL::Key::LEFT) => proc{@dx -= 1},
Handle.new(SDL::Event::KeyDown,SDL::Key::RIGHT) => proc{@dx += 1},
Handle.new(SDL::Event::KeyUp,SDL::Key::LEFT) => proc{@dx += 1},
Handle.new(SDL::Event::KeyUp,SDL::Key::RIGHT) => proc{@dx -= 1},
Handle.new(SDL::Event::MouseMotion) => proc{|event| self.mouse_move(event)},
Handle.new(SDL::Event::MouseButtonDown,SDL::Mouse::BUTTON_LEFT) => proc{|event| self.mouse_down(event)},
Handle.new(SDL::Event::MouseButtonUp,SDL::Mouse::BUTTON_LEFT) => proc{|event| self.mouse_up(event)},
Handle.new(SDL::Event::Quit) => proc{exit},
Handle.new(SDL::Event::KeyDown,SDL::Key::ESCAPE) => proc{exit}
}
@catch = false
end
def mouse_move(event)
if @cell.collide_point?(event.x,event.y)
if @catch
@cell.x = event.x + @mx
@cell.y = event.y + @my
end
end
end
def mouse_down(event)
if @cell.collide_point?(event.x,event.y)
@cell.bg_color = [255,0,0]
@catch = true
@mx,@my = @cell.x - event.x,@cell.y - event.y
end
end
def mouse_up(event)
if @cell.collide_point?(event.x,event.y)
@cell.bg_color = [255,255,100]
@catch = false
end
end
def handling(event)
@handle_list.each do |event_handle,method|
if event_handle.match?(event)
method.call(event)
end
end
end
def update
@surface.fill_rect(0,0,@surface.w,@surface.h,[50,50,50])
@cell.x += @dx * 8
@cell.x = 0 if @cell.x < 0
@cell.x = @w - @cell.w if @cell.x >= @w - @cell.w
@cell.update
@cell.blit
end
def run
loop do
while event=SDL::Event.poll
self.handling(event)
end
self.update
@surface.update_rect(0,0,0,0)
SDL.delay(20)
end
end
end

SDL.init( SDL::INIT_VIDEO )
screen = SDL::setVideoMode(400,400,16,SDL::SWSURFACE)
Phase.new(screen).run
[PR]
by gaziya | 2010-08-29 09:35
アニメーションを作る事と意識して書いてみた。
@cast,@movieでシナリオを表現できないかな?って試作です。
他にも方法があるかもしれないけど、まずは、これで。
Cellクラスを一括で管理できるようにPhaseクラスに@cell_list を置いた。
ここで、一工夫。
Cell.newをしてから@cell_listに登録するのじゃなくて、
Cell.newにPhaseを入れる事(Phasクラスの中でCell.new(self))で初期化の時に自動で登録できる。
ボケ防止だね。
bilt転送の方法の切り替えはTransformモジュールのインクルード(ここではextend)でする。
Cellのupdateは自動のプログラム
Phaseのupdateはコントロールのプログラム
て感じかな。


#!/usr/bin/env ruby

require 'rubygems'
require 'sdl'

module Items
module SpaceShip
def load_item
self.get_surface(50,50)
dot =[
[0,1,0,0,0,0,0,0,1,0],
[0,1,0,0,1,1,0,0,1,0],
[0,0,1,1,1,1,1,1,0,0],
[1,1,1,1,1,1,1,1,1,1],
[1,0,1,0,1,1,0,1,0,1],
[1,0,1,0,1,1,0,1,0,1],
[1,1,1,1,1,1,1,1,1,1],
[0,0,1,1,1,1,1,1,0,0],
[0,1,1,0,0,0,0,1,1,0],
[1,0,0,0,0,0,0,0,0,1]
]
for i in 0..9
for j in 0..9
@surface.fill_rect(j * 5,i * 5,5,5,[46,139,87]) if dot[i][j] == 1
end
end
@surface.set_color_key(SDL::SRCCOLORKEY,@surface.get_pixel(0,0))
end
end
module Face
def load_item
self.get_surface(50,50)
self.set_font("VL-Gothic-Regular.ttf",20)
@method = {
0 => proc{@font.draw_blended_utf8(@surface,"^o^",8,14,1,1,1)},
1 => proc{@font.draw_blended_utf8(@surface,"T_T",8,14,1,1,1)},
2 => proc{@font.draw_blended_utf8(@surface,">_<",8,14,1,1,1)}
}
@time = SDL.get_ticks
@idx = 0
end
def update
@angle -= 1
@surface.draw_circle(25,25,23,[244,164,96],true)
if SDL.get_ticks - @time > 1000
@idx += 1
@time = SDL.get_ticks
@idx = 0 if @idx == 3
end
@method[@idx].call
@surface.set_color_key(SDL::SRCCOLORKEY,@surface.get_pixel(0,0))
end
end
module CrescentMoon
def load_item
self.get_surface(50,50)
@surface.draw_circle(25,25,18,[255,50,0],true)
@surface.draw_circle(20,30,18,@surface.get_pixel(0,0),true)
@surface.set_color_key(SDL::SRCCOLORKEY,@surface.get_pixel(0,0))
end
def update
@angle += 1
end
end
end

module Transform
def blit
SDL::Surface.transform_blit(@surface,@home.screen,@angle,@xscale,@yscale,@px,@py,@qx,@qy,SDL::TRANSFORM_SAFE) if @enabled
end
end

class Cell
attr_accessor :x,:y,:angle,:px,:py,:qx,:qy,:enabled
def initialize(phase)
@home = phase
@home.cell_list << self
@x,@y = 0,0
@angle,@xscale,@yscale,@px,@py,@qx,@qy = 0,1.0,1.0,0,0,0,0
@enabled = true
end
def get_surface(w,h)
@w,@h = w,h
@surface = SDL::Surface.new(SDL::SWSURFACE,@w,@h,@home.screen)
end
def set_font(ttf_font_file,size)
@font = SDL::TTF.open(ttf_font_file,size)
@font_color = :black
@text = " "
end
def render_font(text,r,g,b)
@surface = @font.render_blended_utf8(text,r,g,b)
@w,@h = @surface.w,@surface.h
end
def update
end
def blit
SDL::Surface.blit(@surface,0,0,@w,@h,@home.screen,@x,@y) if @enabled
end
def each
yield(self)
end
end

class Phase
attr_accessor :screen,:cell_list
def initialize(screen)
@screen = screen
@w,@h = @screen.w,@screen.h
@cell_list = []
@cast = {
:crescent_moon =>
Cell.new(self).each do |item|
item.extend(Transform)
item.extend(Items::CrescentMoon)
item.load_item
item.x,item.y = 280,220
item.px,item.py,item.qx,item.qy = 100,100,225,225
item
end,
:ship =>
Cell.new(self).each do |item|
item.extend(Items::SpaceShip)
item.load_item
item.load_item
item
end,
:face =>
Cell.new(self).each do |item|
item.extend(Transform)
item.extend(Items::Face)
item.load_item
item.px,item.py,item.qx,item.qy = 25,25,220,220
item
end,
:font =>
Cell.new(self).each do |item|
item.set_font("VL-Gothic-Regular.ttf",30)
item.render_font("Thank you",255,255,0)
item.x,item.y = 150,150
item.enabled = false
item
end
}
@cue = :scene0
@movie = {
:scene0 =>
proc{
@cast[:ship].each do |item|
item.x,item.y = 10,10
end
@cast[:font].enabled = false
@cue = :scene1
},
:scene1 =>
proc{
@cast[:ship].each do |item|
item.x += 1
item.y += 1
@cue = :scene2 if item.x > 195
end
},
:scene2 =>
proc{
@cast[:font].enabled = true
@time = SDL.get_ticks if @time.nil?
if SDL.get_ticks - @time > 1000
@time = nil
@cue = :scene0
end
}
}
end

def update
@screen.fill_rect(0,0,@screen.w,@screen.h,[10,10,120])
@movie[@cue].call
@cell_list.each do|cell|
cell.update
cell.blit
end
end
def run
loop do
while event=SDL::Event.poll
case event
when SDL::Event::Quit
exit
when SDL::Event::KeyDown
exit if event.sym == SDL::Key::ESCAPE
end
end
SDL.delay(20)
self.update
@screen.update_rect(0,0,0,0)
end
end
end

SDL.init( SDL::INIT_VIDEO )
SDL::TTF.init
SDL::Mouse.hide
screen = SDL::setVideoMode(400,400,16,SDL::SWSURFACE)
Phase.new(screen).run
[PR]
by gaziya | 2010-08-28 10:05
以前、net/httpでドハマリしたことがある。
ネット検索したけど、俺のエラーの質問と同じ事だけ載ってた。
役しねえ。
さんざん、コネくりまわしたあげくに、ruby/ioに手を出した。
純粋ルビーじゃないので抵抗はあったが、やってみるものだ。
と言うことでLinux以外の人ごめんなさい。
io = IO.popen("wget -q -O - %s 2" % url)
この一行に辿り着きました。
内緒で使ってたけど、ブログを書き始めたと言うことで載せちゃいます。
普段はパイプでnkfを通して使ってます。
試したい人は自力で。と言ってもそんなに難しくないけど。
printf,format使ってる人
"wget -q -O - %s 2" % url
この書き方もステキ
今日はyahoo天気から日本列島の上空写真をダウンロードして表示する奴。

#!/usr/bin/env ruby

require 'rubygems'
require 'sdl'

class Cell
def initialize(surface)
@home = surface
self.file_download
self.load_image("weather.jpg")
@x = (@home.w - @w) / 2
@y = (@home.h - @h) / 2
end
def file_download
url = "http://weather.yahoo.co.jp/weather/"
html = ""
io = IO.popen("wget -q -O - %s 2" % url)
while line = io.gets
html << line
end
io.close
if /satellite.html(.*?)width/ =~ html
if /(http.*?)"/ =~ $1
url = $1
end
end
io = IO.popen("wget -q -O weather.jpg %s" % url)
io.close
end
def load_image(image_file)
@surface = SDL::Surface.load(image_file).display_format
@w,@h = @surface.w,@surface.h
end
def blit
SDL::Surface.blit(@surface,0,0,@w,@h,@home,@x,@y)
end
end

class Phase
def initialize(screen)
@screen = screen
@screen.fill_rect(0,0,@screen.w,@screen.h,[80,80,80])
@cell = Cell.new(@screen)
@cell.blit
@screen.update_rect(0,0,0,0)
end
def run
loop do
while event=SDL::Event.poll
case event
when SDL::Event::Quit
exit
when SDL::Event::KeyDown
exit if event.sym == SDL::Key::ESCAPE
end
end
end
end
end

SDL.init( SDL::INIT_VIDEO )
SDL::Mouse.hide
SDL::WM.set_caption("Weather","")
screen = SDL::setVideoMode(300,250,16,SDL::SWSURFACE)
Phase.new(screen).run
[PR]
by gaziya | 2010-08-27 20:46
ちょっと、お詫びです。
古い方のリファレンスを見ながら作っていたみたいです。
古い方 SDL.blit_surface
新しい方 SDL::Surface.blit

古い方 SDL.transform_blit
新しい方 SDL::Surface.transform_blit
この2つを入れ替えてください。
別に支障はなさそううだけど、推奨されてないので。

プログラムの中で
@face1 =
Cell.new(@screen).each do |item|
item.extend(Items::Face1)
item.load_item
item.x = 70
item.y = 120
item
end
というのが、あります。
ちょっと違和感がありますが、最後にitemを入れないと
@face1にはitem.y = 120が入ってしまいます。
@face1にはCell.new(@screen)を入れないと後で役をしません。
自分で作りながらも、最初は慣れなかったですね。
でも、使いかってはイイ~
あと、case文をhashとprocを使って書き換えてみた。
結構いけてます。

#!/usr/bin/env ruby

require 'rubygems'
require 'sdl'

module Items
module Face1
def load_item
self.get_surface(50,50)
@font = SDL::TTF.open("VL-Gothic-Regular.ttf",20)
@time = SDL.get_ticks
@idx = 0
end
def change
@surface.draw_circle(25,25,23,[244,164,96],true)
if SDL.get_ticks - @time > 1000
@idx += 1
@idx = 0 if @idx == 3
@time = SDL.get_ticks
end
case @idx
when 0
@font.draw_blended_utf8(@surface,"^o^",8,14,1,1,1)
when 1
@font.draw_blended_utf8(@surface,"T_T",8,14,1,1,1)
when 2
@font.draw_blended_utf8(@surface,">_<",8,14,1,1,1)
end
@surface.set_color_key(SDL::SRCCOLORKEY,@surface.get_pixel(0,0))
end
end

module Face2
def load_item
self.get_surface(50,50)
@font = SDL::TTF.open("VL-Gothic-Regular.ttf",20)
@method = {
0 => proc{@font.draw_blended_utf8(@surface,"^o^",8,14,1,1,1)},
1 => proc{@font.draw_blended_utf8(@surface,"T_T",8,14,1,1,1)},
2 => proc{@font.draw_blended_utf8(@surface,">_<",8,14,1,1,1)}
}
@time = SDL.get_ticks
@idx = 0
end
def change
@surface.draw_circle(25,25,23,[244,164,96],true)
if SDL.get_ticks - @time > 1000
@idx += 1
@idx = 0 if @idx == 3
@time = SDL.get_ticks
end
@method[@idx].call
@surface.set_color_key(SDL::SRCCOLORKEY,@surface.get_pixel(0,0))
end
end
end

class Cell
attr_reader :surface
attr_accessor :x,:y
def initialize(surface)
@home = surface
end
def get_surface(w,h)
@w,@h = w,h
@surface = SDL::Surface.new(SDL::SWSURFACE,@w,@h,@home)
end
def load_image(image_file)
@surface = SDL::Surface.load(image_file).display_format
@w,@h = @surface.w,@surface.h
end
def update
self.change
end
def blit
SDL::Surface.blit(@surface,0,0,@w,@h,@home,@x,@y)
end
def each
yield(self)
end
end

class Phase
def initialize(screen)
@screen = screen
self.fill([80,80,80])
@face1 =
Cell.new(@screen).each do |item|
item.extend(Items::Face1)
item.load_item
item.x = 70
item.y = 120
item
end
self.item_save("face.bmp")
@face2 =
Cell.new(@screen).each do |item|
item.extend(Items::Face2)
item.load_item
item.x = 300
item.y = 120
item
end
@image =
Cell.new(@screen).each {|item|
item.load_image("face.bmp")
item.surface.set_color_key(SDL::SRCCOLORKEY,item.surface.get_pixel(0,0))
item.x,item.y = 180,120
item
}
end
def fill(color)
@screen.fill_rect(0,0,@screen.w,@screen.h,color)
end
def item_save(filename)
@face1.change
@face1.surface.save_bmp(filename)
end
def update
@face1.update
@face2.update
@face1.blit
@face2.blit
@image.blit
end
def run
loop do
while event=SDL::Event.poll
case event
when SDL::Event::Quit
exit
when SDL::Event::KeyDown
exit if event.sym == SDL::Key::ESCAPE
end
end
SDL.delay(50)
self.update
@screen.update_rect(0,0,0,0)
end
end
end

SDL.init( SDL::INIT_VIDEO )
SDL::TTF.init
SDL::Mouse.hide
screen = SDL::setVideoMode(450,300,16,SDL::SWSURFACE)
Phase.new(screen).run
[PR]
by gaziya | 2010-08-26 19:35
関数に名前を付けるは、難しい。
alcのホームページで思いつく日本語を入力して帰ってくる英語とイメージとケンカしながら、とりあえず仮に決める。
プログラムを書き進めると、又違う関数と名前の取り合いになってくる。
関数を書き換えるより、関数名や変数名を書き換える事が多いような気がする。
今回もクラス名のCell,Phaseに落ち着くまで何回書き換えたことか。
今日は、フォントを回転、拡大する奴。
VL-Gothic-Regular.ttfを同じフォルダに入れて置いてください。
ruby/sdl関係を片っ端から検索した途中で拾ったから入手方法は忘れました。
ネットを検索すれば、なんとかなると思いますよ。


#!/usr/bin/env ruby

require 'rubygems'
require 'sdl'

class Cell
def initialize(surface)
@home = surface
@font = SDL::TTF.open("VL-Gothic-Regular.ttf",30)
@angle,@xscale,@yscale,@px,@py,@qx,@qy = 0,1.0,1.0,50,50,250,250
end
def render_font(text,color)
r,g,b = color
@surface = @font.render_blended_utf8(text,r,g,b)
#@surface = @font.render_solid_utf8(text,r,g,b)
@w,@h = @surface.w,@surface.h
end
def update
@angle += 1
@xscale += 0.03
@yscale += 0.03
if @xscale > 5
@xscale = 1
@yscale = 1
end
end
def blit
SDL.transform_blit(@surface,@home,@angle,@xscale,@yscale,@px,@py,@qx,@qy,SDL::TRANSFORM_SAFE)
end
end

class Phase
def initialize(screen)
@screen = screen
@w,@h = @screen.w,@screen.h
@cell = Cell.new(@screen)
@cell.render_font("TEXT",[0,0,0])
end
def fill
@screen.fill_rect(0,0,@w,@h,[250,128,114])
end
def update
self.fill
@cell.update
@cell.blit
@screen.update_rect(0,0,0,0)
end
def run
loop do
while event=SDL::Event.poll
case event
when SDL::Event::Quit
exit
when SDL::Event::KeyDown
exit if event.sym == SDL::Key::ESCAPE
end
end
sleep(0.05)
self.update
end
end
end

SDL.init( SDL::INIT_VIDEO )
SDL::TTF.init
SDL::Mouse.hide
SDL::WM.set_caption("RUBY/SDL","")
screen = SDL::setVideoMode(500,500,16,SDL::SWSURFACE)
Phase.new(screen).run
[PR]
by gaziya | 2010-08-25 20:43
rubyを使いだしてから、7、8年たつと思う。
rubyのイテレータが楽だし、綺麗に書けるから気に入ったのだと思う。
しかし、yieldの関数を今まで一度も使った事がなかった。
array,hash、sort,reject,scan....普通に使うのは全て揃ってる。
だから、”いらないでしょう”と思ってた。
だけど、クラスに
def each
yield(self)
end
を、追加するだけでスッキリ書ける事に気がついた。
もう、とまらないよね~

昨日のものをちょっと変えて、車が走る奴。

#!/usr/bin/env ruby

require 'rubygems'
require 'sdl'

module Items
module Car
def load_item
self.get_surface(50,50)
@surface.fill_rect(15,10,25,10,[255,20,0])
@surface.fill_rect(17,12,8,8,[200,200,200])
@surface.fill_rect(27,12,8,8,[200,200,200])
@surface.fill_rect(0,20,50,10,[255,20,0])
x,y = 12,30
@surface.draw_filled_circle(x,y,5,[100,0,0])
@surface.draw_circle(x,y,5,[255,255,255])
@surface.draw_circle(x,y,2,[255,255,255])
x,y = 38,30
@surface.draw_filled_circle(x,y,5,[100,0,0])
@surface.draw_circle(x,y,5,[255,255,255])
@surface.draw_circle(x,y,2,[255,255,255])
@surface.set_color_key(SDL::SRCCOLORKEY,@surface.get_pixel(0,0))
end
end
end

class Cell
include Items::Car
attr_reader :surface
attr_accessor :x,:y
def initialize(surface)
@home = surface
end
def get_surface(w,h)
@w,@h = w,h
@surface = SDL::Surface.new(SDL::SWSURFACE,@w,@h,@home)
end
def update
@x -= 5
@x = @home.w if @x == -1 * @w
end
def blit
SDL.blit_surface(@surface,0,0,@w,@h,@home,@x,@y)
end
def each
yield(self)
end
end

class Phase
def initialize(screen)
@screen = screen
@cell =
Cell.new(@screen).each do |item|
item.x = 125
item.y = 125
item.load_item
item
end
end
def item_save(filename)
@cell.surface.save_bmp(filename)
end
def update
@screen.fill_rect(0,0,@screen.w,@screen.h,[0,80,80])
@cell.update
@cell.blit
@screen.update_rect(0,0,0,0)
end
def run
loop do
while event=SDL::Event.poll
case event
when SDL::Event::Quit
exit
when SDL::Event::KeyDown
exit if event.sym == SDL::Key::ESCAPE
end
end
sleep(0.05)
self.update
end
end
end

SDL.init( SDL::INIT_VIDEO )
SDL::Mouse.hide
screen = SDL::setVideoMode(300,300,16,SDL::SWSURFACE)
phase = Phase.new(screen)
#phase.item_save("car.bmp")
phase.run
[PR]
by gaziya | 2010-08-24 18:54
ブログって事もあってファイル添付を避けて、モジュールって形でイメージを作ってみました。
ruby/sdlの関数だけでも,何とか絵も描けるものだ。
SDL::Surface#draw_lineを駆使して星型とか、ちょっと特殊な図形を描くのも、いい遊びになりそう。
リファレンスに  SDL::Surface#draw_line(x1,x2,y1,y2,color) と書いてあり、その通りにしたら、とても綺麗な図形になった。それもありかななんて思ったけど・・
SDL::Surface#draw_line(x1,y1,x2,y2,color) が正しいかな。
リファレンスが出来て何年もたってると思うけど、直ってないってことはSDL::Surface#draw_lineは、ほぼ使われってないって事か。イコール俺はマイナー指向!?

ロケットが飛んで行く奴。

#!/usr/bin/env ruby

require 'rubygems'
require 'sdl'

module Items
module Rocket
def load_item
self.get_surface(50,50)
x,y = 25,0
for i in 0..10
@surface.draw_line(x - i / 2,i,x + i / 2,i,[255,100,0])
end
@surface.fill_rect(20,10,10,25,[200,255,225])
@surface.fill_rect(16,25,3,10,[200,255,225])
@surface.fill_rect(31,25,3,10,[200,255,225])
x,y = 25,35
for i in 0..15
@surface.draw_line(x - i / 3,y + i,x + i / 3,y + i,[255,230,0])
end
@surface.set_color_key(SDL::SRCCOLORKEY,@surface.get_pixel(0,0))
end
end
end

class Cell
include Items::Rocket
attr_reader :surface
def initialize(surface)
@home = surface
@x,@y = 125,125
end
def get_surface(w,h)
@w,@h = w,h
@surface = SDL::Surface.new(SDL::SWSURFACE,@w,@h,@home)
end
def update
@y -= 5
@y = 300 if @y == -50
end
def blit
SDL.blit_surface(@surface,0,0,@w,@h,@home,@x,@y)
end
end

class Phase
def initialize(screen)
@screen = screen
@cell = Cell.new(@screen)
@cell.load_item
end
def item_save(filename="a.bmp")
@cell.surface.save_bmp(filename)
end
def run
loop do
while event=SDL::Event.poll
case event
when SDL::Event::Quit
exit
when SDL::Event::KeyDown
exit if event.sym == SDL::Key::ESCAPE
end
end
sleep(0.05)
@screen.fill_rect(0,0,@screen.w,@screen.h,[143,100,143])
@cell.update
@cell.blit
@screen.update_rect(0,0,0,0)
end
end
end

SDL.init( SDL::INIT_VIDEO )
SDL::Mouse.hide
screen = SDL::setVideoMode(300,300,16,SDL::SWSURFACE)
phase = Phase.new(screen)
#phase.item_save("rocket.bmp")
phase.run
[PR]
by gaziya | 2010-08-23 20:44
この夏に怒涛のように書いてしまったプログラム。
しばらくは、これを出していきます。
ruby/sdlを使って書きました。
インベーダーゲームの宇宙船もどきのBMPを出力する奴。

#!/usr/bin/env ruby

# http://www.kmc.gr.jp/‾ohai/rubysdl_ref.html#label-17

require 'rubygems'
require 'sdl'

module SpaceShip
def load_item
self.get_surface(50,50)
dot =[
[0,1,0,0,0,0,0,0,1,0],
[0,1,0,0,1,1,0,0,1,0],
[0,0,1,1,1,1,1,1,0,0],
[1,1,1,1,1,1,1,1,1,1],
[1,0,1,0,1,1,0,1,0,1],
[1,0,1,0,1,1,0,1,0,1],
[1,1,1,1,1,1,1,1,1,1],
[0,0,1,1,1,1,1,1,0,0],
[0,1,1,0,0,0,0,1,1,0],
[1,0,0,0,0,0,0,0,0,1]
]
for i in 0..9
for j in 0..9
@surface.fill_rect(j * 5,i * 5,5,5,[255,255,0]) if dot[i][j] == 1
end
end
@surface.set_color_key(SDL::SRCCOLORKEY,@surface.get_pixel(0,0))
end
end

class Cell
attr_reader :surface
def initialize(surface)
@home = surface
end
def get_surface(w,h)
@w,@h = w,h
@x = (@home.w - @w) / 2
@y = (@home.h - @h) / 2
@surface = SDL::Surface.new(SDL::SWSURFACE,@w,@h,@home)
end
def blit
SDL.blit_surface(@surface,0,0,@w,@h,@home,@x,@y)
end
end

class Module2Bmp
def initialize
SDL.init( SDL::INIT_VIDEO )
@screen = SDL::setVideoMode(300,300,16,SDL::SWSURFACE)
@screen.fill_rect(0,0,@screen.w,@screen.h,[80,80,80])
end
def set_module(mod)
@cell = Cell.new(@screen)
@cell.extend(mod)
@cell.load_item
end
def item_save(filename="a.bmp")
@cell.surface.save_bmp(filename)
end
def run
loop do
while event=SDL::Event.poll
case event
when SDL::Event::Quit
exit
when SDL::Event::KeyDown
exit if event.sym == SDL::Key::ESCAPE
end
end
@cell.blit
@screen.update_rect(0,0,0,0)
end
end
end

mod = Module2Bmp.new
mod.set_module(SpaceShip)
mod.item_save("space_ship.bmp")
mod.run
[PR]
by gaziya | 2010-08-22 10:49