この間からはまっているRacing双六の改造ですが、いなあもさん、mizuno-amiさんの両大先生から、非常に丁寧なアドバイスを頂きました。
ありがとうございます~!!(感涙)
で、それを参考に対策案を検討中。だいぶ見えてきた気がしますが、時間の関係でまだ修正版のプログラミング&テストは出来ていません。
とりあえずお二方へのお礼と、自分へのメモを兼ねて、これまでの経緯と今後の修正予定について書いてみたいと思います。
まず、ver1.0(人だけで動作させていたとき)は、こんな感じの処理フローでした。
mizuno-amiさんほどシンプルに書けません。すみません。黄色の部分が、mizuno-amiさんの言うところの「順番管理」のところです。
で、次にcomプレーヤーを組み込んだときにどうしたかというのが、次のフローです。
画像が何か変ですが、クリックして拡大すればちゃんと見えるのでご勘弁を。既にスパゲッティ状態ですね^^;。comプレーヤーは、入力を待つことなく自動的にルーレットを回してコマを進めたいので、その部分をイベントモジュール内のうす緑色の部分に書いています。
ここで問題だったのは、イベントモジュール内にループを埋め込んだ事。イベントが起きたときに呼ばれるのがイベントモジュールなわけで、そのモジュール内で処理が進行している間は、他にどんなイベントが起きても受け付けてくれない。これがver1.2のバグなわけです。
で、このループをイベントモジュールの外に出してやろうと考えたのが下の改造案1。
ループをフォームのアフターコードに移し、紫色の部分を埋め込む事で、comプレーヤーの動作中にイベントが発生しても、うまくイベントモジュールに処理を渡す事が出来ます。
ただ、もはやコードは複雑怪奇^^;
しかも、イベントモジュールの最後の「redraw」を実行した瞬間、メインフォームが真っ白にクリアされてしまうと言う問題が発生し、実用になりません。で、昨日のNSBなかよし掲示板へのヘルプとなったわけです。
ここで教わったのがタイマーイベントというもの。で、大先生方のアドバイスを元に考えてみたのが次の解決案。
ver1.2に近い構造ですが、イベントモジュールの最後に、次がcomプレーヤーの場合にタイマーイベントを仕込むようにしてみてはどうかと考えています。これだと、次がcomプレーヤーの場合に、一定時間後に自動的にイベントモジュールが呼ばれるので、うまく動作するのではないかな、と。
今日はここまで。また月曜日以降にコードを書いて試してみようと思います。
最近のコメント