世界一周について
現在RPGのマップを表示するプログラムを作成しているのですが
世界一周が出来ません
LINE_Xの最大の長さが30,LINE_Yの最大の長さが25として
画面に表示する範囲はx(横)が20,y(縦)が15です。
キャラを画面の中心に表示し、キー入力された方向の逆にマップを
移動させていくことでキャラが入力された方向に移動する方法です。
お聞きしたいのは、マップのLINE_Xの最大値やLINE_Yの最大値に近づいたときに歩いている方向の先にマップのLINE_XやLINE_Yの最小値から移動した分を表示する記述方法です。
聞きたいことをうまく記述できなくて申し分けないのですがよろしくお願いしますm(_ _)m
また、おかしな記述があったら注意・改善等よろしくおねがいします
例)
LINE_X=30(横),LINE_Y=25(縦)で
x = 20,y = 9としたとき
右に5歩移動したときに表示されているマップが
横が11~30,縦が1~15
の範囲としたとき
y=0まで移動したとき上半分にLINE_Yの移動した分の(25-移動距離)~25を表示したい
(ドラクエみたいにマップの端まで言ったらマップの反対を表示してエンドレスにマップ表示が終わらない)
ソース>
#include "DxLib.h"
int WINAPI WinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ChangeWindowMode(true);
if( DxLib_Init() == -1)return -1;
int i,j;
int x,y,chx,chy,ax,ay;
int UD,LR,wf,muki,chd,chd2,houkou,gi,flg;
int keyL,keyR,keyU,keyD;
int map[25][30],ch[12],fi,white;
char key[256];
LoadDivGraph("char.bmp",12,3,4,32,32,ch);
fi = LoadGraph("ftest.bmp");
↑読み込んでいるのは自作画像です↓
white = LoadGraph("画像\\white.bmp");
SetDrawScreen(DX_SCREEN_BACK);
ClearDrawScreen();
for(i=0;i<25;i++){
for(j=0;j<30;j++){
map[i][j] = 0;
if(i==0||j==0||i==24||j==29)
map[i][j] = 1;
}
}
flg = chd2 = houkou = UD = LR = wf = 0;
muki = chy = chx = 0;
chd = 1;
x = 640 / 2;
y = (480 / 2) - 16;
chx = (x / 32);
chy = (y / 32);
while(1){
GetHitKeyStateAll(key);
ax = ay = 0;
for(i=UD;i<25+UD;i++){
for(j=LR;j<30+LR;j++){
if((i<0 || j<0) || (i>24 || j>29)){
DrawGraph(ax,ay,white,false);
}else DrawGraph(ax,ay,fi,false);
ax += 32;
}
ax = 0;
ay +=32;
}
if(x%32==0 && y%32==0){
wf = 1;
keyU = keyD = keyL = keyR = 0;
houkou = muki;
if(key[ KEY_INPUT_UP] == 1){
muki = 0;
keyU = 1;
}else if(key[KEY_INPUT_RIGHT] == 1){
muki = 1;
keyR = 1;
}else if(key[ KEY_INPUT_DOWN] == 1){
muki = 2;
keyD = 1;
}else if(key[KEY_INPUT_LEFT] == 1){
muki = 3;
keyL = 1;
}else wf = 0;
}
if((keyU + keyD + keyL + keyR )!= 0){
chx = (x / 32);
chy = (y / 32);
if(keyU == 1){
if(map[(chy+UD)-1][chx+LR] != 0)UD -= 1;
}else if(keyD == 1){
if(map[(chy+UD)+1][chx+LR] != 0)UD += 1;
}else if(keyL == 1){
if(map[chy+UD][(chx+LR)-1] != 0)LR -= 1;
}else if(keyR == 1){
if(map[chy+UD][(chx+LR)+1] != 0)LR += 1;
}
}
if(wf==1){
if(muki == houkou){
if(chd == 1){
gi = ch[(muki*3) + chd];
if(chd2 == 0){
chd++;
}else if(chd2 == 2){
chd--;
}
}else if(chd == 2){
gi = ch[(muki*3) + chd];
chd--;
chd2 = 2;
}else if(chd == 0){
gi = ch[(muki*3) + chd];
chd++;
chd2 = 0;
}
}
}else if(wf == 0){
if(chd == 1 && flg == 0){
gi = ch[(muki*3) + chd];
if(chd2 == 0){
chd++;
}else if(chd2 == 2){
chd--;
}
flg = 1;
}else if(chd == 2 && flg == 0){
gi = ch[(muki*3) + chd];
chd--;
chd2 = 2;
flg = 1;
}else if(chd == 0 && flg == 0){
gi = ch[(muki*3) + chd];
chd++;
chd2 = 0;
flg = 1;
}else if(flg == 1)flg = 0;
}
if(key[KEY_INPUT_ESCAPE] == 1)break;
if(ProcessMessage() == -1)break;
Sleep(100);
DrawGraph(x,y,gi,true);
ScreenFlip();
}
DxLib_End();
return 0;
}
上記のソースでは移動方向の先から反対側のエリアは出てきません
表示した範囲内でのみ移動可能になっていて端の0は移動エリアの限定と終端の確認のためです
参考サイトはhttp://l.huu.cc/g/#0です
DxLib.hもここのリンクからDLしました