【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			// マップの縦長さ

#define MOVE_FRAME	32			// 移動にかけるフレーム数

	// マップのデータ
	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
	
	// 最初は停止中(0)にしておく
	Move = 0
	
	// ループ
	repeat
		ProcessMessage
		if stat != 0 : break
		CheckHitKey KEY_INPUT_ESCAPE
		if stat != 0 : break
	
		// 移動中ではない場合キー入力を受け付ける
		if( Move == 0 ){
			
			// キー入力取得
			GetJoypadInputState DX_INPUT_KEY_PAD1
			Key = stat
				
			// 上を押していたら上に進む
			if( Key & PAD_INPUT_UP ) {
				Move = 1
				MoveX = 0
				MoveY = -1
			}
			// 下を押していたら下に進む
			if( Key & PAD_INPUT_DOWN ) {
				Move = 1
				MoveX = 0
				MoveY = 1
			}
			// 右を押していたら右に進む
			if( Key & PAD_INPUT_RIGHT ) {
				Move = 1
				MoveX = 1
				MoveY = 0
			}
			// 左を押していたら左に進む
			if( Key & PAD_INPUT_LEFT ) {
				Move = 1
				MoveX = -1
				MoveY = 0
			}
		
			// 進入不可能なマップだった場合は移動できない
			if( Move == 1 ){
				if( MapData( PlayerX + MoveX, PlayerY + MoveY ) == 0 ){
					Move = 0
				}else{
					MoveCounter = 0
				}
			}
			// 停止中は画面のスクロールは行わない
			ScrollX = 0
			ScrollY = 0
	
		}
	
		// 移動中の場合は移動処理を行う
		if( Move == 1 ){
			MoveCounter++
			// 移動処理が終了したら停止中にする
			if( MoveCounter == MOVE_FRAME ){
				Move = 0
				// プレイヤーの位置を変更する
				PlayerX += MoveX
				PlayerY += MoveY

				// 停止中は画面のスクロールは行わない
				ScrollX = 0
				ScrollY = 0
			}else{
				// 経過時間からスクロール量を算出する
				ScrollX = -( MoveX * MAP_SIZE * MoveCounter / MOVE_FRAME )
				ScrollY = -( MoveY * MAP_SIZE * MoveCounter / MOVE_FRAME )
			}
			
		}
		
		// マップとプレイヤーを描画
		gosub *GraphDraw

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

	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 + ScrollX, i * MAP_SIZE + ScrollY, j * MAP_SIZE + MAP_SIZE + ScrollX, i * MAP_SIZE + MAP_SIZE + ScrollY, 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