行けない所を作る2Dについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
私が悪いんです

行けない所を作る2Dについて

#1

投稿記事 by 私が悪いんです » 15年前

はじめまして、プログラミング歴一年にならないものです。
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)

を外しました。
しかし、これを外したために行きたいところに行けなかったりとおかしなことがおこりました。
キャラを一区間で歩かせず、かつ行けない所を作るにはどうすればよいでしょうか?
回答よろしくお願いします。
また、ゲームプログラミングの館でのサンプルをいじらずにそのまま動作したところ、全く異常はありませんでした。

私が悪いんです

Re:行けない所を作る2Dについて

#2

投稿記事 by 私が悪いんです » 15年前

一応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 },
};

アトラス

Re:行けない所を作る2Dについて

#3

投稿記事 by アトラス » 15年前

1区間で歩かせたくないなら、今のままの当たり判定では無理があるのではないでしょうか
(マス目ぴったりでないと正常に当たり判定が行われないため)

キャラのマスの右上、右下、左上、左下の計4つで当たり判定を行う必要があります

アクションのサンプルですが、このコードが参考になるかと思います↓
http://homepage2.nifty.com/natupaji/DxL ... Sample.cpp

私が悪いんです

Re:行けない所を作る2Dについて

#4

投稿記事 by 私が悪いんです » 15年前

>>アトラスさん
サンプルコードと回答ありがとうございます。
サンプルコードはまさに自分のやりたいものを表現していますがいまだに右上、右下、左上、左下の計4つで当たり判定という部分がいまいち理解できないでいます;

自分のこのプログラムの場合、どのようにすればサンプルと同じ当たり判定ができるかもう少しサンプルをじっくり見て研究してみます。

私が悪いんです

Re:行けない所を作る2Dについて

#5

投稿記事 by 私が悪いんです » 15年前

あとすいません、サンプルで0.0Fとか9.0FとかのFというのはなんなんでしょうか?
調べたくともなんというものなのかわからなくて・・・

toyo

Re:行けない所を作る2Dについて

#6

投稿記事 by toyo » 15年前

0.0FのFは定数の型を指定する接尾語です
接尾語無しの浮動小数点はdouble型なのでfloat型の定数を表す場合には後ろにfかFをつけます
整数型でも接尾語無しはint型でl/Lをつけるとlong型(lは紛らわしいのでたいてい大文字のLが使われます)、u/Uをつけるとunsigned型などがあります

私が悪いんです

Re:行けない所を作る2Dについて

#7

投稿記事 by 私が悪いんです » 15年前

>>toyoさん
回答ありがとうございます。
なるほどFにはそういう意味があったんですか・・・
試しにサンプルのF全部とりましたら確かにdoubleからfloatへの変換と出ました
外しても動作はしましたがやはり入れた方がいいですね、ありがとうございます。
このFも含めてもう少し頑張ってみます。

私が悪いんです

Re:行けない所を作る2Dについて

#8

投稿記事 by 私が悪いんです » 15年前

誰かシンプルな右上、右下、左上、左下の計4つで当たり判定のサンプルを持ってないでしょうか?
もらったサンプルはとても良いのですがジャンプなどの処理も入っているため少々理解しずらい部分があり・・・

お願いします。

ookami

Re:行けない所を作る2Dについて

#9

投稿記事 by ookami » 15年前

> もらったサンプル
というのは、アトラスさんの↓これですよね?
http://homepage2.nifty.com/natupaji/DxL ... Sample.cpp

マップとの当たり判定は、CharMove 関数の
> // 先ず上下移動成分だけでチェック

> // 後に左右移動成分だけでチェック

の部分だと思います。
ここにはジャンプの処理は入ってないようなので、
もう一度読んだら分かるかもですね。

みけCAT

Re:行けない所を作る2Dについて

#10

投稿記事 by みけCAT » 15年前

>誰かシンプルな右上、右下、左上、左下の計4つで当たり判定のサンプルを持ってないでしょうか?
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;//正常 
}

閉鎖

“C言語何でも質問掲示板” へ戻る