【HSP3】DXライブラリをHSPで使ってみるサンプル(5.シューティング基本)

http://homepage2.nifty.com/natupaji/DxLib/dxprogram.html#N5 のHSP版です。DxLib.as は http://tkooler.moe.hm/hsp/img/DxLib.as から入手可能。

http://homepage2.nifty.com/natupaji/DxLib/dxprogram.html#N5 のHSP版です。DxLib.as は http://tkooler.moe.hm/hsp/img/DxLib.as から入手可能。

#runtime "hsp3cl"
#include "DxLib.as"
// ショットの最大数
#define MAX_SHOT	4

	dim ShotValid, MAX_SHOT	// ショットが存在するか、フラグ
	dim ShotX, MAX_SHOT
	dim ShotY, MAX_SHOT		// ショットの位置

	Key = 0
	OldKey = 0	// 前のキー入力状態
	i = 0 : j = 0
	
	SetGraphMode 640, 480, 16
	DxLib_Init
	if( stat == -1 ){	// DXライブラリ初期化処理
		 dialog "エラー" : end		// エラーが起きたら直ちに終了
	}
	
	// 描画先画面を裏画面にセット
	SetDrawScreen DX_SCREEN_BACK

	// プレイヤーの初期位置をセット
	PlayerX = 320
	PlayerY = 400
	
	// ループ
	repeat
		ProcessMessage
		if stat != 0 : break
		CheckHitKey KEY_INPUT_ESCAPE
		if stat != 0 : break
		
		// キー入力取得
		OldKey = Key
		GetJoypadInputState DX_INPUT_KEY_PAD1
		Key = stat
	
		if( Key & PAD_INPUT_RIGHT ) : PlayerX += 3	// 右を押していたら右に進む
		if( Key & PAD_INPUT_LEFT ) : PlayerX -= 3	// 左を押していたら左に進む
	
		// ショットの移動処理
		for j, 0, MAX_SHOT, 1
			// ショットデータが無効だったらスキップ
			if( ShotValid(j) == 0 ) : _continue
			
			// 位置を上にずらす
			ShotY(j) -= 8
			
			// 画面外に出ていたらショットデータを無効にする
			if( ShotY(j) < -32 ) : ShotValid(j) = 0
		next
	
		// ショットボタンを押していたらショットを出す
		// 一つ前のループでショットボタンを押していたらショットは出さない
		// Zキーを押すとショット
		// C言語では
		// if( ( Key & ~OldKey ) & PAD_INPUT_A )
		// となっているが、~OldKey の ~ チルダは NOT演算子である。
		// HSPではNOT演算子がないので、OldKey^0xFFFFFFFF
		// とすることで対処している。
		// 詳しくは
		// http://hspdev-wiki.net/?HSP%B9%D6%BA%C2%2F%A5%D3%A5%C3%A5%C8%B1%E9%BB%BB#md54eaf4
		
		if( (Key&(OldKey^0xFFFFFFFF)) & PAD_INPUT_A ){
			// 使われていないショットデータを探す
			for j, 0, MAX_SHOT, 1
				if( ShotValid(j) == 0 ) : _break
			next
			// もし使われていないショットデータがあったらショットを出す
			if( j != MAX_SHOT ){
				// ショットの位置を設定
				ShotX(j) = PlayerX + 16
				ShotY(j) = PlayerY
					// ショットデータを使用中にセット
				ShotValid(j) = 1
			}
		}
			
		// 背景を黒でつぶす
		GetColor 0, 0, 0
		DrawBox 0, 0, 640, 480, stat, TRUE
	
		// プレイヤーを描画する
		GetColor 255, 0, 0
		DrawBox PlayerX, PlayerY, PlayerX + 48, PlayerY + 48, stat, TRUE

		// ショットを描画する
		for j, 0, MAX_SHOT, 1
			// ショットデータが有効な時のみ描画
			if( ShotValid(j) == 1 ){
				GetColor 255, 255, 255
				DrawBox ShotX(j), ShotY(j), ShotX(j) + 16, ShotY(j) + 16, stat, TRUE
			}
		next

		// 裏画面の内容を表画面に反映させる
		ScreenFlip
	loop
	
	DxLib_End				// DXライブラリ使用の終了処理
end