キャラとコインの当たり判定

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

キャラとコインの当たり判定

#1

投稿記事 by wing » 15年前

こんにちは、質問させていただきます。
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;
                }
            }
        }
    }
の部分です。
長いので次に続きます。

wing

Re:キャラとコインの当たり判定

#2

投稿記事 by wing » 15年前

マップの描画のcase 2は、とりあえずCoinHitCheck関数が
ちゃんとできているかみるために書いてます。
実際に実行してみると、キャラとコインが接触するとコインが消えるので
CoinHitCheck関数はちゃんと機能していると思われます。
しかし、当たるとすべてが消え、離れるとすべてがまた描画されます。

当たったコインだけが消える方法を教えていただけないでしょうか。


wing

Re:キャラとコインの当たり判定

#4

投稿記事 by wing » 15年前

キャラの画像です。

当たったコインだけ消したいんですが、
どなたかヒントでもいただけないでしょうか。
(リストはわかりません。)

SooA

Re:キャラとコインの当たり判定

#5

投稿記事 by SooA » 15年前

マップデータにそのままコインを配置しているようですので、
そのまま使うなら、
■マップデータを書き換える方法
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 にフラグが立っていたらコインを描画しない。

■コインの配置をマップとは別データとして保持する

sizuma

Re:キャラとコインの当たり判定

#6

投稿記事 by sizuma » 15年前

ソースは読んでませんが、MetaDataをコインじゃないデータに置き換えるだけではダメなのでしょうか?

#ぼーっとしてたらかぶった^^; 画像

wing

Re:キャラとコインの当たり判定

#7

投稿記事 by wing » 15年前

SooAさん、ありがとうございます。

マップデータを書き換える方法。
コインの取得データを作成していく方法。
コインの配置をマップとは別データとして保持する。
考え方は分かったので、まだ具体的には分からないんですが、
試行錯誤してみます。

マップを書き換えるというのは、当たり判定した時に
MapData[y][x] = 0; とかで書き換えられるんでしょうか。
試してみたいと思います。

sizumaさん、ありがとうございます。

コインじゃないデータに置き換えるとは考えもしませんでした。
描画をしないようにするとばかり考えていたので、
とても思いつきませんでした。
がんばってできるようにしたいと思います。

kazuoni

Re:キャラとコインの当たり判定

#8

投稿記事 by kazuoni » 15年前

> 描画をしないようにするとばかり考えていたので、

この考え方は正しいと思います。
例えばメンバ(構造体)に表示する(コインでいえば取得された)かどうか
を示すメンバ

t.IsGetted = false

を持たせ、通過したら

t.IsGetted = true

とし、描写をしないという風に管理すれば、
もし、マップが複数あり、
マップ1からマップ2に切り替わり、マップ1に戻った時、
前にとったコインを元に戻したいと思ったら、マップ1のすべてのフラグをfalseにするでけで済みます。
まぁ、今回はお二方の方法で十分ですが。

wing

Re:キャラとコインの当たり判定

#9

投稿記事 by wing » 15年前

> kazuoniさん、アドバイスありがとうございます。
if(coin.flag == true)
   DrawGraph(j*CHIP_SIZE, i*CHIP_SIZE, img_chip[1], true);
のようにすると、coin.flag が false になるとすべてのコインが
消えてしまいます。コインがひとつならいいんですが.......。

龍神録のように、coin_t coin[COIN_MAX]; のようにやるのかなとも
考えていますが、それはそれでまた良く分からないんですが。

まだまだ試行錯誤してみます。

kazuoni

Re:キャラとコインの当たり判定

#10

投稿記事 by kazuoni » 15年前

> 龍神録のように、coin_t coin[COIN_MAX]; のようにやるのかなとも

もちろんそのようにやらなければいけません。
コインはすべてで一つではなく、個々の単体と考えてください。

以下のように簡単に考えれば今回の場合は十分かと思います。

キャラが歩き、そのマップチップがコインデータ(Wingさんでいう2)
ならば、そのコインは何番目のコインなのか探査します。
この何番目というのは、自分で定めればよいです。
例えば
1→→→→→→→→→→→→
2→→→→→→→→→→→→
3→→→→→→→→→→→→
4→→→→→→→→→→→→
5→→→→→→→→→→→→
の様な順番にマップをみていって、登場した順にコイン番号を割り振るとかですね。

そうすれば
coin[num].flag == false

みたいに一括で管理すれば、描写も楽ですよね。

コイン数がものすごい数ならば座標等のデータから
簡単符号化した数値をコイン番号に割り振るってことも
ありかと思いますが、これは恐らく今回のケースでは無駄がある気がするので省略します。

wing

Re:キャラとコインの当たり判定

#11

投稿記事 by wing » 15年前

>順番にマップをみていって、登場した順にコイン番号を割り振るとかですね

これは
#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]を
いれておこうかと思いました。

考え方は分かったので、あとは試行錯誤していると突然ひらめくことも
あるかと思いますのでがんばってみたいと思います。

wing

Re:キャラとコインの当たり判定

#12

投稿記事 by wing » 15年前

やっと完成しました。
SooAさん、sizumaさん、kazuoniさん、
ありがとうございました。

よく見たら、おかしな部分があることにも気づきました。

実は、4ヶ月くらい前から横スクロールアクションゲームを
作ろうとして、ネットで調べながらマップエディタの使い方や
スクロールの部分は完成していました。

コインも取れるようになって、やっとゲームの形になりました。

アドバイス、ありがとうございました。

閉鎖

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