基本的には、以下のサンプルとの組み合わせだと思います。
4.マップスクロール基本
> ttp://homepage2.nifty.com/natupaji/DxLib/dxprogram.html#N4
いちおう、アクションゲームっぽいマップスクロールをするサンプルを作ってみました。
左右キーで移動します。当たり判定やジャンプ、重力等の処理は入っていません。
//-- サンプル --//
#include "DxLib.h"
const int SCR_W = 640;
const int SCR_H = 480;
const int CHIP_SIZE = 32;
const int BLOCK_MAX_X = SCR_W / CHIP_SIZE;
const int BLOCK_MAX_Y = SCR_H / CHIP_SIZE;
const int MAP_W = BLOCK_MAX_X * 2; // マップの大きさ(2画面分)
const int MAP_H = BLOCK_MAX_Y;
const int SCR_LIMIT_L = 0; // キャラを移動する限界
const int SCR_LIMIT_R = SCR_W - CHIP_SIZE;
const int MAP_LIMIT_L = 0; // マップを移動する限界
const int MAP_LIMIT_R = MAP_W * CHIP_SIZE - SCR_W;
const int CHAR_LIMIT_L = SCR_LIMIT_L + CHIP_SIZE * 4; // キャラを移動するかマップを移動するかの閾値
const int CHAR_LIMIT_R = SCR_LIMIT_R - CHIP_SIZE * 4;
const int MOVE_RATE = 5; // 移動速度
// マップデータ
const char MapData[MAP_H][MAP_W] = {
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0,0,0,1,
1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,
1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, 0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,
1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0, 0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0, 0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0,0,0,1,
1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0, 0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,
1,0,0,0,0,1,1,1,1,1,0,0,0,0,1,1,0,0,0,0, 0,0,1,1,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,1,
1,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0, 0,0,1,1,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
};
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode( TRUE );
if ( DxLib_Init( ) == -1 ) return -1;
SetDrawScreen( DX_SCREEN_BACK );
int map_pos = MAP_LIMIT_L;
int char_x = (640 - CHIP_SIZE) / 2;
int char_y = (480 - CHIP_SIZE) / 2;
int BlockColor = GetColor( 255, 255, 255 );
int CharColor = GetColor( 255, 0, 0 );
while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
if ( CheckHitKey( KEY_INPUT_LEFT ) ) {
if ( char_x < CHAR_LIMIT_L && map_pos > MAP_LIMIT_L )
map_pos -= MOVE_RATE;
else if ( char_x > SCR_LIMIT_L )
char_x -= MOVE_RATE;
}
if ( CheckHitKey( KEY_INPUT_RIGHT ) ) {
if ( char_x > CHAR_LIMIT_R && map_pos < MAP_LIMIT_R )
map_pos += MOVE_RATE;
else if ( char_x < SCR_LIMIT_R )
char_x += MOVE_RATE;
}
if ( map_pos < MAP_LIMIT_L ) map_pos = MAP_LIMIT_L; // 不正な値は補正しておく
if ( map_pos > MAP_LIMIT_R ) map_pos = MAP_LIMIT_R;
if ( char_x < SCR_LIMIT_L ) char_x = SCR_LIMIT_L;
if ( char_x > SCR_LIMIT_R ) char_x = SCR_LIMIT_R;
ClearDrawScreen( );
// マップ描画
int base_x = -(map_pos % CHIP_SIZE); // CHIP_SIZEで割り切れなければ画面外から描画開始
int base_y = 0; // 縦移動は無いので必要ないが、なんとなく・・・
int max_x = BLOCK_MAX_X + (base_x ? 1 : 0); // CHIP_SIZEで割り切れなければ1マス多く描画する
int max_y = BLOCK_MAX_Y + (base_y ? 1 : 0); // 必要なし
for ( int y = 0; y < max_y; y++ ) {
for ( int x = 0; x < max_x; x++ ) {
if ( MapData[y][x + (map_pos / CHIP_SIZE)] ) {
DrawBox( base_x + x * CHIP_SIZE, base_y + y * CHIP_SIZE,
base_x + x * CHIP_SIZE + CHIP_SIZE, base_y + y * CHIP_SIZE + CHIP_SIZE,
BlockColor, TRUE );
}
}
}
// キャラ描画
DrawBox( char_x, char_y, char_x + CHIP_SIZE, char_y + CHIP_SIZE, CharColor, TRUE );
DrawFormatString( 0, 0, CharColor, "map_pos = %4d char_x = %4d base_x = %4d", map_pos, char_x, base_x );
ScreenFlip( );
}
DxLib_End( );
return 0;
}