SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Отрисовка персонажей и объектов
В этой теме 2 ответа, 2 участника, последнее обновление Deffoe 5 года/лет, 11 мес. назад.
-
АвторСообщения
-
Всем доброго времени суток. Хочу сделать отрисовку персонажей и объектов в зависимости от их нахождения на карте (т.е. если персонаж ближе к низу карты чем второй персонаж, то он будет рисоваться поверх второго). Все персонажи находятся в списке. Насколько я понимаю, я должен размещать, перемещать и менять местами персонажей в списке в зависимости от того насколько большое значение координаты Y, но со списками мало знаком. Может кто то подсказать или показать, как примерно можно это сделать?
Я для себя когда-то состряпал такую конструкцию
C++1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071#ifndef NODE_H#define NODE_H#include <SFML/Graphics.hpp>class GameState;namespace sfge{class Node{public:/// \brief Base ctorNode(const std::string& name = "Node");virtual ~Node();/// \brief Get node name/// return stringstd::string getName();/// \brief Set node name/// @param stringvoid setName(const std::string& name);void draw(sf::RenderWindow* window);void update(sf::Time delta);void handle(const sf::Event& event);void addNode(Node* node);void removeNode(Node* node);/// \brief called after onUpdate()void applyUpdate(sf::Time delta) {}void setWindow(sf::RenderWindow* window);int getZ() const;void setZ(int z);Node* getParent();void setParent(Node* parentnode);std::vector<Node*>& getChildren();protected:/// \brief Sort all added childrens/// use carefulyvoid sortChildrenByZValue();/// \brief Draw things. Allways called last in game loopvirtual void onDraw(sf::RenderWindow * window) {}/// \brief Called evry game tickvirtual void onUpdate(sf::Time delta) {}/// \brief Called when window get event. For example - window get focused/// or key pressed;virtual void onHandle(const sf::Event& event) {}virtual void onWindowSet(){}Node* parent;sf::RenderWindow* window;private:std::vector<Node*> children;std::string name;int z;};}#endif // NODE_HC++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120//Node.cpp#include "Node.h"#include <algorithm>#include <tmx/Log.h>using namespace tmx;namespace sfge{bool sortByZValue(const Node* a, const Node* b){return (a->getZ() < b->getZ());}Node::Node(const std::string& name) : name(name), parent(NULL), z(0), window(NULL){//ctor}Node::~Node(){for(Node* node : children){LOG("deleting node: " + node->getName(),Logger::Type::Info);delete node;}}std::string Node::getName(){return name;}void Node::setName(const std::string& name){this->name = name;}void Node::setZ(int z){this->z = z;}int Node::getZ() const{return z;}void Node::setWindow(sf::RenderWindow* window){this->window = window;for(Node* node : children)node->setWindow(window);onWindowSet();}void Node::sortChildrenByZValue(){std::sort(begin(children), end(children), sortByZValue);}void Node::draw(sf::RenderWindow* window){onDraw(window);for(Node* node : children)node->draw(window);}void Node::update(sf::Time delta){onUpdate(delta);for(Node* node : children)node->update(delta);}void Node::handle(const sf::Event& event){onHandle(event);for(Node* node : children)node->handle(event);}void Node::addNode(Node* node){node->setParent(this);node->setWindow(window);children.push_back(node);std::sort(begin(children), end(children), sortByZValue);}void Node::removeNode(Node* node){for(auto itr = children.begin(); itr != children.end(); itr++){if(node == (*itr)){children.erase(itr);return;}}}Node* Node::getParent(){return parent;}void Node::setParent(Node* parentnode){parent = parentnode;}std::vector<Node*>& Node::getChildren(){return children;}}Энтити наследуется уже от узла. Дальше сортировка идёт по std::sort(begin(children), end(children), sortByZValue); (т.е. по int z) и вызываешь в цикле handle, update и draw. Но делалось это не для постоянного обновления, а для отрисовки бекграунда статично позади – используй с осторожностью.
udp И добавлялись все эти обьекты в State () который сам от наследуется от ноды. Если хочешь использовать мой способ придётся для Main loop сделать наследование от ноды и добавлять ссылки на обьекты через addChildren(Node * node); Т.е.
C++123456789101112131415161718sfge::State app();sf::Clock stopwatch;stopwatch.restart();while (window.isOpen){sf::Event e;while (window.pollEvent(e)){app.handle(e);}app.update(stopwatch.restart());app.draw(window);}Спасибо большое)
Попробую разобраться
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.