純粋仮想関数で、ベース作ってエネミークラスを作るテスト

まずはベースクラス。純粋仮想関数を含んでいます。

ベースクラス cGameChar.h cGameChar.cpp

試験に出る仮想関数

"cGameChar.h"
#pragma once
 
//キャラクターのベースになるクラス
class cGameChar
{
public:
	Vec2 position_; //位置(位置ベクトル)
	Vec2 direction_; //向き(単位ベクトル)
	double rot_;//回転角 (radian)
	cGameChar(Vec2 _pos);
	virtual void Update(); //位置情報や、キャラの状態の更新
	virtual void Draw();  //画面への描画処理
};
"cGameChar.cpp"
#include "stdafx.h"
#include "cGameChar.h"
 
cGameChar::cGameChar(Vec2 _pos)
	:position_(_pos)
{
}
 
void cGameChar::Update()
{
	//何もしない
}
 
void cGameChar::Draw()
{
	//何もしない
}

エネミークラス cEnemy.h cEnemy.cpp

"cEnemy.h"
class cEnemy :
    public cGameChar
{
	Mat2x2 afn_; //変換用行列
	double speed_;  //移動速度
	double radius_; //キャラの大きさ
 
	//各ベクトルと回転角からそのフレームの変換行列を求める
	void SetAffineMatrixRadians(double _angle_rad);
	void SetAffineMatrixDegrees(double _angle_deg);
	//void SetMirrorTransformMatrix();
public:
	cEnemy(Vec2 _pos)
		:cGameChar(_pos)
	{
		radius_ = 20.0;
		direction_ = Vec2(1, 0);
		position_ = Vec2(100, 100);
		speed_ = 2.0; //とりあえずスピード2.0 pix/frameで動くことにする
		//rot_ = 0;
		afn_ = Mat2x2::Identity();
	}
	void Update() override;
	void Draw() override;
};
"cEnemy.cpp"
#include "stdafx.h"
#include "cEnemy.h"
 
 
void cEnemy::SetAffineMatrixRadians(double _angle_rad)
{
	afn_ = Mat2x2::Identity();
	afn_._11 = static_cast<float>(-Math::Cos(_angle_rad));
	afn_._22 = static_cast<float>(Math::Sin(_angle_rad));
}
 
void cEnemy::SetAffineMatrixDegrees(double _angle_deg)
{
	afn_ = Mat2x2::Identity();
	afn_._11 = static_cast<float>(-Math::Cos(Math::ToRadians(_angle_deg)));
	afn_._22 = static_cast<float>(Math::Sin(Math::ToRadians(_angle_deg)));
}
 
//void cEnemy::SetMirrorTransformMatrix()
//{
//	afn_ = Mat2x2::Identity();
//	afn_._11 = -1;
//}
 
void cEnemy::Update()
{
	Mat2x2 invMat(-1.0f, 0.0f, 0.0f, 1.0f); //y軸反転のアフィン変換行列
 
	//往復運動させよう!
	if (position_.x < radius_ || position_.x > Scene::Size().x - radius_)
		Mat2x2::multiMatAndMat(afn_, afn_, invMat);
 
	direction_ = afn_.transformPoint(direction_); //キャラの方向を更新
	position_ = position_ + speed_ * direction_;  //キャラの方向にspeed_分進める
}
 
void cEnemy::Draw()
{   //輪郭付きの円を書いてキャラを表す
	Circle(position_.x, position_.y, radius_)  
		.drawFrame(1.0, Palette::Black)
		.draw(Palette::Yellow);
	//キャラの向いている方向に矢印を書くよ
	Vec2 endPoint = position_ + direction_ * radius_;
	Line{ position_, endPoint }
	.drawArrow(3, Vec2{ 15, 10 }, Palette::Red);
}