kairo-gokko (21) ランプ



物理回路と違って導線自体が光って見えるため実用性という意味では必要性は薄めですが、 ランプを追加します。

通電していることがちょっとだけ分かりやすいとか、通電確認したい箇所を強調できるとか、光が灯るのは象徴的でよいとか言えなくもないですが、 「小学校の理科の実験といえば豆電球でしょ」みたいなノリもあります。


回路図ではこう。

f:id:sonota88:20200311060735p:plain

小文字の "l" だと分かりにくいかなと思い、大文字の "L" にしました。


まずは Unit::Lamp を追加。

# class Unit
  class Lamp < SingleCell
    def initialize(pos)
      super

      # ON: true / OFF: false
      @state = false
    end

    # ...

あとはスイッチなどを追加したときとほとんど同じなのでそこらへんのコードは省略します。

  • ChildCircuit#lamps を追加
    • to_plain(), from_plain() の修正
  • Drawer#draw_circle()#draw_circle_fill() を追加

それができたら描画してあげます。 とりあえず状態更新は置いといて、光らない状態で描画できました。

f:id:sonota88:20200311041413p:plain


状態の更新は特に難しくないですね。 エッジが通電していたらランプも光る。それだけ。

# class ChildCircuit

  def update_lamps
    @lamps.each { |lamp|
      edge = @edges.find { |edge| edge.include_pos?(lamp.pos) }
      lamp.update(edge.on?)
    }
  end

毎回 @edges.find するのはちょっと非効率そうですが、 ひとまずこれで。

通電判定の後に circuit 経由で呼び出してランプの状態を更新します。

def main_loop(circuit, view)
  # ...

  if switch_changed
    circuit.update_tuden_state()
    circuit.update_lamps_state()
  end

  # ...

f:id:sonota88:20200311042554g:plain

おお、見栄えが華やかになってやっぱりちょっといいですね。 楽しい。

以下の iframe で実際に試せます。

こちらも同じものです。
https://sonota88.github.io/kairo-gokko/pages/21/index.html