5日目

ちょっと、お詫びです。
古い方のリファレンスを見ながら作っていたみたいです。
古い方 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