redraw()のバグ
今回のコードはメタコードなので実行しても意味はない。
int x, y PImage img1, img2; // なんかのイメージ void mousePressed() { // ① x = 100; y = 100; redraw(); } void mouseReleased() { // ② x = 200; y = 200; redraw(); } // 画像をブレンドしてるような描画 void draw() { image(img, x, y); // ③ // 何か重い処理 // ④ image(img2, x, y); // ⑤ }
① - マウスを押したとき座標を設定して再描画。
② - マウスを離したとき①とは別の座標を設定して再描画。
③ - img1の画像を描画
④ - 何か思い時間のかかる処理を想定
⑤ - img2の画像を描画
マウスを押したとき①が行われる。そしてそのフレームにdraw()が実行される。
このとき③を描画したあと④の時間の間にマウスを離して②が行われたとする。
入力処理はイベント形式で呼ばれるので、
④の間にマウスを離せばdrawの途中だけど②がよばれてx,yの値は変わってしまう。
そして⑤が呼ばれると同じ位置にimg1,img2を描画したいはずなのに位置がおかしくなって描画されてしまう。
redraw()は2度呼ばれてるのだから、1度draw()が終了した後もう一度draw()してくれることを期待する。
でも、すでにdraw()が実行されている時にredraw()を呼んでも再描画の予約がされない。
つまり中途半端な状態で描画終わってしまうことになる。
解決策はredrawをframeRateミリ秒遅延して実行させればよさそうだけど、かなりめんどくさそうなので
noLoop()はやめてぐるぐる無限ループさせるのが手っ取り早いと思います!(おい)