制作日誌4

アバター
SAI
記事: 115
登録日時: 14年前
住所: はひほーひ

制作日誌4

投稿記事 by SAI » 14年前

Dixqさんにゲームの組み立て方についてアドバイスをいただいたので、クラスの継承に取り組んでみることに。
GRAMさんにアップキャストの素晴らしさを、Dixqさんにポリモーフィズムの偉大さを学び、ハハーンソウナノカーと半分ほど納得したので1からゲームを組み立てなおすことにしました。
でも継承のすごさを知っても使う機会があるだろうか(-_-;)

基礎部分もクラスにした方がいいとのことだったので、そうしようと思ったら頭がぽぽぽぽーんになりかけたので断念。
主な変更点
calcファイルとdrawファイルを統合。taskファイルにした。
main.hをGV.hとした。main_base.hをmain.hとした。
CPlayerクラスをCSTGPlayerクラスにした。
というか、紛らわしいから、STGのクラスはみんなSTGをつけよう。
そしてCSTGobjectというSTG用の抽象クラスを継承する予定だったけど、やめ。
理由は、引数を使って描画や移動をするが、純粋仮想関数には引数を入れてないから。
さすがに宣言が違ったら純粋仮想関数は使えないよね・・・?
オーバーロード・・・はできるのかな?
でもできてもあまりメリットがなさそうなので別にいいかと思って継承しませんでした。
こっちは敵さんに継承してもらいます。


やべえw
自機動かして遊んでたら、下移動がやけに遅くて、斜め移動がやけに速いことに気がついたw
ええ、ルート2をかけただけで、2で割るのを忘れるとかマヌケですね。斜め移動はええw


メンバ変数名を簡単にしたら引数と衝突するorz


ちくしょー!int同士の割り算の結果自動でdoubleにしてくれよ!!
そんなわけで敵さんできました。HPも描画。ヒャッハー!!

今回の追加分です。
やっとchoreたんに仕事が回ってきました。地味にアルゴリズムに悩みました。あと関数テンプレート初めて使いました。
STGenemy.h

CODE:

//STG敵を司るファイル
#ifndef STGENEMY_H
#define STGENEMY_H


#include "DxLib.h"
#include "STG.h"
#include "GV.h"

#define STG_ENEMY_MIN_X STAGEMIN_X-50	//敵の有効範囲(デフォルト)
#define STG_ENEMY_MIN_Y STAGEMIN_Y-50	//敵の有効範囲
#define STG_ENEMY_MAX_X STAGEMAX_X+50	//敵の有効範囲
#define STG_ENEMY_MAX_Y STAGEMAX_Y+50	//敵の有効範囲

//敵のクラス。必要な数だけオブジェクトを作る。
class CSTGenemy : public CSTGobject,public CStatus
/*
protected:
	double x;
	double y;
	double moveX;
	double moveY;
	int Flag;	
	int MAXHP;
	int HP;
	int atk;
	int HitFlag;
	int range;
	int itemkind[5];
	int itemnum[5];
public:
	int getHP(){return HP;}
	int getatk(){return atk;}
	double getx(){return x;}
	double gety(){return y;}
	int getFlag(){return Flag;}

を継承
*/
{
private:
	double oldposX;
	double oldposY;
	int minX;	//有効範囲。
	int minY;
	int maxX;
	int maxY;
	int shottype;
	int movetype;
	int count;
	double spd;
	int graph;
	double shotspd;
	int shotatk;
public:
	void init_tr();	//メンバの初期化
	CSTGenemy()
	{
		init_tr();
	}
	
	//敵出現関数。
	void appear_tr(int _x,int _y,int _HP,double _spd,int _atk,int _range,int _movetype,int _shottype,double _shotspd,int _shotatk,int* _itemkind,int* _itemnum,int _graph);	
	//仮想関数組
	void move_mf();	//移動
	void shot_mf();	//弾発射
	void hit_mf();	//弾命中
	void dead_mf();	//死亡
	void draw();	//描画
	void drawHP();	//HP描画
};


#endif
STGenemy.cpp

CODE:

#include "DxLib.h"
#include "STGenemy.h"
#include "GV.h"


