物理回路と違って導線自体が光って見えるため実用性という意味では必要性は薄めですが、 ランプを追加します。
通電していることがちょっとだけ分かりやすいとか、通電確認したい箇所を強調できるとか、光が灯るのは象徴的でよいとか言えなくもないですが、 「小学校の理科の実験といえば豆電球でしょ」みたいなノリもあります。
回路図ではこう。
小文字の "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()
を追加
それができたら描画してあげます。 とりあえず状態更新は置いといて、光らない状態で描画できました。
状態の更新は特に難しくないですね。 エッジが通電していたらランプも光る。それだけ。
# 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 # ...
おお、見栄えが華やかになってやっぱりちょっといいですね。 楽しい。
以下の iframe で実際に試せます。
こちらも同じものです。
https://sonota88.github.io/kairo-gokko/pages/21/index.html