我正在创建一个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
:这还将使您能够动态添加和删除新的游戏对象。