[目次へ][前へ][次へ][表紙へ]
 ジョイパッドの入力

 1.標準機能と拡張プラグイン

 HSPに元々備わっている機能を標準機能といいます。HSPの機能を拡張するためのプログラムを拡張プラグインといいます。多くのプログラマー(プログラムを作る人)さんがHSPをより便利にするために、様々な拡張プラグインを作っています。

 本講座はできるだけ標準機能を使って説明しようと思いますが、それではどうしてもできないことが二つあります。ジョイパッド(ジョイスティック、ゲームパッド)の入力と効果音の重ね合わせです。

 2.HSP MULTIMEDIA(hmm.dll)

 うにたまさんが製作された拡張プラグイン、HSP MULTIMEDIA(hmm.dll)は、HSPで簡単にDirectXを使えるようにした拡張プラグインで、以下の機能を持っています。

 等。

 HSPTVの「HSPで作る」→「プラグイン・ツール」→「サウンド・マルチメディア他」からダウンロードしてください。readme.txtの指示に従ってインストールしてください。

 3.DirectX

 DirectXは、直接ハードウェアを制御する機能で、以下のものから成っています。

名前 機能
DirectDraw グラフィックスの描画
DirectSound 音声を扱う
DirectInput ジョイパッド等の入力機器を扱う
DirectMusic MIDIを扱う

 等。

 4.ジョイパッドの入力

 HSP MULTIMEDIAによって追加される命令語のうち、以下を使います。

	digetjoystate joy, 0

 0番のジョイパッドの、現在の状態を変数joy(joypadの略です)に入れます。状態は整数で表されます。複数のボタンの状態を、どうやって一つの整数で表すのでしょうか。各ボタンが押されていれば、対応するビットが1になります。押されていなければ0です。

ボタン対応するビット
第0ビット
第1ビット
第2ビット
第3ビット
ボタン1第4ビット

 ボタン1が押されていれば、joyの値は%0……010000(1 * 2の4乗 = 16)になります。すると一見、次のようにすればいいように思えます。

	digetjoystate joy, 0
	if joy == 16 {
		ボタン1が押された時の処理
	}

 しかし、他のボタンも同時に押されていれば、他のビットも1になるので、違う値になります。実際、ボタン1を押したまま左斜め上に移動するなんていうのは普通にあることです。この場合第0ビット、第2ビット、第4ビットが1になりますから、joyの値は%0……010101(1 * 2の4乗 + 1 * 2の2乗 + 1 * 2の0乗 = 21)になります。この場合、ボタン1が押されている、つまりjoyの第4ビットが1であることを確かめるにはどうすればよいでしょうか。joyと16との論理積を計算すればよいのです。

	%0……010101 ← joy
	%0……010000 ← 16
	------------
	%0……010000 ← joy & 16

 上と左は押されているがボタン1は押されていない場合、以下のようになります。

	%0……000101 ← joy
	%0……010000 ← 16
	------------
	%0……000000 ← joy & 16

 ボタン1が押されていなければ、joy & 16は0になります。逆に言えば、joy & 16が0でなければボタン1が押されています。

例.ボタン1を押している間赤い四角が表示されます。

	#include "hmm.as"

	diinit
	onexit goto *Program_End
	screen 0,640,480
	digetjoynum
	n_joy = stat
	
*Main_Loop
	await 16
	redraw 0
	gosub *Clear_Screen
	if n_joy > 0 {
		digetjoystate joy, 0
		if (joy & 16) != 0 {
			color 255, 0, 0
			boxf 32, 32, 95, 95
		}
	}
	redraw 1
	goto *Main_Loop
	
	;プログラム終了
*Program_End
	diend
	end

	;画面のクリア
