異なる構造体を引数に使う方法

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

異なる構造体を引数に使う方法

#1

投稿記事 by » 15年前

こんばんは。初めて投稿させていただきます。
龍神録プログラミングの館を参考にして、STGを作っているのですが、
キャラクタの当り判定や、接触時の処理の部分が非常にごちゃごちゃした感じになってしまいました。
今のままでもあまり問題は無いのですが、後学のために質問させてください。

typedef struct{
double x,y,r;//座標と当り範囲
int a,b,c;
}ch_t;//自機

typedef struct{
double x,y,r;
int s,t;
}enemy_t;//敵

typedef struct{
double x,y,r;
int q,w,e;
}boss_t;

ch_t ch;
enemy_t enemy[20];
boss_t boss;

のように、構造体の型は異なるけど、同じ変数を持つ構造体変数が色々あるとき、
int hit_check(引数1,引数2){
double x=(引数1のx)-(引数2のx);
double y=(引数1のy)-(引数2のy);
double r=(引数1のy)+(引数2のy);

if (x*x+y*y<r*r) return 1;
return 0;
}
のような関数を作り、
hit_check(&ch,&enemy)や、hit_check(&ch,&boss)
のように使いたいのですが、
このとき、引数のところはどのようにすればいいのでしょうか?
引数を、enemy.x,enemy.yのようにするのではなく、enemyならenemyだけの指定ですむようにしたいと考えています。

また、構造体の中に構造体変数を入れて、shot[n].bullet.x,shot[n].bullet.y…
のようなとき、引数はどのようになるのでしょうか?


構造体のポインタを使えばいいと思ったのですが、様々な形の構造体が入る時の処理の仕方がよくわかりませんでした。
C/C++はまだ勉強し始めてから1,2ヶ月程度で、まったくの素人です。

VC2010、DXライブラリを使っています

MNS

Re:異なる構造体を引数に使う方法

#2

投稿記事 by MNS » 15年前

C++にテンプレートという機能があります。

#include <stdio.h>

typedef struct{
double x,y,r;
int a,b,c;
}A;

typedef struct{
double x,y,r;
int s,t;
}B;


template <typename S, typename T>
int hit_check(S s, T t){
double x=s.x - t.x;
double y=s.y - t.y;
double r=s.y + t.y;
if (x*x+y*y<r*r)
return 1;
return 0;
}

int main(){
A a = {1, 1, 3, 0, 0, 0};
B b = {2, 2, 3, 0, 0};
printf("%d", hit_check(a, b));
return 0;
}

※変数名や構造体名などは多少変わっています。
このようなコードになります。
私もテンプレートは使いこなせる域に達していないので、詳しく説明することはできませんが、
興味が有るようなら調べてみると良いと思います。使いこなせれば非常に強力な機能です。

バグ

Re:異なる構造体を引数に使う方法

#3

投稿記事 by バグ » 15年前

構造体のメンバを構造体にするのはどうでしょうか?

fatens

Re:異なる構造体を引数に使う方法

#4

投稿記事 by fatens » 15年前

>また、構造体の中に構造体変数を入れて、shot[n].bullet.x,shot[n].bullet.y…のようなとき、引数はどのようになるのでしょうか?
>構造体のポインタを使えばいいと思ったのですが、様々な形の構造体が入る時の処理の仕方がよくわかりませんでした。

構造体の中に構造体変数を入れて、ポインタも使ってみました。

typedef struct {
double x, y, r;
} xyr_t;

typedef struct {
xyr_t xyr;
...
} ch_t;

typedef struct {
xyr_t xyr;
...
} enemy_t;

ch_t ch;
enemy_t enemy[20];

int hit_check(xyr_t *obj1, xyr_t *obj2)
{
double x = obj1->x - obj2->x;
...
}

などとして、

hit_check(&ch.xyr, &enemy.xyr);

のように呼び出します。

Re:異なる構造体を引数に使う方法

#5

投稿記事 by » 15年前

>>MNSさん
ちょっとぐぐっただけですがかなり便利な機能みたいですね
くわしく調べてみたいと思います

>>バグさん
>>fatensさん
構造体の中に構造体を入れる方法だと、上層(?)の構造体の型を考えなくてもいい、ってことですね。

参考になりました。ありがとうございます

閉鎖

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