当たり判定ができない

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

当たり判定ができない

#1

投稿記事 by 実装したい » 14年前

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

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 14年前

はじめまして。
そもそもなぜマップチップの当たり判定ではだめなのでしょうか?
そこの理由をお聞かせください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

実装したい

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

#3

投稿記事 by 実装したい » 14年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 14年前

こちらは、どうですか?

「当たり判定 - ゲームプログラミングWiki」
http://www.c3.club.kyutech.ac.jp/gamewi ... 8%BD%C4%EA
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

実装したい

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

#5

投稿記事 by 実装したい » 14年前

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に戻す作業が分かりません
その辺りを教えてください お願いします

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

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

#6

投稿記事 by h2so5 » 14年前

このコードではコンパイルすらできません。
まずC言語の基本を確認することをお勧めします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#7

投稿記事 by softya(ソフト屋) » 14年前

問題は色々と有ります
まず、コンパイルして確認して下さいね。

コード:

 
#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言語の入門を最低限は勉強されたほうが良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

実装したい

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

#8

投稿記事 by 実装したい » 14年前

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

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#9

投稿記事 by softya(ソフト屋) » 14年前

・当たり判定に使う変数は繰り返し文の中で定義するということでしょうか?
そうです。それも移動後に計算しないと意味がありません。
変数宣言と計算は分けたほうが良いでしょう。

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

こちらを参考にしてみてください。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/01_09.html
・障害物に当たったらflagに1を代入して動けないようにしています
 もしぶつかったら移動キャンセルをさせて0を代入させればいいかと思ったのですが
 この移動キャンセルの処理をさせない場合、どうすれば0を代入できるでしょうか?
 (ある範囲内にいるときは1を代入させて、その範囲から出たら0を代入したいのです)
このコードには移動キャンセルが有りませんでしたので、そこまで分かりませんでした。
それと移動キャンセルするならflag=1をしている所で行えば良いので、そもそもflag自体不要だと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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