進捗報告を少し、friend関数で当たり判定のクラスとstd::listを管理している二つのクラスを関連付けしてあげることで無事参照することが出来ました。
いざデバッグしてみると、コンパイルエラーこそ出なかったものの、画面が固まってしまいました。これは当たり判定の処理を加えた直後に起こったことなので何が原因かは明らかですが、その対処法がいまいちわからないという状況です。
ソースコードです。
コード:
isHitCheck.h
#pragma once
#include "PlayerBullet01.h"
#include "PlayerBullet02.h"
#include "EnemyManager.h"
class HitCheck
{
friend class EnemyManager;
public:
HitCheck();
PlayerBulletCollection01* playerbullet01;
PlayerBulletCollection02* playerbullet02;
EnemyManager* enemy;
bool CircleCollision(double pc, double ec, double cx1, double cx2, double cy1, double cy2);
void CollisionAll();
};
isHitCheck.cpp
#include "isHitCheck.h"
#include "Define.h"
HitCheck::HitCheck()
{
}
bool HitCheck::CircleCollision(double pc, double ec, double cx1, double cx2, double cy1, double cy2)
{
//仮引数は左から弾の半径、敵の半径、弾のx座標、敵のx座標、弾のy座標、敵のy座標
double hlength = pc + ec;
double xlength = cx1 - cx2;
double ylength = cy1 - cy2;
if(hlength * hlength >= xlength * xlength + ylength * ylength) {
return true;
}
else {
return false;
}
}
void HitCheck::CollisionAll()
{
float px, py, ex, ey; //判定処理をしたい弾と敵の座標
//操作キャラの弾と敵との当たり判定
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < Define::PBULLET_NUM / 4; ++j) {
if (playerbullet01->GetShotPosition(i, j, &px, &py)) {
for (auto enemy : enemy->_list) {
if (!enemy->GetDeadFlag()) {
enemy->GetPosition(&ex, &ey);
//当たり判定
if (CircleCollision(Define::PSHOT_COLLISION, Define::ENEMY_COLLISION, px, ex, py, ey)) {
//当たっていれば、deadflagを立てる
enemy->SetDeadFlag();
//当たった弾のフラグを戻す
playerbullet01->SetShotFlag(i, j, false);
}
}
}
}
}
}
}
内容はほとんど前回と変わっていません。処理が固まってしまう原因として、for(auto enemy : enemy->_list)が無限ループになっているのではとも思いましたが、同じように記述した別のクラスではエラーが発生してないので、違うようです。
また、エネミー関連のソースコードも添付しておきます。ちょっと量が多いですが、、
コード:
AbstractEnemy.h
#pragma once
#include "Task.h"
class AbstractEnemy : public Task
{
public:
AbstractEnemy(float x, float y);
virtual ~AbstractEnemy() = default;
void initialize();
bool update() override;
void SetDeadFlag() { deadflag = true; }
bool GetDeadFlag() { return deadflag; }
bool GetPosition(float* x, float* y);
protected:
virtual void setSize() = 0;
float _x, _y; //座標
float _speed; //速さ
float _angle; //角度
int _counter; //カウンタ
int _width; //幅
int _height; //高さ
bool deadflag; //死亡フラグ
};
AbstractEnemy.cpp
#include "AbstractEnemy.h"
#include <DxLib.h>
#include "Image.h"
#include "Define.h"
AbstractEnemy::AbstractEnemy(float x, float y) :
_x(x),
_y(y),
_speed(0),
_angle(0),
_counter(0),
_width(0),
_height(0)
{
}
void AbstractEnemy::initialize()
{
setSize();
deadflag = false;
}
bool AbstractEnemy::update()
{
_counter++;
_x += cos(_angle) * _speed;
_y += sin(_angle) * _speed;
return true;
}
bool AbstractEnemy::GetPosition(float* x, float* y)
{
if (!deadflag) {
*x = _x;
*y = _y;
return true;
}
else {
return false;
}
}
EnemyManager.h
#pragma once
#include "Task.h"
#include <memory>
#include <list>
#include "Enemy.h"
#include "isHitCheck.h"
class EnemyManager : public Task
{
friend class HitCheck;
public:
EnemyManager();
virtual ~EnemyManager() = default;
bool update() override;
void draw() const override;
protected:
std::list<std::shared_ptr<Enemy>> _list;
};
EnemyManager.cpp
#include "Enemymanager.h"
#include "Define.h"
using namespace std;
EnemyManager::EnemyManager()
{
_list.emplace_back(make_shared<Enemy>(Define::CENTER_X, 100));
}
bool EnemyManager::update()
{
for (auto enemy : _list) {
enemy->update();
}
return true;
}
void EnemyManager::draw() const
{
for (const auto enemy : _list) {
enemy->draw();
}
}
Enemy.h
#pragma once
#include "AbstractEnemy.h"
class Enemy final : public AbstractEnemy
{
public:
Enemy(float x, float y);
~Enemy() = default;
void draw() const override;
protected:
void setSize() override;
};
Enemy.cpp
#include "Enemy.h"
#include <DxLib.h>
#include "Image.h"
#include "Define.h"
Enemy::Enemy(float x, float y) : AbstractEnemy(x, y)
{
deadflag = false;
_speed = 2.0f;
_angle = Define::PI / 2 - Define::PI / 5;
}
void Enemy::draw() const
{
const int handle = Image::getIns()->getEnemyNormal()[4];
if(!deadflag)
DrawRotaGraphF(_x, _y, 1.0, 0.0, handle, TRUE);
}
void Enemy::setSize()
{
int handle = Image::getIns()->getEnemyNormal()[4];
GetGraphSize(handle, &_width, &_height);
}
こちらでももう少し色々探ってみますが、もし明らかな欠陥やアドバイスなどありましたらご指摘いただけると幸いです。