forやwhileをゆっくり実行する

processingにおいて、for文やwhile文を使って図形を連続描画すると、frameRateに関係なく一瞬で描画されてしまいます。下記の例では10本の直線が一瞬で描かれてしまいます。

def setup():
    size(500,500)

def draw():
    for i in range(10):
        line(0, 0, i*50, 500)

frameRateを入れても無駄です。

def setup():
    size(500,500)
    frameRate(5)

def draw():
    for i in range(10):
        line(0, 0, i*50, 500)

下記に紹介する仕組みを使うと、for文やwhile文の内容を好みの間隔で順次描画できるようにできます。下記のソースコードをコピーして自分なりに作り変えてみましょう。

  1. draw() を draw_gen() にする
  2. 待ちたい箇所に「yield “wait”」入れる
  3. draw_gen()の最後に「yield “end”」入れる(入れないとエラーになる)
  4. 順次描画のための仕組みをコピペしておく
def setup():
    size(500,500)
    frameRate(5)

def draw_gen(): # ①
    for i in range(10):
        line(0, 0, i*50, 500)
        yield "wait" # ②

    yield "end" # ③

# ④ --------コピペ--------
g = draw_gen()
gen_state = "start"
def draw():
    global gen_state
    if gen_state != "end":
        gen_state = next(g)

別の実装方法として、例外処理を使う方法も考えられるが、どれがいいのかわからん。

def setup():
    size(300,300)
    frameRate(10)
    
def draw_gen():
    for i in range(100):
        line(i, 0, i, 300)
        yield

g = draw_gen()
def draw():    
    try:
        next(g)
    except StopIteration:
        print(u"もうないよ")

コメントする