ページ 1 / 1
キャラとコインの当たり判定
Posted: 2010年1月24日(日) 14:43
by wing
こんにちは、質問させていただきます。
Windows7, Dxライブラリ, VC2008EE を使用しています。
DXライブラリ置き場様のサンプルプログラム29を元にしています。
マップにコインを配置してキャラとの当たり判定によって消したいのですが、
うまい方法が浮かびません。
キャラとコインの当たり判定は MapHitCheck関数を参考にして作りました。
int CoinHitCheck(float X, float Y, float *MoveX, float *MoveY){
float afX, afY;
afX = X + *MoveX;
afY = Y + *MoveY;
if(GetChipParam(afX,afY) == 2){
coin.lx = (float)((int)afX / CHIP_SIZE)*CHIP_SIZE;
coin.rx = (float)((int)afX / CHIP_SIZE + 1)*CHIP_SIZE;
coin.ty = (float)((int)afY / CHIP_SIZE)*CHIP_SIZE;
coin.by = (float)((int)afY / CHIP_SIZE + 1)*CHIP_SIZE;
if(*MoveY > 0.0f || *MoveY < 0.0f || *MoveX > 0.0f || *MoveX < 0.0f)
return 1;
else
return 0;
}
}
そして描画しているのは
{// マップの描画
int i, j ;
for( i = 0 ; i < MAP_HEIGHT ; i ++ ){
for( j = 0 ; j < MAP_WIDTH ; j ++ ){
switch(MapData[j]){
case 1://1:ブロック
DrawGraph(j*CHIP_SIZE, i*CHIP_SIZE, img_chip[0], true);
break;
case 2:// MapDataが2:コインの場合
if(CoinHitCheck(ch.x, ch.y, &MoveX, &MoveY)==0) //0:当たっていない
DrawGraph(j*CHIP_SIZE, i*CHIP_SIZE, img_chip[1], true);
break;
}
}
}
}
の部分です。
長いので次に続きます。
Re:キャラとコインの当たり判定
Posted: 2010年1月24日(日) 14:50
by wing
マップの描画のcase 2は、とりあえずCoinHitCheck関数が
ちゃんとできているかみるために書いてます。
実際に実行してみると、キャラとコインが接触するとコインが消えるので
CoinHitCheck関数はちゃんと機能していると思われます。
しかし、当たるとすべてが消え、離れるとすべてがまた描画されます。
当たったコインだけが消える方法を教えていただけないでしょうか。
Re:キャラとコインの当たり判定
Posted: 2010年1月24日(日) 14:55
by wing
chipの画像です。
Re:キャラとコインの当たり判定
Posted: 2010年1月24日(日) 15:00
by wing
キャラの画像です。
当たったコインだけ消したいんですが、
どなたかヒントでもいただけないでしょうか。
(リストはわかりません。)
Re:キャラとコインの当たり判定
Posted: 2010年1月24日(日) 15:58
by SooA
マップデータにそのままコインを配置しているようですので、
そのまま使うなら、
■マップデータを書き換える方法
1 1 1 1 1 1
1 0 0 0 0 0
1 0 2 0 0 0
1 0 1 1 1 1
↓コイン(2)の座標をキャラが通ったらマップを書き換える
1 1 1 1 1 1
1 0 0 0 0 0
1 0 0 0 0 0
1 0 1 1 1 1
■コインの取得データを作成していく方法
1 1 1 1 1 1
1 0 0 0 0 0
1 0 2 0 0 0
1 0 1 1 1 1
コイン(2) x=2 y=2 を取得したフラグを立てて
マップを描画するときに x=2 y=2 にフラグが立っていたらコインを描画しない。
■コインの配置をマップとは別データとして保持する
Re:キャラとコインの当たり判定
Posted: 2010年1月24日(日) 16:03
by sizuma
ソースは読んでませんが、MetaDataをコインじゃないデータに置き換えるだけではダメなのでしょうか?
#ぼーっとしてたらかぶった^^;

