ruby/sdlで、無理やりyoutube 3

rmagickからrcairoへのデータの受け渡しで、またバグが発生した。
まあ、逃げ道が、あるからいいけど。
そんなことで、今度は、rcairoでやってみた。
おばちゃん軍団を一体のボスキャラに見立ててみようと、目論んだ。


#!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(:black)
c.rectangle(0, 0, @w, @h)
c.fill
end
end

class Ball
def initialize(w, h)
@x, @y = w / 2, h / 2
system("youtube-dl 'http://www.youtube.com/watch?v=83P8xRIG3eI' -o /tmp/0.flv")
@ptn = []
(2.1 .. 4.4).step(0.05) do |t|
system("ffmpeg -ss #{t} -vframes 1 -i /tmp/0.flv -f image2 /tmp/0.png 2> /dev/null")
sn = Cairo::ImageSurface.from_png("/tmp/0.png")
image = Cairo::ImageSurface.new(260, 230)
cr = Cairo::Context.new(image)
cr.matrix = Cairo::Matrix.translate(-100, 0)
cr.set_source(sn)
cr.paint
@ptn << image
end
@w, @h = @ptn.first.width, @ptn.first.height
@image = Cairo::ImageSurface.new(@w, @h)
@erx = @w / 2 .. w - @w / 2
@vx= 2
@vx *= -1 if rand(9) < 5
@cut = 0
end

def update(c)
sn = Cairo::Context.new(@image)
sn.set_source(@ptn[@cut])
sn.circle(@w / 2, @h / 2 ,@w / 2 - 10)
sn.fill
@cut += 1
@cut = 0 if @cut == @ptn.size
@vx *= -1 if !@erx.include?(@x + @vx)
@x += @vx
c.matrix = Cairo::Matrix.translate(@x -@w / 2, @y - @h / 2)
c.set_source(@image)
c.paint
end
end

class Phase
def initialize(screen)
@screen = screen
@w, @h = @screen.w, @screen.h
@image = Cairo::ImageSurface.new(@w, @h)
@bg = BackGround.new(@w, @h)
@ball = Ball.new(@w, @h)
end

def update
context = Cairo::Context.new(@image)
@bg.update(context)
@ball.update(context)
surface = SDL::Surface.new_from(@image.data, @image.width, @image.height, 32, @image.stride, 0, 0, 0, 0)
@screen.put(surface, 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
self.update
@screen.flip
SDL.delay(30)
end
end
end

SDL.init(SDL::INIT_VIDEO)
@screen = SDL::Screen.open(650, 450, SDL::Screen.info.bpp, SDL::SWSURFACE)
Phase.new(@screen).run
[PR]
by gaziya | 2011-06-05 11:49