2016-09-01 53 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不能被複制到任何參數在一些碰撞管理類bc中擁有獨佔所有權。是unique_ptr仍然是我應該使用bc我不必調用刪除(如果它的原始ptr)?處理衝突與使用唯一的指針

+0

'unique_ptr'可以通過'const reference'或'const raw pointer'傳遞,或者可以被移動。 – Mine

+0

但如果即時通訊刪除它在向量im傳遞一個向量,也不能是常量,因爲即時通訊影響向量內的獨特對象 – GCGsauce

回答

0

是的,您不能複製unique_ptr,但您可以複製或從unique_ptr指向的對象(ProjectileEnemy)獲取參考。

//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

有趣的,但刪除矢量unique_ptr的位置將是艱難的 – GCGsauce

+0

好吧不難,但我想我必須在敵人和子彈中標記一些私有的isAlive成員,然後通過某種垃圾收集功能清除標記爲不活動的所有對象。似乎有點多我想,有沒有更好的方式我沒有想到? – GCGsauce

+0

我不知道有關您的項目的詳細信息,但您可能有類似於main_loop的東西,它們具有manager_collision並可以訪問其他對象。 要刪除對象,只需在檢測到碰撞時使用''vector.erase(pos_in_vector)''',這個調用刪除器在unique_ptr中調用指針對象的析構函數。 – hbadger