人気ブログランキング | 話題のタグを見る

rsdl, rcairo, RMagick のコンボ

バグの原因わかりました。
rubyをバージョンアップすれば解決かと思ったがダメだった。
だけど色々試して、やっとわかった。
プログラムの途中に
@pixels = magick.export_pixels_to_str(0, 0, @w, @h, 'RGBA')
@image = Cairo::ImageSurface.new(@pixels, 0, @w, @h, @pixels.size / @h)
が、ある。
これを
pixels = magick.export_pixels_to_str(0, 0, @w, @h, 'RGBA')
@image = Cairo::ImageSurface.new(pixels, 0, @w, @h, pixels.size / @h)
こうすると、バグる。何故?
普段、こんなとこは気にしないからヒドいめにあったよ。
これからは、よく覚えておかないと。

ruby/sdl,rcairo,RMagickの組み合わせで、使えるようになった。
基本的に、cairoで描写、RMagickでエフェクトでやっていきます。

#!usr/bin/env ruby

require 'sdl'
require 'cairo'
require 'RMagick'

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

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

class Item
def initialize(w, h)
@w, @h = w, h
@x, @y = @w / 2, @h / 2
@image = Cairo::ImageSurface.new(w, h)
c = Cairo::Context.new(@image)
c.matrix = Cairo::Matrix.translate(@x, @y)
c.set_source_color(:red)
c.circle(0, 0, 60)
c.fill
magick = Magick::Image.new(@w, @h).import_pixels(0,0, @w, @h, 'RGBA', @image.data)
magick = magick.splice(@w / 2, @h / 2, 10, 10)
@pixels = magick.export_pixels_to_str(0, 0, @w, @h, 'RGBA')
@image = Cairo::ImageSurface.new(@pixels, 0, @w, @h, @pixels.size / @h)
#pixels = magick.export_pixels_to_str(0, 0, @w, @h, 'RGBA')
#@image = Cairo::ImageSurface.new(pixels, 0, @w, @h, pixels.size / @h)
end

def update(c)
c.set_source(@image)
c.paint
end
end

class Phase
def initialize(w, h)
@w, @h = w, h
@screen = SDL::Screen.open(@w, @h, 32, 0)
@image = Cairo::ImageSurface.new(@w, @h)
@items = []
@items << BackGround.new(@w, @h)
@items << Item.new(@w, @h)
end

def update(c)
@items.each {|obj| obj.update(c)}
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
c = Cairo::Context.new(@image)
self.update(c)
surface = SDL::Surface.new_from(@image.data, @w, @h, 32, @image.data.size / @h, 0, 0, 0, 0)
@screen.put(surface, 0, 0)
@screen.flip
SDL.delay(20)
end
end
end

w, h = 200, 200
SDL.init(SDL::INIT_VIDEO)
Phase.new(w, h).run
by gaziya | 2011-05-28 17:13