エフェクトしながら動かす

cairoの色をチェックするには、
http://www.cybergarden.net/references/colors/unix140.html
が、良いですね。
cairoは、X11の色も使える。
cairoの色も、そんなに変わらないから参考になります。

今回は、convertでエフェクトをかけながら画像を動かす。
http://mechanics.civil.tohoku.ac.jp/soft/node43.html
ここを、参考にしました。

#!usr/bin/env ruby

require 'sdl'
require 'cairo'

class BackGround
def initialize(w,h)
@w,@h = w,h
end

def update(c)
c.set_source_color(Cairo::Color::OLIVE)
c.rectangle(0,0,@w,@h)
c.fill
end
end

class Image
def initialize
url = "http://mechanics.civil.tohoku.ac.jp/soft/i-gif/magick1.gif"
@img = `wget -q -O - #{url} | convert -resize 120% - png:-`
@x,@y = 20,20
end

def effect
""
end

def update(c)
IO.popen("convert - #{self.effect} -","r+") do |io|
io.write(@img)
io.close_write
@surface = Cairo::ImageSurface.from_png(io)
end
c.set_source(@surface,@x,@y)
c.paint
end
end

class SwirlImage < Image
def initialize
super
@x,@y = 200,20
@v = 0
end

def effect
@v += 10
@v = 0 if @v >800
"-swirl %d" % @v
end
end

class WaveImage < Image
def initialize
super
@x,@y = 380,20
@v = 50
end

def effect
@v += 2
@v = 30 if @v >120
"-wave 5x%d" % @v
end
end

class Phase
def initialize(w,h)
SDL.init(SDL::INIT_VIDEO)
@w,@h = w,h
@screen = SDL::Screen.open(@w,@h,SDL::Screen.info.bpp,SDL::SWSURFACE)
@surface = Cairo::ImageSurface.new(@w,@h)
@context = Cairo::Context.new(@surface)
@item = []
@item << BackGround.new(@w,@h)
@item << Image.new
@item << SwirlImage.new
@item << WaveImage.new
end

def update
@item.each {|x| x.update(@context)}
SDL::Surface.new_from(@surface.data,@w,@h,32,@surface.stride,0,0,0,0)
end

def run
loop do
while e=SDL::Event.poll
exit if e.kind_of?(SDL::Event::Quit) || (e.kind_of?(SDL::Event::KeyDown) && e.sym == SDL::Key::ESCAPE)
end
@screen.put(self.update,0,0)
@screen.flip
SDL.delay(20)
end
end
end

Phase.new(550,210).run
[PR]
by gaziya | 2011-05-02 19:21