2016-09-01 5 views
0
私は、彼らがお互いに衝突したときに発射し、敵を削除できるようにしたい
#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はまだ何か私はBCを使用する必要はありません私は、そのような生のptrのように削除を呼び出す必要はありませんか?ユニークなポインタ

+0

'unique_ptr'は' const reference'または 'const raw pointer'によって渡すことができます、または移動することができます。 – Mine

+0

しかし、もしベクトルimを削除してベクトルを渡すと、ベクトル内の一意のオブジェクトに影響を与えているからimはconstなのではない – GCGsauce

答えて

0

はい、あなたはunique_ptrをコピーすることはできませんが、(ProjectileEnemy)にunique_ptrポイントというオブジェクトから参照をコピーしたり、取得することができます。代わりに、あなたもstd::move(unique_ptr...)を使用することができますコピーの

//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"); 
} 
+0

ベクトルのunique_ptrの位置は面白いが削除するのは難しいだろう – GCGsauce

+0

しかし、私はいくつかの種類のガベージコレクション機能を持っていないとしてマークされたオブジェクトのすべてを消去して、敵と発射体でいくつかのプライベートisAliveメンバーをマークする必要があります。ちょっと私が推測するように、私は考えていないより良い方法はありますか? – GCGsauce

+0

あなたのプロジェクトの詳細はわかりませんが、おそらくmain_loopに似ていて、他のオブジェクトにmanager_collisionとアクセスできるものがあります。 オブジェクトを削除するには、衝突が検出されたときに単に '' 'vector.erase(pos_in_vector)' ''を使う必要があります。この呼び出しはunique_ptr内にあり、ポインティングオブジェクトのデストラクタを呼び出します。 – hbadger