ゲームプログラミングの館で学習しているのですが、24章の"いけないところを作る。~2D~"について質問です。
普通の32×32のキャラクターチップではできたのですが、32×48のキャラクターチップではできませんでした。
いけないところは白い壁になっているのですが、上から白い壁に行くとキャラクターの1/3が白い壁に入ってしまいます。
どうすればいいのでしょうか?
分かる方は、ご教授をよろしくお願いします。
(ソース)
#include "DxLib.h"
typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;
int hantei[15][20] = {
{ 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,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,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,1 },
};
int can_or_cannot(int x,int y,int muki){
if(muki==3)
if(hantei[y/32-1][x/32]==1)
return 1;
if(muki==1)
if(hantei[y/32][x/32-1]==1)
return 1;
if(muki==0)
if(hantei[y/32+1][x/32]==1)
return 1;
if(muki==2)
if(hantei[y/32][x/32+1]==1)
return 1;
return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int image[16],i,j;
char Key[256];
ch_t ch;
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
ch.x =320;
ch.y =160;
ch.walking_flag=0;
ch.muki=3;
SetDrawScreen( DX_SCREEN_BACK ) ;
LoadDivGraph( "$vx_chara09_d2.png" , 16 , 4 , 4 , 32 , 48 , image ) ;
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
for(i=0;i<15;i++)
for(j=0;j<20;j++)
if(hantei[j]==1)
DrawBox(j*32,i*32,(j+1)*32,(i+1)*32,GetColor(255,255,255),TRUE);
if(ch.x%32==0 && ch.y%32==0){
ch.walking_flag=1;
if ( Key[ KEY_INPUT_UP ] == 1 )
ch.muki=3;
else if( Key[ KEY_INPUT_LEFT ] == 1 )
ch.muki=1;
else if( Key[ KEY_INPUT_DOWN ] == 1 )
ch.muki=0;
else if( Key[ KEY_INPUT_RIGHT] == 1 )
ch.muki=2;
else
ch.walking_flag=0;
if(ch.walking_flag==1)
if(can_or_cannot(ch.x,ch.y,ch.muki)==1
ch.walking_flag=0;
}
if(ch.walking_flag==1){
if (ch.muki==3)
ch.y--;
else if(ch.muki==1)
ch.x--;
else if(ch.muki==0)
ch.y++;
else if(ch.muki==2)
ch.x++;
}
ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4];
DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;
ScreenFlip();
}
DxLib_End();
return 0;
}
(補足)
・使用しているキャラクターチップは、http://www.tekepon.net/fsm/EFMAPに帰属します。
・開発環境は、"Microsoft Visual C++ 2008 Express Edition"です
・ライブラリは、"DXライブラリ"です。
32×48のキャラクターチップ
Re:32×48のキャラクターチップ
こんにちわ。1/3というのは下1/3(32ドット目より下)ということですよね?
回答として以下の二つが考えられるのですが、ライスさんはどちらをイメージしているのでしょうか。
1. 地形判定はあくまで32*32
マップを斜めから見ているイメージで、キャラクタの頭らへんは壁に重なって見えるのでよいのであれば、
DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;
↓
DrawGraph( ch.x , ch.y-16 , ch.img , TRUE ) ;
でいいと思います。
2. 頭も壁に重ならないようにする
こっちだとちょいと複雑になりますね。まずは、1と2のどちらか回答いただけますか?
回答として以下の二つが考えられるのですが、ライスさんはどちらをイメージしているのでしょうか。
1. 地形判定はあくまで32*32
マップを斜めから見ているイメージで、キャラクタの頭らへんは壁に重なって見えるのでよいのであれば、
DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;
↓
DrawGraph( ch.x , ch.y-16 , ch.img , TRUE ) ;
でいいと思います。
2. 頭も壁に重ならないようにする
こっちだとちょいと複雑になりますね。まずは、1と2のどちらか回答いただけますか?
Re:32×48のキャラクターチップ
1番のほうイメージしてます。
1番の方法は、ちゃんとできました!
ちなみに、2番の方法はどうやるのですか?
知っておいたら使えそうなので、よろしければ教えてくださいm(_ _)m
1番の方法は、ちゃんとできました!
ちなみに、2番の方法はどうやるのですか?
知っておいたら使えそうなので、よろしければ教えてくださいm(_ _)m

Re:32×48のキャラクターチップ
そうですね... can_or_cannot関数を改造する感じになるでしょうかね。
キャラのサイズが32*32なのを前提に作られているので、まずはこれをパラメータに追加
int can_or_cannot(int x,int y,int muki)
↓
int can_or_cannot(int x,int y,int sizex,int sizey,int muki)
で、can_or_cannotの中身も32*32が前提の(常に目の前の1マスだけチェックすればよいような)作りになっているので、sizex, sizey がそれぞれ 33~64なら2マスチェック、65~96なら3マス... のように処理を変更する、といった感じでしょうか。
必要ならもっと詳しく書きます。
キャラのサイズが32*32なのを前提に作られているので、まずはこれをパラメータに追加
int can_or_cannot(int x,int y,int muki)
↓
int can_or_cannot(int x,int y,int sizex,int sizey,int muki)
で、can_or_cannotの中身も32*32が前提の(常に目の前の1マスだけチェックすればよいような)作りになっているので、sizex, sizey がそれぞれ 33~64なら2マスチェック、65~96なら3マス... のように処理を変更する、といった感じでしょうか。
必要ならもっと詳しく書きます。
Re:32×48のキャラクターチップ
ありがとうございます^^
まだ私には難しそうなので、もう少し技術が上達してから必要ならば調べるなり、質問するなりします。
今回は本当にありがとうございましたm(_ _)m
とても助かりました!
まだ私には難しそうなので、もう少し技術が上達してから必要ならば調べるなり、質問するなりします。
今回は本当にありがとうございましたm(_ _)m
とても助かりました!