つつ

@ゲーム制作
エディタ弄ってた。結果今回はVisial Stdio Codeを相棒にいざ参らん。
大雑把に言えば、このエディタ自体がSublimeAtomの間の子みたいな立ち位置のモノが
欲しかった自分の要望とマッチしていた事と、それまでの(拡張)環境と比較すると、
スニペット・インデントの挙動や、ミニマップが無かったり等など、
どうしても歴史の短さ故の不足を感じる場面もあるけど、
デバッグの導入が最速に行えたり、挙動が軽快で、
後発の強みである無駄が省かれた扱いやすさが、Rubyを書くのに相性が良いと感じたので。


そして、暗闇に立つ。

以下コード。一つ一つ、感触を確かめ直すように。
過去のソースの流用は極力ナシにして、ひたすら最短最小最低限で組んで、
本当に必要な時だけ頼るように。喉からも手出して三本で縋り付きたい
ライブラリいっぱいあるけどなぁ…!

require 'dxruby'

# @todo
# 描画関連はその内分離

class TaskForce
  def initialize
    @tasks = []
  end
  def add(task)
    @tasks << task
  end
  def delete(task)
    @tasks.delete(task)    
  end
  def sort ; ; end
  def run
    @tasks.delete_if { |t| !t.update }
    @tasks.each(&:draw)
  end
end

class Task
  def initialize(res = nil)
    @priority = 0
    @active = @visible = true
  end
end

class Actor < Task
  def initialize(res)
    super
    if @id
      @img_tiles = res[:image][@id]
      @img_idx = 0 
      Sprite.new
      @image = @img_tiles[@img_idx]
    else
      @visible = false
    end
    @x = @y = 0
  end
  def update ; @active ; end
  def draw ; Window.draw_scale(@x, @y, @image, 3, 3) if @visible  ;end
end

class Player < Actor
  def initialize(res)
    @id = "kukumaru"
    super
    @x = Window.width / 2 - @image.width / 2
    @y = Window.height / 2 - @image.height / 2
  end
end


class Game
  def self.start
    Game.new.play
  end

  def initialize
    Window.caption = "九々。"
    Window.mag_filter = TEXF_POINT
    @task_force = TaskForce.new
    @res = {image: {}, data: {}}

    load_resource
  end
  def load_resource
    Dir.glob("img/*.png") { |f|
      @res[:image][File.basename(f, ".*")] = Image.load_tiles(f, 4, 1).freeze
      @res[:image].freeze
    }
  end

  def ready
    Fiber.new {
      @task_force.add(Player.new(@res))
        loop {
          @task_force.run
          Fiber.yield
       }
    }
  end
  def play
    @routine = ready
    Window.loop { @routine.resume }
  end

end

さぁて、次は素直にデフォルトSpriteクラスの導入だ!