*Clear_Screen
	color 0, 0, 0
	boxf 0, 0, 639, 479
	return


	#include "ファイル名"

 と書くと、その部分に該当ファイルの中身をコピー、貼り付けしたのと同じことになります。hmm.asには、HSP MULTIMEDIAを使うのに必要な様々な定義が書かれています。

	onexit goto ラベル

 ウィンドウの右上の×印がクリックされたら、指定したラベルの行に飛べ、と指示します。現在プログラムのどの部分が実行されていようとも、そこで中断して該当するラベルの行に飛びます。

	digetjoynum
	n_joy = stat

 パソコンにつながっているジョイパッドの数を変数n_joyに入れます。

	if n_joy > 0 {
		digetjoystate joy, 0
		if (joy & 16) != 0 {
			color 255, 0, 0
			boxf 32, 32, 95, 95
		}
	}

 ジョイパッドが1本もつながっていなかったら、この処理は行いません。
 ボタン1が押されていたら、赤い四角を描きます。

		if (joy & 16) != 0 {

 "&"は"!="より優先順位が低いので、カッコで囲む必要がある点にご注意ください。

 5.キーとジョイパッドの入力

 ゲームでは普通、キーボードでもジョイパッドでも操作できるようにしています。例えばZキーまたはボタン1がショットに対応しています。
 そこで、Zキーまたはボタン1の状態を変数zkeyに入れることにし、Zキーかボタン1の少なくともどちらか一方が押されていれば1、どちらも押されていなかったら0にします。

 (1)まず、zkeyに0を入れます。
 (2)Zキーが押されていればzkeyを1にします。
 (3)ボタン1が押されていればzkeyを1にします。

例.Zキーかボタン1を押している間赤い四角が表示されます。

	#include "hmm.as"

	diinit
	onexit goto *Program_End
	screen 0,640,480
	digetjoynum
	n_joy = stat
	
*Main_Loop
	await 16
	redraw 0
	gosub *Clear_Screen
	gosub *Input_Key
	if zkey == 1 {
		color 255, 0, 0
		boxf 32, 32, 95, 95
	}
	redraw 1
	goto *Main_Loop
	
	;プログラム終了
*Program_End
	diend
	end
	
	;画面のクリア
*Clear_Screen
	color 0, 0, 0
	boxf 0, 0, 639, 479
	return

	; キー、ジョイパッドの入力
*Input_Key
	zkey = 0
	getkey key, 90
	if key == 1 { zkey = 1 }
	if n_joy > 0 {
		digetjoystate joy, 0
		if (joy & 16) != 0 { zkey = 1 }
	}
	return
 6.押された瞬間だけ反応する

 これまでの説明では、キーまたはボタンを押しっぱなしでも反応していました。例えば、カー・レースで"GAME OVER"表示中にZキーを押しっぱなしにしてみてください。タイトル画面に戻った瞬間にZキーが押されているのでゲームが始まります。
 押しっぱなしではなく、押された時だけ反応する方法について説明します。これは、押されていない状態から押された状態に変わったということです。つまり、前は押されておらず、今押されているということです。ということは、前の状態を入れる変数が必要ということになります。

 (1)getkey、digetjoystateを行う前のzkeyの値をpre_zkeyに入れます(preはprevious(前の)の略です)。
 (2)getkey、digetjoystateを行ってzkeyを更新します。

	; キー、ジョイパッドの入力
*Input_Key
	pre_zkey = zkey
	zkey = 0
	getkey key, 90
	if key == 1 { zkey = 1 }
	if n_joy > 0 {
		digetjoystate joy, 0
		if (joy & 16) != 0 { zkey = 1 }
	}
	return

 前は押されておらず、今押されていれば処理を行う部分はこのようになります。

	if pre_zkey == 0 & zkey == 1 {
		Zキーかボタン1が押された時の処理
	}

例.Zキーかボタン1を押すたびに「押した」と表示します。

	#include "hmm.as"

	diinit
	onexit goto *Program_End
	digetjoynum
	n_joy = stat
	zkey = 0	;便宜上zkeyの初期値は0とします
	
*Main_Loop
	await 16
	gosub *Input_Key
	if pre_zkey == 0 & zkey == 1 {
		mes "押した"
	}
	goto *Main_Loop
	
	;プログラム終了
*Program_End
	diend
	end
	
	; キー、ジョイパッドの入力
*Input_Key
	pre_zkey = zkey
	zkey = 0
	getkey key, 90
	if key == 1 { zkey = 1 }
	if n_joy > 0 {
		digetjoystate joy, 0
		if (joy & 16) != 0 { zkey = 1 }
	}
	return

[サンプルをダウンロード]

補足
・ハードウェアとソフトウェア
 ハードウェアとは、機械のことです。これに対して、コンピュータの中のプログラムや絵や音楽等、目には見える、耳には聞こえるのに、実体のないものをソフトウェアと言います。狭義の意味ではプログラム、あるいはそれによって動くWindows、アプリケーションを指します。
 
・トリガータイプと非トリガータイプ
 押した瞬間だけ反応するものをトリガータイプ、押しっぱなしでも反応するものを非トリガータイプといいます。

[目次へ][前へ][次へ][表紙へ] inserted by FC2 system