ページ 11

当たり判定ができない

Posted: 2011年7月03日(日) 22:07
by 実装したい
掲示板を利用させていただきます
唐突ですがマップとの当たり判定を実装させたいのです
ゲームプログラミングの館を見せてもらったのですがあちらにのっているのは
マップチップでの考え方で割った数のあまりなどとても参考になったのですが
私が実装したいのは障害物の左上と右上の座標を利用してif文を4つ使うようなものです

ちょっとわかりにくいかもしれませんが
if(a>b&&c>d&&e<f&&g<h)←こんな感じの文法だったと思います
分かる方がいれば教えてください お願いします

私のレベルは超初心者で絵の描画位置を変えることぐらいしかできません
プログラミングの館は最後まで読んだつもりです

Re: 当たり判定ができない

Posted: 2011年7月03日(日) 22:18
by softya(ソフト屋)
はじめまして。
そもそもなぜマップチップの当たり判定ではだめなのでしょうか?
そこの理由をお聞かせください。

Re: 当たり判定ができない

Posted: 2011年7月03日(日) 23:37
by 実装したい
特に理由はないのですが興味本位でということになりますでしょうか・・・
マップチップで表すよりも効率が良くなるという場面もあると思うんですよね
なのでとりあえず四角の当たり判定をつくってみたいです
わがまま言って申し訳ないです お願いします

Re: 当たり判定ができない

Posted: 2011年7月03日(日) 23:53
by softya(ソフト屋)
こちらは、どうですか?

「当たり判定 - ゲームプログラミングWiki」
http://www.c3.club.kyutech.ac.jp/gamewi ... 8%BD%C4%EA

Re: 当たり判定ができない

Posted: 2011年7月04日(月) 23:32
by 実装したい
100%私の言い方が悪かったです 申し訳ありません
そのやり方が分からくて困っている状況です

コード:


#include "DxLib.h"
 
int x0,y0,x2,y2;
int x1 = x0+5;
int y1 = x0+5;
int x3 = X2+10;
int y3 = x2+10;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        if( DxLib_Init() == -1 ) return -1; 
        
       int image,image2;
       image = LoadGraph("aaa.png");
       image2 = LoadGraph("iii.png");
       while(1){
       DrawGraph(x0,y0,image,TRUE);
       DrawGraph(x2,y2,image2,TRUE);
      
      if( Key[ KEY_INPUT_RIGHT ]  == 1 && flag = 0 )               
           ch.x0++ ;                       
       
      if(X0 < X3、X2 < X1、Y2 < Y1、Y0 < Y3)
            flag = 1 ;

       }
        DxLib_End() ;
        return 0 ;
}
まだ完ぺきにかけるわけじゃないですが書いてみたものです
なぜか私の思い描いているような処理ができません
それと障害物に当たっているときはflagを1にするということはわかるのですが
障害物から離れたときにflagを0に戻す作業が分かりません
その辺りを教えてください お願いします

Re: 当たり判定ができない

Posted: 2011年7月04日(月) 23:36
by h2so5
このコードではコンパイルすらできません。
まずC言語の基本を確認することをお勧めします。

Re: 当たり判定ができない

Posted: 2011年7月05日(火) 00:20
by softya(ソフト屋)
問題は色々と有ります
まず、コンパイルして確認して下さいね。

コード:

 
#include "DxLib.h"
 
int x0,y0,x2,y2;	← x0,y0,x2,y2の値が定義されていません。
int x1 = x0+5;		← 
int y1 = x0+5;		← 右辺にyが無いの変です。
int x3 = X2+10;		← 大文字小文字が入り乱れています。
int y3 = X2+10;		← 大文字小文字が入り乱れています。
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        if( DxLib_Init() == -1 ) return -1; 
        
       int image,image2;
       image = LoadGraph("aaa.png");
       image2 = LoadGraph("iii.png");
       while(1){
       DrawGraph(x0,y0,image,TRUE);
       DrawGraph(x2,y2,image2,TRUE);
      
      if( Key[ KEY_INPUT_RIGHT ]  == 1 && flag = 0 )			← Key配列,flagが未定義です。Key配列に値を入れる処理がありません。
           ch.x0++ ;                       						← chと言う構造体変数は未定義です。単なるx0++;でimageは右に移動できますよ。
        
       
      if(X0 < X3、X2 < X1、Y2 < Y1、Y0 < Y3)					← 定義と違い大文字になっています。
            flag = 1 ;											← flagで何をしたいか分かりません。
 
       }
        DxLib_End() ;
        return 0 ;
}
あと実際問題として、
int x1 = x0+5;
int y1 = x0+5;
int x3 = X2+10;
int y3 = x2+10;
は正しく直しても当たり判定の直前に行わないと正しい計算結果にはなりません。
これはプログラム実行順番と言う基本的な問題です。
C言語の文法や、実行順序、変数の代入などの知識もあいまいだと思いますので、C言語の入門を最低限は勉強されたほうが良いと思います。

Re: 当たり判定ができない

Posted: 2011年7月05日(火) 23:19
by 実装したい
申し訳ないです コピペばかりで済ましてしまいました Cはさらに一か月、勉強します
実はこの問題は課題とは少し違う形になるのですが
時間制限がある問題なのです 学校の成績ではないのですがそのようなものが絡まってきます
教えてくだされば後は自分で考えます

・当たり判定に使う変数は繰り返し文の中で定義するということでしょうか?
・障害物に当たったらflagに1を代入して動けないようにしています
 もしぶつかったら移動キャンセルをさせて0を代入させればいいかと思ったのですが
 この移動キャンセルの処理をさせない場合、どうすれば0を代入できるでしょうか?
 (ある範囲内にいるときは1を代入させて、その範囲から出たら0を代入したいのです)

付き合わせる形になってしまい本当に悪いのですが教えてください お願いします

Re: 当たり判定ができない

Posted: 2011年7月05日(火) 23:34
by softya(ソフト屋)
・当たり判定に使う変数は繰り返し文の中で定義するということでしょうか?
そうです。それも移動後に計算しないと意味がありません。
変数宣言と計算は分けたほうが良いでしょう。

ちなみに、その繰り返し処理の中で問題があるコードになっています。

こちらを参考にしてみてください。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/01_09.html
・障害物に当たったらflagに1を代入して動けないようにしています
 もしぶつかったら移動キャンセルをさせて0を代入させればいいかと思ったのですが
 この移動キャンセルの処理をさせない場合、どうすれば0を代入できるでしょうか?
 (ある範囲内にいるときは1を代入させて、その範囲から出たら0を代入したいのです)
このコードには移動キャンセルが有りませんでしたので、そこまで分かりませんでした。
それと移動キャンセルするならflag=1をしている所で行えば良いので、そもそもflag自体不要だと思います。