【HSP3】DXライブラリをHSPで使ってみるサンプル(4.マップスクロール基本)

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

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

#runtime "hsp3cl"
#include "DxLib.as"

#define MAP_SIZE	64			// マップチップ一つのドットサイズ

#define MAP_WIDTH	20			// マップの幅
#define MAP_HEIGHT	16			// マップの縦長さ

	// マップのデータ
	dim MapData, MAP_WIDTH, MAP_HEIGHT
	MapData(0, 0) = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
	MapData(0, 1) = 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0
	MapData(0, 2) = 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0
	MapData(0, 3) = 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0
	MapData(0, 4) = 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0
	MapData(0, 5) = 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0
	MapData(0, 6) = 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 7) = 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 8) = 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 9) = 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 10) = 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 11) = 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 12) = 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0
	MapData(0, 13) = 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0
	MapData(0, 14) = 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0
	MapData(0, 15) = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
	
	Key = 0
	OldX = 0 :  OldY = 0 	// 移動する前のプレイヤーの位置を保存する変数
	
	SetGraphMode 640, 480, 16
	DxLib_Init
	if( stat == -1 ){	// DXライブラリ初期化処理
		 dialog "エラー" : end		// エラーが起きたら直ちに終了
	}
	
	// 描画先画面を裏画面にセット
	SetDrawScreen DX_SCREEN_BACK

	// プレイヤーの初期位置をセット
	PlayerX = 2
	PlayerY = 2
	
	// ループ
	repeat
		ProcessMessage
		if stat != 0 : break
		CheckHitKey KEY_INPUT_ESCAPE
		if stat != 0 : break
	
		// キー入力取得
		GetJoypadInputState DX_INPUT_KEY_PAD1
		Key = stat
	
		// 移動する前のプレイヤーの位置を保存
		OldX = PlayerX 
		OldY = PlayerY
	
		// 上を押していたら上に進む
		if( Key & PAD_INPUT_UP ) : PlayerY -= 1
		// 下を押していたら下に進む
		if( Key & PAD_INPUT_DOWN ) : PlayerY += 1
		// 右を押していたら右に進む
		if( Key & PAD_INPUT_RIGHT ) : PlayerX += 1
		// 左を押していたら左に進む
		if( Key & PAD_INPUT_LEFT ) : PlayerX -= 1
	
		// 進入不可能なマップだった場合は移動できない
		if( MapData( PlayerX, PlayerY ) == 0 ){
			PlayerX = OldX
			PlayerY = OldY
		}
		
		// マップとプレイヤーを描画
		gosub *GraphDraw

		// 裏画面の内容を表画面に映す
		ScreenFlip

		// ウエイト
		WaitTimer 100
	loop

	DxLib_End				// DXライブラリ使用の終了処理 
	end
stop
// マップとプレイヤーの描画
*GraphDraw
	j = 0 :  i = 0
	MapDrawPointX = 0
	MapDrawPointY = 0		// 描画するマップ座標値
	DrawMapChipNumX = 0
	DrawMapChipNumY = 0			// 描画するマップチップの数
	
	// 描画するマップチップの数をセット
	DrawMapChipNumX = 640 / MAP_SIZE + 1
	DrawMapChipNumY = 480 / MAP_SIZE + 1

	// 画面左上に描画するマップ座標をセット
	MapDrawPointX = PlayerX - DrawMapChipNumX / 2
	MapDrawPointY = PlayerY - DrawMapChipNumY / 2
	
	// 背景を黒でつぶす
	GetColor 0, 0, 0
	DrawBox 0, 0, 640, 480, stat, TRUE

	// マップを描く
	for i, 0, DrawMapChipNumY, 1
		for j, 0, DrawMapChipNumX, 1
			// 画面からはみ出た位置なら描画しない
			if( j + MapDrawPointX < 0 || i + MapDrawPointY < 0 || j + MapDrawPointX >= MAP_WIDTH || i + MapDrawPointY >= MAP_HEIGHT ) : _continue

			// マップデータが0だったら四角を描画する
			if( MapData(j + MapDrawPointX, i + MapDrawPointY) == 0 ){
				GetColor 255, 0, 0
				DrawBox j * MAP_SIZE, i * MAP_SIZE, j * MAP_SIZE + MAP_SIZE, i * MAP_SIZE + MAP_SIZE, stat, TRUE
			}
		next
	next

	// プレイヤーの描画
	GetColor 255, 255, 255
	DrawBox ( PlayerX - MapDrawPointX ) * MAP_SIZE, ( PlayerY - MapDrawPointY ) * MAP_SIZE, ( PlayerX - MapDrawPointX + 1 ) * MAP_SIZE, ( PlayerY - MapDrawPointY + 1 ) * MAP_SIZE, stat, TRUE
return