同期式と非同期式

ここでは同期式のプログラムと非同期式のプログラムの違いを軽く説明します


そもそも同期ってどういうこと?

同期とは簡単に言えば複数の事柄が同時に起こることです。


同期式のプログラムと非同期式のプログラムでは何が違うん?

今回は正男でのプログラムなので、簡単に説明しますと、
非同期式はゲーム本体であるJavaAppletとJavaScriptのプログラムが別々に動作している状態です。
一方同期式はJavaAppletからJavaScriptのプログラムを呼び出して、同時に動作している状態です。

まさおコンストラクションFX Update11以降では一部のメソッドは非同期式プログラムでは使用できません。


非同期式プログラムの作り方

まずは適当な関数を作り、それを「timerID = setInterval("関数名",実行間隔時間(ms))」命令で動作させるだけです。
これは、指定した関数を指定した時間間隔で実行させるものです。
この場合だとアプレットとは無関係に指定した時間で動いていることになります。
また、非同期式は表示がおかしくなったり、ゲーム開始時にエラーが起きて動かないこともあります。
setIntervalメソッドはタイマーIDを戻り値として返すので2つ以上つける時は変数を別のものにしてください。


非同期式の起動時のエラー対策(プレイヤー側のみ)

エラーが起きている場合IEなら下に三角形で囲まれた「!」マークが出ています。
FireFoxならエラーコンソールにエラー内容が表示されています。
こうなっていた場合、一旦ブラウザの「戻る」をクリックし、ブラウザの「次へ」をクリックしてください。
プログラムのミスでない場合は正常に動作するようになります。


非同期式の起動時のエラー対策(作成者側のみ)

bodyタグに「onLoad="実行したい関数(ここではonLoadJS())"」を加え、onLoadJS()内にtimerIDを使って
非同期式のプログラムを実行すると、非同期式でも起動時のエラーが起きなくなります。(おそらく)

function onLoadJS() {
	Applet1 = document.getElementById("applet1_id");
	timerID = setInterval("mainLoop()",100);
}

<body … onLoad="onLoadJS()">

同期式のプログラムの作り方

クラスファイルは「MasaoXJSS2.class」か「MasaoJSS.class」を使用します。
appletタグは以下のように記述します。

<applet code="MasaoXJSS2.class" width="512" height="320" archive="mc_c.jar" id="Applet1" mayscript>
「mayscript」をappletタグ内に必ず記述してください。そういう仕様です。
詳しくはこちらを参照してください。

詳しい動作
ゲーム開始時にアプレットが「userJS」という関数を呼び出します。
後は各々が作成したプログラムが動きますが、サンプルプログラムのように、起動時の初期化をしたかを確かめ、
ゲームモードによっていろいろ動作を変えるほうが良いので、最低限「game25.html」の「userJS」関数の動きを
導入したほうが良いです。


同期式のエラー対策(作成者側のみ)

同期式の場合、ページ変更などによってエラーが発生する可能性があります。
そこでbodyタグに「onUnload="実行したい関数(ここではonUnloadJS())"」を加え、次のように記述します。

//グローバル変数
var unload_f = 0;
var init_f = 0;

function userJS(Offscreen_g.mode.view_x,view_y) {

	if(unload_f > 0) return;

	if(init_f == 0) {
		init_f = 1;

		userInitJS();
	}


	if(mode == 1) {

		userTitleJS(Offscreen_g);
	}
	else if(mode >= 100  &&  mode < 200) {
		if(Applet1.getJSMes() >= 1) {

			Applet1.setJSMes(0);

			userGameStartJS();
		}
		else {
			userGameJS(Offscreen_g,view_x,view_y);
		}
	}
	else if(mode == 200) {
		userGameoverJS(Offscreen_g);
	}
	else if(mode == 300) {
		userEndingJS(Offscreen_g);
	}
	else if(mode == 400) {
		userChizuJS(Offscreen_g);
	}
}


function onUnloadJS() {
	unload_f = 1;
}	


<body … onUnload="onUnloadJS()">

どちらがいいのか

自分は同期式をお勧めします。
非同期式では使えないメソッドがあるからです。