Обработка столкновений с объектами, использующими вектор уникальных указателей

 #pragma once
#include "Entity.h"#include <iostream>

class Projectile : public Entity
{
public:
Projectile() {}

Projectile(float x, float y) {
load("Graphics/Projectile.png");
m_sprite.setPosition(x, y);
m_speed = 400;
}
};

#pragma once

#include "Entity.h"#include <iostream>
#include "Projectile.h"
enum class Color {
red,
yellow,
brown,
blue
};

class Enemy : public Entity
{
public:
Enemy(const Color& c, const sf::Vector2f& pos) {
switch (c) {
case Color::blue:
{
load("Graphics/blueEnemy.png");
}
break;
case Color::red:
{
load("Graphics/redEnemy.png");
}
break;
case Color::yellow:
{
load("Graphics/yellowEnemy.png");
}
break;
case Color::brown:
{
load("Graphics/brownEnemy.png");
}
break;
}
setPos(pos);
m_speed = 100;
}
};#pragma once
#include "Entity.h"#include "Projectile.h"#include <vector>

class Spaceship : public Entity
{
public:
Spaceship();
void move(float);
void shoot(float);
void update(float);
void draw(sf::RenderWindow*) override;
private:
bool wasSpacePressed;
std::vector<std::unique_ptr<Projectile>> m_projectiles;
sf::Clock m_clock;
};class EnemyFleet : public Entity
{
public:
EnemyFleet();
~EnemyFleet();
void move(float);
bool isEnemyBottom() const;
bool isLeftMost() const;
bool isRightMost() const;
void moveX(float);
void moveDown();
void update(float);
void draw(sf::RenderWindow*) override;

private:
std::vector<std::unique_ptr<Enemy>> m_enemyFleet;
bool m_leftToRight; //motion of the enemyfleet
float m_speedModifier;
};

Я хочу иметь возможность удалять снаряд и врага, когда они сталкиваются друг с другом, но я не уверен, как это сделать, так как unique_ptr не может быть скопирован в какой-либо параметр в каком-либо классе менеджера столкновений, поскольку он обладает исключительным владением. Unique_ptr все еще то, что я должен использовать, потому что мне не нужно вызывать delete (например, если это необработанный ptr)?

0

Решение

Да, вы не можете скопировать unique_ptr, но вы можете скопировать или получить ссылку от объекта, который unique_ptr указывает на (Projectile а также Enemy).

//Example

bool collision_manager::is_collision(Projectile & pr, Enemy & en) {
if (pr.position() == en.position()) {
return true;
}
return false
}

// similar for other objects that contain vector of unique_ptr
Projectile & Spaceship::get_Projectile(size_t num) {
if(num < m_projectiles.length()) {
return *projectiles.at(num);
}
throw std::invalid_argument("some alert info");
}
  • Вместо копирования вы также можете использовать std::move(unique_ptr...),
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector