攻撃判定を持つクラスを作りたいのですが、どう作ればいいのか解りません。

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

攻撃判定を持つクラスを作りたいのですが、どう作ればいいのか解りません。

#1

投稿記事 by しゅむ » 7年前

こんばんは、クラスの作成について質問させて頂きます。
先週からDirectXライブラリを使い始め、2Dゲームを作り始めたのですが、攻撃判定を持つクラス(弾や斬撃等)を作る所で困っています。
C++の勉強は始めたばかりで、クラスの継承等に関して勘違いが多々あるかもしれませんが、お付き合い頂ければと思います。

具体的な質問の内容は、攻撃判定を持つクラスをどのように作成するべきか、どうすれば効率的に作れるのかが解らない、といった質問です。

コード:

class Graph
{
 //画像の描画や、キャラチップから作成した画像のIDの管理等を行うGraphクラス。
};
class Object : public Graph//HP・MPを持ち、当たり判定を所有する物体
{
 //プレイヤーの移動や2つのObjectクラスの接触判定の確認、HPやMPへの代入等を行うObjectクラス
};

といった2つのクラスがあるのですが、ここに更に。
他のオブジェクトのHP等に干渉する(=攻撃判定を持つ)クラス、Actionを作りたいと考えているのですが、どう作成すれば良いのか解りません。

とりあえず、今まで試してみた方法は、まず、Objectクラスを継承したクラスActionを作り、そのクラスを作成するObjectメンバ関数

コード:

void Object::Action_Q()
{
	Action FireBall = Action(10,Ref_x() + cos(angle * PI / 180.0f)*3,Ref_y() + cos(angle * PI / 180.0f) *3 ,5,100,40,40,4,true,"Action/FireBall1.png",6,3,2,1.0,Ref_angle(),true,false);

}
のようなものを作れば良いのかと思ったのですが、これではActionクラスが未定義なので出来ない、といったエラーが出てしまい、上手くいきませんでした。

次に、内部クラスの存在を知り、内部クラスでやればいいのでは、と考え試してみましたが、

コード:

class Object : public Graph//HP・MPを持ち、当たり判定を所有する物体
{
       //プレイヤーの移動や2つのObjectクラスの接触判定の確認、HPやMPへの代入等を行うObjectクラス
		class Action
		{
			public:		
				Action(int damage=5,//Actionクラスのメンバ
					int x=0, int y=0, int hp=5,int mp=5,int x_size=40,int y_size=40,double move_speed=4,bool collision=true,  //Objectクラスのメンバ
					char* FileName ="Action/FireBall1.png" , int AllNum=6 , int XNum=3 ,int YNum=2 ,double ext_rate=1.0, double angle = 0,int trans_flag=true,int turn_flag=0);//Graphクラスのメンバ
			private:
				int damage;
		};

};
この場合は、Graphクラスのメンバを継承できないようでした。

以上2つの方法(内部クラス・Objectクラス内でActionクラスを作成) といった方法でも宣言のやり方を変えれば目的は達成できるのか、といったことや、
攻撃判定を持つオブジェクトを作るなら他に方法がある、 といった事を教えて頂ければと思い、質問させて頂きました、よろしくお願いします。

ソースコードは、こういったクラスがある、といったことだけを載せましたが、もし全文が必要なようでしたらまた書きます、現在試行錯誤中でソースがごちゃごちゃになってきているので、整えてからになりますが・・・

史上最悪のデスペナ
記事: 521
登録日時: 8年前

Re: 攻撃判定を持つクラスを作りたいのですが、どう作ればいいのか解りません。

#2

投稿記事 by 史上最悪のデスペナ » 7年前

ここのランクがプログラマなのに「オブジェクトって何?」なレベルなので、私はもっと単純な方法を使ってます。
例えば、

コード:

//Struct.h
#pragma once
struct Status
{
    int HP;
    int MP;
};

//攻撃処理.h
#pragma once
#include "Struct.h"
class C_Attack
{
public:
    void Attack( int CharaHandle, char *KeyBuf );
    int ColiCheck( int CharaHandle, int ArmerHandle );
    void Damege( int CharaHandle, Status *CharaStatus, int DamageFlag );
}

//攻撃処理.cpp
#include "攻撃処理.h"

void C_Attack::Attack( int CharaHandle, char *KeyBuf )
{
    if(KeyBuf [KEY_INPUT_(以下略)
}
てな感じです

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

Re: 攻撃判定を持つクラスを作りたいのですが、どう作ればいいのか解りません。

#3

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

「Objectクラスを継承したクラスActionを作り」とあるのですが、その場合

コード:

void Object::Action_Q()
{
ではなく

コード:

void Action::Action_Q()
{
と定義はなるはずです。
なので、コードを簡易化するにしても端折りすぎていて、どう問題なのかが見えて来ません。

すくなくとも内部クラスは狙いと違うと思いますが、書いてあることを見ているとActionメンバ関数が増やしたいだけにも見えます。
本当にやりたい事は何なのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
SUE
記事: 41
登録日時: 8年前

Re: 攻撃判定を持つクラスを作りたいのですが、どう作ればいいのか解りません。

#4

投稿記事 by SUE » 7年前

Objectクラスでは、2つのObjectの接触判定を行っているのですよね? であれば、それと同時にHP干渉する処理も行ってしまえばいいと思います。

全体を知らない(全部のコードを晒せという意味ではありません)ので主観的な意見ですが、この場合Actionクラスに相当する処理は別にクラスを作るほどのものではないかと思います。また継承を活用しているようですが、活用のしすぎは却って複雑になります。使いすぎるなら使わないくらいの按配が、個人的には良いと思っています。どうしても詰んだら1から書き直すのもアリです。

まあ言ってもこの辺は確かに難しいですよね。かくいう自分も、当たり判定の最適化のためにどうオブジェクトを持たせようか悩んでいますw とにかく試行錯誤あるのみですね。あれ、アドバイスになってない?
pop'n music 20 fantasia ポップンクエストPhase MAX Ⅱ ムラクモ/少年は空を辿る【Power Of Nature】

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: 攻撃判定を持つクラスを作りたいのですが、どう作ればいいのか解りません。

#5

投稿記事 by ISLe » 7年前

ゲーム上でひとつのオブジェクトが複数の当たり判定領域を持つことがあるので、当たり判定オブジェクトはメンバに持つと良いと思います。
で、当たり判定オブジェクト同士で当たり判定するときにコールバックを仕込んでダメージ計算等を行ってはどうでしょう。

閉鎖

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