//メンバの初期化
void CSTGenemy::init_tr()	
{
		oldposX=0;
		oldposY=0;
		x=0;
		y=0;
		moveX=0;
		moveY=0;
		Flag=0;
		MAXHP=200;
		HP=MAXHP;
		atk=10;
		HitFlag=0;
		range=5;
		for(int i=0; i 0)
	{
		switch(movetype)
		{
		case 0:
			moveX=spd;
			break;
		case 1:
			moveY=spd;
			break;
		default:
//			 printfDx("不明なCSTGenemy::movetype\n");
			 break;
		}
		oldposX = x;
		oldposY = y;
		x += moveX;
		y += moveY;
	}
}

//弾発射
void CSTGenemy::shot_mf()	
{

}
//弾命中
void CSTGenemy::hit_mf()	
{

}
//死亡
void CSTGenemy::dead_mf()	
{
	if(xmaxX || ymaxY)	//範囲外で消滅
		Flag=0;

	if(HP0)
	{
		DrawCircle( int(x) +donX, int(y) +donY, 10,color.red, TRUE ) ;	//仮の敵機
	}
}

//HP描画
void CSTGenemy::drawHP()
{
	if(Flag>0)
	{
		int rx=20;	//HPを描く座標のずれ
		int ry=0;
		int dx=5;	//HPゲージの幅
		int dy=15;
		int Cr =color.white;
		if(double(HP)/MAXHP >0.5) Cr=color.white;         //MAXは白
		else if(double(HP)/MAXHP >0.1) Cr=color.yellow; //50~10%まで黄
		else Cr=color.red;   // あとは赤
        DrawBox(int(x) +rx +donX, int(y -dy)+ry +donY,int(x) +rx-dx +donX,int( y )+ry +donY,color.black,TRUE );//内部を描画
        DrawBox(int(x) +rx +donX, int(y -dy)+ry +donY,int(x) +rx-dx +donX,int( y )+ry +donY,color.white,FALSE );//枠を描画
        DrawBox(int(x) +rx +donX, int(y -dy+dy*(1- double(HP)/ MAXHP))+ry +donY,int(x) +rx-dx +donX,int( y )+ry +donY,Cr,TRUE );//メーターを描画
	}
}

STG.cpp

CODE:

#include "DxLib.h"
#include "STG.h"
#include "STGplayer.h"
#include "STGenemy.h"
#include "GV.h"
#include "chara.h"
#include "chore.h"


static CSTGPlayer STGPlayer;
static CSTGenemy STGEnemy[MAX_ENEMY];
static CCharacter ark("アーク");


static int STGgametime=0;	//STGの戦闘時間


//登録されてない敵を探して出現させる。帰り値は番号
int EnemyAppear_tr(int _x,int _y,int _HP,double _spd,int _atk,int _range,int _movetype,int _shottype,double _shotspd,int _shotatk,int* _itemkind,int* _itemnum,int _graph)
{
	for(int i=0; i 10000)	//nが1万を超えていれば抜ける
			break;
		d*=10;
		n*=10;
	}
	return GetRand(int((n1-n2)*num*d))/num/d+n2;
}

//引数1と2を入れ替えるテンプレート関数
template  void swapT(T* p1,T* p2)
{
	T c = *p1;
	*p1 = *p2;
	*p2 = c;
}

xxx
記事: 26
登録日時: 14年前

Re: 制作日誌4

投稿記事 by xxx » 14年前

>メンバ変数名を簡単にしたら引数と衝突するorz
thisポインタ使えば解決です

アバター
SAI
記事: 115
登録日時: 14年前
住所: はひほーひ

Re: 制作日誌4

投稿記事 by SAI » 14年前

おお、こんなやり方が。
ありがとうございます!
次回からはこれを使います!

てか日記書いてから3分って早いw

アバター
へろりくしょん
記事: 92
登録日時: 14年前

Re: 制作日誌4

投稿記事 by へろりくしょん » 14年前

私は25行以上のプログラムを読み書き出来ませんので、出来れば全てのコードを25行以内に納めてくれれば助かるのですが。

アバター
SAI
記事: 115
登録日時: 14年前
住所: はひほーひ

Re: 制作日誌4

投稿記事 by SAI » 14年前

25行以上がダメだったら、ちょうど25行に納めても読めないではありませんか。(ぇ