現在C++, DxLibで敵が上から落としてくる弾をかわすといったゲームを作っています。そこで敵が弾を打つ際のプログラムについて手間取っております。
とりあえず以下のようなコードで敵が弾を打つのは実装できました。
EnemyManager.h
#pragma once
#include "Task.h"
#include "AbstEnemy.h"
#include <memory>
#include <vector>
#include "BulletManager.h"
class EnemyManager : public Task
{
public:
EnemyManager(std::shared_ptr<BulletManager> impl);
virtual ~EnemyManager() = default;
bool update() override;
void draw() const override;
private:
std::vector<std::shared_ptr<AbstEnemy>> _vector;
};
#include "EnemyManager.h"
#include "Define.h"
#include "Enemy_1.h"
using namespace std;
EnemyManager::EnemyManager(std::shared_ptr<BulletManager> impl)
{
for (int i = 0; i < Define::BLOCK_NUM; ++i) {
_vector.emplace_back(make_shared<Enemy_1>(impl,i));
}
for (auto enemy : _vector) {
enemy->initialize();
}
}
bool EnemyManager::update()
{
for (auto enemy : _vector) {
enemy->update();
}
return true;
}
void EnemyManager::draw() const
{
for (const auto enemy : _vector) {
enemy->draw();
}
}
#pragma once
#include "AbstEnemy.h"
#include "BulletManager.h"
#include <memory>
class Enemy_1 final : public AbstEnemy
{
public:
Enemy_1(std::shared_ptr<BulletManager> impl,int index);
~Enemy_1() = default;
bool update() override;
void draw() const override;
protected:
//いろいろ関数が入る…
Enemy_1.cpp
[code]
#include "Enemy_1.h"
#include "Image.h"
#include "Define.h"
#include "Error.h"
#include "Macro.h"
#include "eBullet.h"
#include <DxLib.h>
const static float SPEED = 3;
Enemy_1::Enemy_1(std::shared_ptr<BulletManager> impl, int index) :
_count(0),
_stateFlag(0),
_motionState(0),
_bullet(impl),
AbstEnemy(index)
{
_setpoint = (index + 0.5) * Define::BLOCK_W;
}
//ここにupdateやdrawなどの関数…
void Enemy_1::throwBullet()
{
++_count;
if (_count == 30) {
_bullet->GenerateBullet(_index,eBullet::normal);
}
if (_count == 90) {
++_motionState;
}
DrawFormatString(200, 150, GetColor(255, 255, 255),"%d",_count);
}
#pragma once
#include "Task.h"
#include "AbstBullet.h"
#include <memory>
#include <vector>
#include "eBullet.h"
class BulletManager : public Task
{
public:
BulletManager();
virtual ~BulletManager() = default;
bool update() override;
void draw() const override;
void GenerateBullet(int index,const eBullet ebullet);
private:
std::vector<std::shared_ptr<AbstBullet>> _vector;
};
#include "BulletManager.h"
#include "Define.h"
#include "NormalBullet.h"
#include <DxLib.h>
using namespace std;
BulletManager::BulletManager()
{
}
//updateやdrawなどの関数…
void BulletManager::GenerateBullet(int index, const eBullet ebullet)
{
switch (ebullet) {
case normal:
_vector.emplace_back(make_shared<NormalBullet>(index));
break;
default:
break;
}
_vector.back()->initialize();
}
このようなあるクラスから他のクラスを参照したり、インスタンスを生成したりするのに良い方法があれば教えていただきたいです。
(インターフェイスを用いればいいのかと思い、調べて試行錯誤してみましたが結局よくわからないままでした…)