我可以同时绘制所有相同类型的对象吗?

我正在创建一个2d平台游戏,并在不同的类中创建了多个对象。

下面的代码显示了我当前如何创建对象并将其绘制到窗口中。

有没有办法可以绘制类中的所有对象(例如所有可收藏的对象),而不必绘制每个单独的对象,如下所示?

/*!
\file game.cpp
*/
#include "game.h"

//TODO:
//Collectibles - delete on contact
//Enemies - move away on contact (maybe delete on contact?)
//HUD -lives, minmap and score system
//Win condition
//Lose Condition
//Build level

Game::Game()
{
    // Load textures.
    m_texture.loadFromFile("./assets/textures/sky.png");
    m_floor.loadFromFile("./assets/textures/floor.jpg");
    m_collect.loadFromFile("./assets/textures/diamond.png");
    m_bed.loadFromFile("./assets/textures/bed.png");
    m_bounce.loadFromFile("./assets/textures/bounce.png");
    m_sprite.loadFromFile("./assets/textures/spriteTexture.png");
    m_enemy.loadFromFile("./assets/textures/enemySpriteSheet.png");

    //Initialise picture variables
    m_picture.setSize(sf::Vector2f(8.f, 6.f));
    m_picture.setTexture(&m_texture);
    m_picture.setPosition(0.f, 0.f);
    m_picture.setOrigin(4.f, 3.f);

    m_view.setCenter(0.f, 0.f);
    m_view.setSize(m_worldSize);

    m_pWorld = new b2World(mk_gravity);

    //create static blocks
    m_ground = new StaticBlock(m_pWorld, sf::Vector2f(0.f, 2.75f), sf::Vector2f(400.f, 0.5f), 0.f, &m_floor, false);
    m_roof = new StaticBlock(m_pWorld, sf::Vector2f(0.f, -3.25f), sf::Vector2f(400.f, 0.5f), 0.f, &m_floor, false);
    m_plat1 = new StaticBlock(m_pWorld, sf::Vector2f(3.f, 1.5f), sf::Vector2f(4.f, 0.5f), 0.f, &m_floor, false);
    m_bounce1 = new StaticBlock(m_pWorld, sf::Vector2f(7.f, 1.5f), sf::Vector2f(2.f, 0.5f), 0.f, &m_bounce, true);

    //create kinematic blocks
    m_move1 = new KinematicBlock(m_pWorld, sf::Vector2f(0.f, 0.25f), 1.f, sf::Vector2f(5.f, 0.5f), 0.f, &m_floor);

    //create collectibles
    m_coin = new Collectible(m_pWorld, sf::Vector2f(2.f, 0.85f), sf::Vector2f(0.3f, 0.3f), 0.f, &m_collect);

    //create character
    m_character = new Character(m_pWorld, sf::Vector2f(0.f, 2.25f), sf::Vector2f(0.25f, 0.5f), 0.f, &m_sprite);

    //create enemies
    m_simpEnemy1 = new SimpleEnemy(m_pWorld, sf::Vector2f(4.f, 2.325f), 3.f, sf::Vector2f(0.75f, 0.375f), 0.f, &m_enemy, sf::IntRect(0,17,41,14));

    //create winner pole
    m_win = new WinnerPole(m_pWorld, sf::Vector2f(15.f, 2.25f), sf::Vector2f(1.f, 0.5f), 0.f, &m_bed);

    //set contact listener
    m_pWorld->SetContactListener(&m_listener);
}

Game::~Game()
{
    // Clean up all pointers
    delete m_pWorld;
    m_pWorld = nullptr;
}

void Game::update(float timestep)
{
    // Update the world
    m_pWorld->Step(timestep, mk_iVelIterations, mk_iVelIterations);
    m_picture.setPosition(m_character->getPosition().x, 0.f);
    m_view.setCenter(m_character->getPosition().x, m_view.getCenter().y);

    // Update each dyanmic element - effectively update render information
    m_character->update();
    m_simpEnemy1->update();
    m_move1->update();
    m_coin->update();
}

void Game::draw(sf::RenderTarget &target, sf::RenderStates states) const
{
    // Set the view
    target.setView(m_view);

    // Draw everything
    target.draw(m_picture);
    target.draw(*m_character);
    target.draw(*m_simpEnemy1);
    target.draw(*m_ground);
    target.draw(*m_plat1);
    target.draw(*m_move1);
    target.draw(*m_bounce1);
    target.draw(*m_coin);
    target.draw(*m_win);
}
评论
  • 望_
    望_ 回复

    Assuming all of your objects inherit from sf::Drawable:

    // Declare this field in your class
    std::vector<sf::Drawable*> m_drawable_objects;
    
    // Fill it in your Game constructor
    m_drawable_objects = {
        &m_picture, m_character, m_simpEnemy1, ...
    };
    
    // Use it in your draw method
    for (auto * drawable : drawable_objects) {
        target.draw(*drawable);
    }
    

    这还将使您能够动态添加和删除新的游戏对象。