3日目

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