Re:キャラとコインの当たり判定
Posted: 2010年1月24日(日) 17:13
by wing
SooAさん、ありがとうございます。
マップデータを書き換える方法。
コインの取得データを作成していく方法。
コインの配置をマップとは別データとして保持する。
考え方は分かったので、まだ具体的には分からないんですが、
試行錯誤してみます。
マップを書き換えるというのは、当たり判定した時に
MapData[y][x] = 0; とかで書き換えられるんでしょうか。
試してみたいと思います。
sizumaさん、ありがとうございます。
コインじゃないデータに置き換えるとは考えもしませんでした。
描画をしないようにするとばかり考えていたので、
とても思いつきませんでした。
がんばってできるようにしたいと思います。
Re:キャラとコインの当たり判定
Posted: 2010年1月24日(日) 18:03
by kazuoni
> 描画をしないようにするとばかり考えていたので、
この考え方は正しいと思います。
例えばメンバ(構造体)に表示する(コインでいえば取得された)かどうか
を示すメンバ
t.IsGetted = false
を持たせ、通過したら
t.IsGetted = true
とし、描写をしないという風に管理すれば、
もし、マップが複数あり、
マップ1からマップ2に切り替わり、マップ1に戻った時、
前にとったコインを元に戻したいと思ったら、マップ1のすべてのフラグをfalseにするでけで済みます。
まぁ、今回はお二方の方法で十分ですが。
Re:キャラとコインの当たり判定
Posted: 2010年1月24日(日) 18:51
by wing
> kazuoniさん、アドバイスありがとうございます。
if(coin.flag == true)
DrawGraph(j*CHIP_SIZE, i*CHIP_SIZE, img_chip[1], true);
のようにすると、coin.flag が false になるとすべてのコインが
消えてしまいます。コインがひとつならいいんですが.......。
龍神録のように、coin_t coin[COIN_MAX]; のようにやるのかなとも
考えていますが、それはそれでまた良く分からないんですが。
まだまだ試行錯誤してみます。
Re:キャラとコインの当たり判定
Posted: 2010年1月24日(日) 19:21
by kazuoni
> 龍神録のように、coin_t coin[COIN_MAX]; のようにやるのかなとも
もちろんそのようにやらなければいけません。
コインはすべてで一つではなく、個々の単体と考えてください。
以下のように簡単に考えれば今回の場合は十分かと思います。
キャラが歩き、そのマップチップがコインデータ(Wingさんでいう2)
ならば、そのコインは何番目のコインなのか探査します。
この何番目というのは、自分で定めればよいです。
例えば
1→→→→→→→→→→→→
2→→→→→→→→→→→→
3→→→→→→→→→→→→
4→→→→→→→→→→→→
5→→→→→→→→→→→→
の様な順番にマップをみていって、登場した順にコイン番号を割り振るとかですね。
そうすれば
coin[num].flag == false
みたいに一括で管理すれば、描写も楽ですよね。
コイン数がものすごい数ならば座標等のデータから
簡単符号化した数値をコイン番号に割り振るってことも
ありかと思いますが、これは恐らく今回のケースでは無駄がある気がするので省略します。
Re:キャラとコインの当たり判定
Posted: 2010年1月24日(日) 23:40
by wing
>順番にマップをみていって、登場した順にコイン番号を割り振るとかですね
これは
#define COIN_MAX 8
.......
for(int i=0; i<MAP_HEIGHT; i++){
for(int j = 0; j<MAP_WIDTH; j++){
if(MapData[j] == 2){
for(int k=0; k<COIN_MAX; k++){
coin[k].data = MapData[j];
}
}
}
}
こんな感じでしょうか。
coin[k].data は自分でも意味不明ですが、とりあえずMapData[j]を
いれておこうかと思いました。
考え方は分かったので、あとは試行錯誤していると突然ひらめくことも
あるかと思いますのでがんばってみたいと思います。
Re:キャラとコインの当たり判定
Posted: 2010年1月27日(水) 18:22
by wing
やっと完成しました。
SooAさん、sizumaさん、kazuoniさん、
ありがとうございました。
よく見たら、おかしな部分があることにも気づきました。
実は、4ヶ月くらい前から横スクロールアクションゲームを
作ろうとして、ネットで調べながらマップエディタの使い方や
スクロールの部分は完成していました。
コインも取れるようになって、やっとゲームの形になりました。
アドバイス、ありがとうございました。