title of my homepage

まきがめのソースコードとプログラミングの解説

(p)&(c) 1994-2001 by KEN Takahashi
以下、main.c と云うファイルに含まれる doEvent() と云う関数と云う意味で、doEvent() (file: main.c)と記載します。
r eventLoop()を説明します。まきがめが動いている間は eventLoop() (file: main.c)の中にある、
while(!gDone)
{
}
の中でグルグルまわっています。ゲーム終了(cmd + Q)が選択されると gDone が true になってこのループを抜けて main() (file:main.c)に戻っていきます。main()についてはこちらをご覧下さい
void eventLoop(void)
{
RgnHandle cursorRgn;
Boolean gotEvent;
EventRecord event;

gDone = false;

cursorRgn = NewRgn();
while(!gDone){
if ( gHasWaitNextEvent ) 
{
adjustCursor(cursorRgn);
gotEvent = WaitNextEvent(everyEvent, &event, KMAXLONG, cursorRgn);
}
else
{
SystemTask();
gotEvent = GetNextEvent(everyEvent, &event);
}

if ( gotEvent )
{
doEvent(&event);
}
else
{
doNullEvent(&event);
}
}
}
この中では、WaitNextEvent()とdoEvent()がキモです。

WaitNextEvent()はToolBoxの関数です。doEvent()は僕が適当にプログラムしています。

ToolBoxの関数は全て大文字で始まっています。小文字で始まっている関数は僕がプログラムした部分です。

マックのバージョンによってはWaitNextEvent()が使えないので、その時はGetNextEvent()を使うように if文 で場合分けしています。

WaitNextEvent() でまきがめに関係したキーやマウスなどの操作があったかどうかをマックに問い合わせます。キーが押されたり、マウスが押されたりすると、イベントがあったよと教えてくれます。アップルイベントが発生したかどうかも WaitNextEvent() が教えてくれます。マウスが押されたときは mouseDown と云うイベントがあったよと教えてくれます。キーが押されたときは keyDown と云うイベントがあったよと教えてくれます。まきがめから他のソフトに切り替わったときは、切り替わったよと suspendResumeMessage が送られてきます。 cursorRgn を指定しておくと、そのリージョンからカーソルがはみ出たときに、マウスが動いたよ mouseMovedMessage と云うイベントを教えてくれます。マウスの動きに応じて駒を反転させるのに利用しています。

イベントがあったときは doEvent() (main.c) を呼び出してそこでそれぞれのイベントに対応した動作を行います。doEvent() の中身は僕がプログラミングしています。

WaitNextEvent() を呼ぶとまきがめに関係したイベントがあるかないかをマックが調べてくれます。マックはまきがめの事を調べるのと同時に、裏で動いている他のソフトの事も調べます。裏のソフトでしなければならない仕事があれば、WaitNextEvent()の間にその仕事もします。ですから、裏で動いているソフトがたくさん仕事をしているとなかなかWaitNextEvent()から帰ってこないことになります。

裏で動いている他のソフトにどのぐらい仕事を許すかを決めているのが KMAXLONG です。まきがめでは、KMAXLONG にたくさんの時間を割り当てて、裏のソフトがやりたいだけ仕事を許しています。

まきがめに関係するイベントがないときは WaitNextEvent() はイベントがなかったよと教えてくれます。そのときはdoEvent()を実行せずに、doNullEvent()を実行します。

まきがめ
では、駒の連続アニメーションなどを doNullEvent() で処理しています。

上に書いたことを逆に言うとまきがめが裏で動いているときも WaitNextEvent() が時々呼ばれています。まきがめが裏にいるときはまきがめに関係するイベントは起きていませんから、doEvent() を実行せずに、doNullEvent() を実行します。
r まきがめのソースコードとプログラミングの解説に戻る。