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