はじめまして、プログラミング歴一年にならないものです。
VC++2010を使っています。
実は今ゲームプログラミングの館で「行けない所を作る。~2D~」をやっているのですが行ってはいけないところに行ってしまったり、行ってもいいところで行けなかったりと思うようにいきません。
実際作ったもの(ほとんどコピー)
#include "DxLib.h"
typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;
int hantei[15][20] = {
文字数の問題のため省略(ゲームプログラミングの館のサンプルと同じです)
};
int can_or_cannot(int x,int y,int muki){//進めるかを判定する
if(muki==0)//上向きなら
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==2)//下向きなら
if(hantei[y/32+1][x/32]==1)
return 1;
if(muki==3)//右向きなら
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( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了
/*白い壁を描画*/
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);
ch.walking_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら
ch.muki=0; //上向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 ) //下ボタンが押されたら
ch.muki=2; //下向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.muki=3; //右向きフラグを立てる
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==0){ //上向きならch.y座標を減らす
ch.y--;
ch.img=image[(ch.y%32)/8+0];
}
else if(ch.muki==1){ //左向きならch.x座標を減らす
ch.x--;
ch.img=image[(ch.x%32)/8+4];
}
else if(ch.muki==2){ //下向きならch.y座標を増やす
ch.y++;
ch.img=image[(ch.y%32)/8+8];
}
else if(ch.muki==3){ //右向きならch.x座標を増やす
ch.x++;
ch.img=image[(ch.x%32)/8+12];
}
}
DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
ScreenFlip();
}
DxLib_End();
return 0;
}
ゲームプログラミングの館でのサンプルと違う点はキャラを一区間で歩かせないため
if(ch.x%32==0 && ch.y%32==0)
を外しました。
しかし、これを外したために行きたいところに行けなかったりとおかしなことがおこりました。
キャラを一区間で歩かせず、かつ行けない所を作るにはどうすればよいでしょうか?
回答よろしくお願いします。
また、ゲームプログラミングの館でのサンプルをいじらずにそのまま動作したところ、全く異常はありませんでした。
行けない所を作る2Dについて
Re:行けない所を作る2Dについて
一応hantei[15][20]の部分載せておきます。
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 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 },
};
Re:行けない所を作る2Dについて
1区間で歩かせたくないなら、今のままの当たり判定では無理があるのではないでしょうか
(マス目ぴったりでないと正常に当たり判定が行われないため)
キャラのマスの右上、右下、左上、左下の計4つで当たり判定を行う必要があります
アクションのサンプルですが、このコードが参考になるかと思います↓
http://homepage2.nifty.com/natupaji/DxL ... Sample.cpp
(マス目ぴったりでないと正常に当たり判定が行われないため)
キャラのマスの右上、右下、左上、左下の計4つで当たり判定を行う必要があります
アクションのサンプルですが、このコードが参考になるかと思います↓
http://homepage2.nifty.com/natupaji/DxL ... Sample.cpp
Re:行けない所を作る2Dについて
>>アトラスさん
サンプルコードと回答ありがとうございます。
サンプルコードはまさに自分のやりたいものを表現していますがいまだに右上、右下、左上、左下の計4つで当たり判定という部分がいまいち理解できないでいます;
自分のこのプログラムの場合、どのようにすればサンプルと同じ当たり判定ができるかもう少しサンプルをじっくり見て研究してみます。
サンプルコードと回答ありがとうございます。
サンプルコードはまさに自分のやりたいものを表現していますがいまだに右上、右下、左上、左下の計4つで当たり判定という部分がいまいち理解できないでいます;
自分のこのプログラムの場合、どのようにすればサンプルと同じ当たり判定ができるかもう少しサンプルをじっくり見て研究してみます。
Re:行けない所を作る2Dについて
あとすいません、サンプルで0.0Fとか9.0FとかのFというのはなんなんでしょうか?
調べたくともなんというものなのかわからなくて・・・
調べたくともなんというものなのかわからなくて・・・
Re:行けない所を作る2Dについて
0.0FのFは定数の型を指定する接尾語です
接尾語無しの浮動小数点はdouble型なのでfloat型の定数を表す場合には後ろにfかFをつけます
整数型でも接尾語無しはint型でl/Lをつけるとlong型(lは紛らわしいのでたいてい大文字のLが使われます)、u/Uをつけるとunsigned型などがあります
接尾語無しの浮動小数点はdouble型なのでfloat型の定数を表す場合には後ろにfかFをつけます
整数型でも接尾語無しはint型でl/Lをつけるとlong型(lは紛らわしいのでたいてい大文字のLが使われます)、u/Uをつけるとunsigned型などがあります
Re:行けない所を作る2Dについて
>>toyoさん
回答ありがとうございます。
なるほどFにはそういう意味があったんですか・・・
試しにサンプルのF全部とりましたら確かにdoubleからfloatへの変換と出ました
外しても動作はしましたがやはり入れた方がいいですね、ありがとうございます。
このFも含めてもう少し頑張ってみます。
回答ありがとうございます。
なるほどFにはそういう意味があったんですか・・・
試しにサンプルのF全部とりましたら確かにdoubleからfloatへの変換と出ました
外しても動作はしましたがやはり入れた方がいいですね、ありがとうございます。
このFも含めてもう少し頑張ってみます。
Re:行けない所を作る2Dについて
誰かシンプルな右上、右下、左上、左下の計4つで当たり判定のサンプルを持ってないでしょうか?
もらったサンプルはとても良いのですがジャンプなどの処理も入っているため少々理解しずらい部分があり・・・
お願いします。
もらったサンプルはとても良いのですがジャンプなどの処理も入っているため少々理解しずらい部分があり・・・
お願いします。
Re:行けない所を作る2Dについて
> もらったサンプル
というのは、アトラスさんの↓これですよね?
http://homepage2.nifty.com/natupaji/DxL ... Sample.cpp
マップとの当たり判定は、CharMove 関数の
> // 先ず上下移動成分だけでチェック
と
> // 後に左右移動成分だけでチェック
の部分だと思います。
ここにはジャンプの処理は入ってないようなので、
もう一度読んだら分かるかもですね。
というのは、アトラスさんの↓これですよね?
http://homepage2.nifty.com/natupaji/DxL ... Sample.cpp
マップとの当たり判定は、CharMove 関数の
> // 先ず上下移動成分だけでチェック
と
> // 後に左右移動成分だけでチェック
の部分だと思います。
ここにはジャンプの処理は入ってないようなので、
もう一度読んだら分かるかもですね。
Re:行けない所を作る2Dについて
>誰かシンプルな右上、右下、左上、左下の計4つで当たり判定のサンプルを持ってないでしょうか?
No:62410のコードのcan_or_cannot関数を以下のものに差し替えてみてください。
No:62410のコードのcan_or_cannot関数を以下のものに差し替えてみてください。
int can_or_cannot(int x,int y,int muki){//進めるかを判定する if(muki==0)//上向きなら if(hantei[(y-1)/32][x/32]==1 || hantei[(y-1)/32][x/32+1]==1)//進めるか判定 return 1;//エラー if(muki==1)//左向きなら if(hantei[y/32][(x-1)/32]==1 || hantei[y/32+1][(x-1)/32]==1) return 1; if(muki==2)//下向きなら if(hantei[(y+1)/32+1][x/32]==1 || hantei[(y+1)/32+1][x/32+1]==1) return 1; if(muki==3)//右向きなら if(hantei[y/32][(x+1)/32+1]==1 || hantei[y/32+1][(x+1)/32+1]==1) return 1; return 0;//正常 }