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_HEIGHTMapData(0, 0) = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0MapData(0, 1) = 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0MapData(0, 2) = 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0MapData(0, 3) = 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0MapData(0, 4) = 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0MapData(0, 5) = 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0MapData(0, 6) = 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0MapData(0, 7) = 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0MapData(0, 8) = 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0MapData(0, 9) = 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0MapData(0, 10) = 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0MapData(0, 11) = 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0MapData(0, 12) = 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0MapData(0, 13) = 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0MapData(0, 14) = 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0MapData(0, 15) = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0Key = 0OldX = 0 : OldY = 0 // 移動する前のプレイヤーの位置を保存する変数SetGraphMode 640, 480, 16DxLib_Initif( stat == -1 ){ // DXライブラリ初期化処理dialog "エラー" : end // エラーが起きたら直ちに終了}// 描画先画面を裏画面にセットSetDrawScreen DX_SCREEN_BACK// プレイヤーの初期位置をセットPlayerX = 2PlayerY = 2// 最初は停止中(0)にしておくMove = 0// ループrepeatProcessMessageif stat != 0 : breakCheckHitKey KEY_INPUT_ESCAPEif stat != 0 : break// 移動中ではない場合キー入力を受け付けるif( Move == 0 ){// キー入力取得GetJoypadInputState DX_INPUT_KEY_PAD1Key = stat// 上を押していたら上に進むif( Key & PAD_INPUT_UP ) {Move = 1MoveX = 0MoveY = -1}// 下を押していたら下に進むif( Key & PAD_INPUT_DOWN ) {Move = 1MoveX = 0MoveY = 1}// 右を押していたら右に進むif( Key & PAD_INPUT_RIGHT ) {Move = 1MoveX = 1MoveY = 0}// 左を押していたら左に進むif( Key & PAD_INPUT_LEFT ) {Move = 1MoveX = -1MoveY = 0}// 進入不可能なマップだった場合は移動できないif( Move == 1 ){if( MapData( PlayerX + MoveX, PlayerY + MoveY ) == 0 ){Move = 0}else{MoveCounter = 0}}// 停止中は画面のスクロールは行わないScrollX = 0ScrollY = 0}// 移動中の場合は移動処理を行うif( Move == 1 ){MoveCounter++// 移動処理が終了したら停止中にするif( MoveCounter == MOVE_FRAME ){Move = 0// プレイヤーの位置を変更するPlayerX += MoveXPlayerY += MoveY// 停止中は画面のスクロールは行わないScrollX = 0ScrollY = 0}else{// 経過時間からスクロール量を算出するScrollX = -( MoveX * MAP_SIZE * MoveCounter / MOVE_FRAME )ScrollY = -( MoveY * MAP_SIZE * MoveCounter / MOVE_FRAME )}}// マップとプレイヤーを描画gosub *GraphDraw// 裏画面の内容を表画面に映すScreenFliploopDxLib_End // DXライブラリ使用の終了処理endstop// マップとプレイヤーの描画*GraphDrawj = 0 : i = 0MapDrawPointX = 0MapDrawPointY = 0 // 描画するマップ座標値DrawMapChipNumX = 0DrawMapChipNumY = 0 // 描画するマップチップの数// 描画するマップチップの数をセットDrawMapChipNumX = 640 / MAP_SIZE + 1DrawMapChipNumY = 480 / MAP_SIZE + 1// 画面左上に描画するマップ座標をセットMapDrawPointX = PlayerX - DrawMapChipNumX / 2MapDrawPointY = PlayerY - DrawMapChipNumY / 2// 背景を黒でつぶすGetColor 0, 0, 0DrawBox 0, 0, 640, 480, stat, TRUE// マップを描くfor i, 0, DrawMapChipNumY, 1for 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, 0DrawBox j * MAP_SIZE + ScrollX, i * MAP_SIZE + ScrollY, j * MAP_SIZE + MAP_SIZE + ScrollX, i * MAP_SIZE + MAP_SIZE + ScrollY, stat, TRUE}nextnext// プレイヤーの描画GetColor 255, 255, 255DrawBox ( PlayerX - MapDrawPointX ) * MAP_SIZE, ( PlayerY - MapDrawPointY ) * MAP_SIZE, ( PlayerX - MapDrawPointX + 1 ) * MAP_SIZE, ( PlayerY - MapDrawPointY + 1 ) * MAP_SIZE, stat, TRUEreturn