見やすいように出来る限りの最小限のコードにしました。
一応このコードでビルドしても、やはり最後のマップ(TOWN_MAP)は表示されません。
#include "DxLib.h"
#pragma warning(disable : 4996)////DXライブラリでfopenを使うため
#define SCREEN_WIDTH 20
#define SCREEN_HEIGHT 15
#define ALL_MAP_WIDTH 100
#define ALL_MAP_HEIGHT 100
#define WORLD_MAP_WIDTH 149 //縦横の上限は149×149
#define WORLD_MAP_HEIGHT 149
#define TOWN_MAP_WIDTH 38 //本来の値38,31
#define TOWN_MAP_HEIGHT 31
#define VOLUME 80 //音量0〜255
int SetDrawhandle;//マップを画像として出力する際に使うハンドル
int chip_cursor[5];//カーソル
int chip_all[ALL_MAP_HEIGHT*ALL_MAP_WIDTH];
int chip_world[WORLD_MAP_HEIGHT*WORLD_MAP_WIDTH];
int chip_town[TOWN_MAP_HEIGHT*TOWN_MAP_WIDTH];
int SoundHandle;//BGM用のハンドル
int Key[256]; // キーが押されているフレーム数を格納する
//プレイヤーが起動時のマップに位置する座標
int playerX = 0;
int playerY = 0;
//一時的なプレイヤーの座標
int kx = 0, ky = 0;
//左Ctrlボタンを押しているかどうか
int lc_button;
int gpUpdateKey();// キーの入力状態を更新する
void MovementUseMap();//マップを変更する時に使用する関数
void MapChipPassability();//移動先のマスが移動可能かどうか
void displayField();//マップを描画する
void gpDrawPlayer();//マップ中のプレイヤー(カーソル)を描画する
void Load();//個々の数値マップから各配列に値を代入する。
//マップ配列
//all_map
int all_map[ALL_MAP_HEIGHT][ALL_MAP_WIDTH];//甲画像用の配列
//smap
int smap0[SCREEN_HEIGHT][SCREEN_WIDTH];//スクリーンマップ用の配列(通常時に使用)
//マップ配列
//world_map
int world_map1[WORLD_MAP_HEIGHT][WORLD_MAP_WIDTH];//ワールドマップ用の配列
//town_map
int town_map1[TOWN_MAP_HEIGHT][TOWN_MAP_WIDTH];//タウンマップ用の配列
enum Enum_MapNumber {
ALL_MAP,
WORLD_MAP,
TOWN_MAP,
MAX_MAP
}mnh;//mnh=map number hennsuu
int gpUpdateKey() {
while (!ProcessMessage()) {
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る
for (int i = 0; i < 256; i++) {
if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら
Key[i]++; // 加算
}
else { // 押されていなければ
Key[i] = 0; // 0にする
}
}
kx = playerX; ky = playerY;
if (Key[KEY_INPUT_RIGHT] >= 1) {
kx++; break;
}
if (Key[KEY_INPUT_DOWN] >= 1) {
ky++; break;
}
if (Key[KEY_INPUT_LEFT] >= 1) {
kx--; break;
}
if (Key[KEY_INPUT_UP] >= 1) {
ky--; break;
}
if (Key[KEY_INPUT_TAB] >= 1) {
MovementUseMap();
break;
}
}
return 0;
}
//マップを移動させる関数
void MovementUseMap() {
switch (mnh) {
case ALL_MAP:
//Tabで次のマップに進む
mnh = WORLD_MAP;
break;
case WORLD_MAP:
//Tabで次のマップに進む
mnh = TOWN_MAP;
break;
case TOWN_MAP:
//Tabで次のマップに進む
mnh = ALL_MAP;
break;
default:
mnh = ALL_MAP;
break;
}
}
//移動先のマスが移動可能かどうか
void MapChipPassability() {
switch (mnh) {
case ALL_MAP:
if (kx >= 0 && ky >= 0 && ALL_MAP_HEIGHT > ky && ALL_MAP_WIDTH > kx) {
playerX = kx;
playerY = ky;
}
break;
case WORLD_MAP:
if (kx >= 0 && ky >= 0 && WORLD_MAP_HEIGHT > ky && WORLD_MAP_WIDTH > kx) {
playerX = kx;
playerY = ky;
}
break;
case TOWN_MAP:
if (kx >= 0 && ky >= 0 && TOWN_MAP_HEIGHT > ky && TOWN_MAP_WIDTH > kx) {
playerX = kx;
playerY = ky;
}
break;
}
}
void displayField()
{
int i, j;
switch (mnh) {
case ALL_MAP:
//計算フェイズ
j = 0;
for (int y = -SCREEN_HEIGHT / 2; y <= SCREEN_HEIGHT / 2; y++) {
i = 0;
for (int x = -SCREEN_WIDTH / 2; x < SCREEN_WIDTH / 2; x++) {
int x2 = playerX + x;
int y2 = playerY + y;
if (x2 < 0 || y2 < 0 || ALL_MAP_WIDTH <= x2 || ALL_MAP_HEIGHT <= y2) {
smap0[j][i] = -1;
}
else {
smap0[j][i] = all_map[y2][x2];
}
i++;
}
j++;
}
//背景画像を全部黒マップにする
for (int y = 0; y <= SCREEN_HEIGHT; y++) {
for (int x = 0; x < SCREEN_WIDTH; x++) {
DrawGraph(x * 32, y * 32, chip_all[0], TRUE);
}
}
//描画フェイズ
for (int y = 0; y < SCREEN_HEIGHT; y++) {
for (int x = 0; x < SCREEN_WIDTH; x++) {
if (smap0[y][x] == -1) {
DrawGraph(x * 32, y * 32, chip_all[0], TRUE);
}
else {
DrawGraph(x * 32, y * 32, chip_all[smap0[y][x]], TRUE);
}
}
}
break;
case WORLD_MAP:
//計算フェイズ
j = 0;
for (int y = -SCREEN_HEIGHT / 2; y <= SCREEN_HEIGHT / 2; y++) {
i = 0;
for (int x = -SCREEN_WIDTH / 2; x < SCREEN_WIDTH / 2; x++) {
int x2 = playerX + x;
int y2 = playerY + y;
if (x2 < 0 || y2 < 0 || WORLD_MAP_WIDTH <= x2 || WORLD_MAP_HEIGHT <= y2) {
smap0[j][i] = -1;
}
else {
smap0[j][i] = world_map1[y2][x2];
}
i++;
}
j++;
}
//背景画像を全部黒マップにする
for (int y = 0; y <= SCREEN_HEIGHT; y++) {
for (int x = 0; x < SCREEN_WIDTH; x++) {
DrawGraph(x * 32, y * 32, chip_all[0], TRUE);
}
}
//描画フェイズ
for (int y = 0; y < SCREEN_HEIGHT; y++) {
for (int x = 0; x < SCREEN_WIDTH; x++) {
if (smap0[y][x] == -1) {
DrawGraph(x * 32, y * 32, chip_all[0], TRUE);
}
else {
DrawGraph(x * 32, y * 32, chip_world[smap0[y][x]], TRUE);
}
}
}
break;
case TOWN_MAP:
//原色チップの描画
//計算フェイズ
j = 0;
for (int y = -SCREEN_HEIGHT / 2; y <= SCREEN_HEIGHT / 2; y++) {
i = 0;
for (int x = -SCREEN_WIDTH / 2; x < SCREEN_WIDTH / 2; x++) {
int x2 = playerX + x;
int y2 = playerY + y;
if (x2 < 0 || y2 < 0 || TOWN_MAP_WIDTH <= x2 || TOWN_MAP_HEIGHT <= y2) {
smap0[j][i] = -1;
}
else {
smap0[j][i] = town_map1[y2][x2];
}
i++;
}
j++;
}
//背景画像を全部黒マップにする
for (int y = 0; y < SCREEN_HEIGHT + 1; y++) {
for (int x = 0; x < SCREEN_WIDTH; x++) {
DrawGraph(x * 32, y * 32, chip_all[0], TRUE);
}
}
//描画フェイズ
for (int y = 0; y < SCREEN_HEIGHT; y++) {
for (int x = 0; x < SCREEN_WIDTH; x++) {
if (smap0[y][x] == -1) {
DrawGraph(x * 32, y * 32, chip_all[0], TRUE);
}
else {
DrawGraph(x * 32, y * 32, chip_town[smap0[y][x]], TRUE);
}
}
}
break;
default:
break;
}
}
//マップ中のプレイヤー(カーソル)を描画する
void gpDrawPlayer() {
//int i, j;
int x = SCREEN_WIDTH / 2, y = SCREEN_HEIGHT / 2;
DrawGraph(x * 32, y * 32, chip_cursor[0], TRUE);
}
void Load()
{
int k;
//ここのブロックは固定
k = 0;
for (int j = 0; j < ALL_MAP_HEIGHT; j++) {
for (int i = 0; i < ALL_MAP_WIDTH; i++) {
all_map[j][i] = k;
k++;
}
}
k = 0;
for (int j = 0; j < WORLD_MAP_HEIGHT; j++) {
for (int i = 0; i < WORLD_MAP_WIDTH; i++) {
world_map1[j][i] = k;
k++;
}
}
k = 0;
for (int j = 0; j < TOWN_MAP_HEIGHT; j++) {
for (int i = 0; i < TOWN_MAP_WIDTH; i++) {
town_map1[j][i] = k;
k++;
}
}
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更,初期化,裏画面設定
LoadDivGraph("画像/マップチップ/カーソル(透過).png", 5, 5, 1, 32, 32, chip_cursor);
LoadDivGraph("画像/マップチップ/総合画像ファイル(透過).png", ALL_MAP_HEIGHT*ALL_MAP_WIDTH, ALL_MAP_WIDTH, ALL_MAP_HEIGHT, 32, 32, chip_all);
LoadDivGraph("world_map.png", WORLD_MAP_HEIGHT*WORLD_MAP_WIDTH, WORLD_MAP_WIDTH, WORLD_MAP_HEIGHT, 32, 32, chip_world);
LoadDivGraph("town_map.png", TOWN_MAP_HEIGHT*TOWN_MAP_WIDTH, TOWN_MAP_WIDTH, TOWN_MAP_HEIGHT, 32, 32, chip_town);
//最初にキャラが居るマップ//mnhは初期値0なのでALL_MAPの時は必要ない
mnh = ALL_MAP;
Load();//各マップ配列に各数値を入力する
//gpUpdateKey()がボタンを押さないと先に進まない仕様になっているので
//マップとキャラクターを先に表示しておく。
displayField();
gpDrawPlayer();
// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() && !gpUpdateKey()) {
MapChipPassability();
displayField();
gpDrawPlayer();
//キーボードでボタンを押した時、1マスずつ余裕を持って移動できる感覚
WaitTimer(80);
}
DxLib_End();
return 0;
}