• ベストアンサー

マップチップの当たり判定の出し方

キャラの座標をposx、posyとして宣言し、キー入力でその値をプラスやマイナスをして動かせるようにし、またマップをint map[16][16]として宣言し、for文でmap[x][y]として回して絵画しているのですが、キャラの移動変数と連動して当たり判定を作ろうとすると、「キャラの移動変数が配列になっていない」というエラーが出ます。 しかし、キャラ座標を配列にする訳にもいかないのでどうすればいいのか困っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

追記。 もし「キャラの座標」と「マップ配列の要素の番号」が1対1に対応していない場合は switch (map[new_posx][new_posy]にある場所のタイプ) { の部分を switch (map[new_posxからmapの要素に対応させる変換式][new_posyからmapの要素に対応させる変換式]にある場所のタイプ) { に変えて下さい。 例えば new_xposが  ~102⇒mapを飛び出すのでNG new_xposが103~113⇒map[0][???] new_xposが114~124⇒map[1][???] new_xposが125~135⇒map[2][???] new_xposが136~146⇒map[3][???] new_xposが147~157⇒map[4][???] new_xposが158~168⇒map[5][???] (以下略) new_xposが268~278⇒map[15][???] new_xposが279~  ⇒mapを飛び出すのでNG のようにに対応しているなら「103を引いて、11で割る」と0~15になります。 なので、上記の例であれば switch (map[((int)new_posx-103)/11][new_posyからmapの要素に対応させる変換式]にある場所のタイプ) { と書けばOKです(もちろん、NG範囲を除外した上で) y方向も、同じように変換式にして下さい。 引いたり(場合によっては足したり)、割ったりする数値は「質問者さんが書いているプログラムに合う数値」に合わせて、適切な値に変えて下さい。

noname#112042
質問者

お礼

丁寧なご回答ありがとうございます。 おかげで当たり判定ができました。 ですが、時々当たり判定が1マス分ずれることがあります。 その点については自分なりにまた努力してみようと思います

その他の回答 (2)

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

普通は 以下、無限ループ { new_posx = posx; new_posy = posy; キー入力 押したキーで、new_posxかnew_posyを増減する new_posxかnew_posyが、0より小さくなったり15より大きくなったりして、mapから出そうになった場合は、continue;で無限ループの先頭に戻る switch (map[new_posx][new_posy]にある場所のタイプ) { case 歩ける場所:  posx = new_posx;  posy = new_posy;  break; case 壁とかの入れない場所:  break; case 入ったら体力が減る場所:  posx = new_posx;  posy = new_posy;  体力を減らす  体力がまだあるならbreak;  体力が尽きたら、そのまま「case 入ったら死ぬ場所:」の処理を続ける。つまり、break文を書かず、下にあるcase文に突入させる case 入ったら死ぬ場所:  posx = new_posx;  posy = new_posy;  死亡処理  ライフ残があるならbreak;  ライフ残が無いなら、そのまま「case 入ったらゲームオーバーする場所:」の処理を続ける。つまり、break文を書かず、下にあるcase文に突入させる case 入ったらゲームオーバーする場所:  posx = new_posx;  posy = new_posy;  ゲームオーバーの処理  break; } キャラ表示 }/*無限ループ終り*/ と言うような処理をします。

  • dic2008
  • ベストアンサー率53% (7/13)
回答No.1

>「キャラの移動変数が配列になっていない」というエラーが出ます。 とでることには 何かのツールを使用してのエラーでしょうか? それとも独自のシステムでやっているのでしょうか? たとえば1マップのサイズを32x32とすると posx_i = posx / 32; posy_i = posy / 32; と計算し posx_i, posy_i を配列と比較してみてはいかがでしょう? 新しく配列用の変数 posx_i, posy_i ということです

関連するQ&A