Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#ifndef ITME_H #define ITEM_H #include <SFML\Graphics.hpp> class Item : public sf::Drawable, public sf::Transformable { public: Item(); virtual void update(float frametime) = 0; void setSpeed(float speed); float getSpeed() const; private: virtual void draw(sf::RenderTarget &target, sf::RenderStates states) const = 0; float _speed = 45.f; }; #endif // !ITME_H |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#ifndef ENLARGER_H #define ENLARGER_H #include <game\items\Item.h> #include <core\Resource.h> #include <SFML\Graphics.hpp> class Enlarger : public Item { public: Enlarger(); void update(float frametime) override; private: void draw(sf::RenderTarget &target, sf::RenderStates states) const override; private: sf::Sprite _sprite; }; #endif // !ENLARGER_H |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <game\items\Enlarger.h> /////////////////////////////////////////////////////////////////////////////////////////////// Enlarger::Enlarger() { // initialize the sprite _sprite.setTexture(Resource::getTexture("enlarger.png")); _sprite.scale(sf::Vector2f(0.05f, 0.05f)); } /////////////////////////////////////////////////////////////////////////////////////////////// void Enlarger::update(float frametime) { // move the sprite _sprite.move(sf::Vector2f(0.f, this->getSpeed() * frametime)); } /////////////////////////////////////////////////////////////////////////////////////////////// void Enlarger::draw(sf::RenderTarget& target, sf::RenderStates states) const { // present the sprite on the screen target.draw(_sprite); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#ifndef ITEMMANAGER_H #define ITEMMANAGER_H #include <SFML\Graphics.hpp> #include <game\items\Enlarger.h> #include <vector> class Itemmanager : public sf::Drawable { public: Itemmanager(); void update(float frametime, sf::RenderWindow& rw); void addItem(int combo, sf::Vector2f position); private: void draw(sf::RenderTarget &target, sf::RenderStates states) const override; private: std::vector<Item> _items; }; #endif // !ITEMMANAGER_H |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#include <game\items\ItemManager.h> /////////////////////////////////////////////////////////////////////////////////////////////// Itemmanager::Itemmanager() { } /////////////////////////////////////////////////////////////////////////////////////////////// void Itemmanager::update(float frametime, sf::RenderWindow& rw) { // call the update method for each item for (int it = 0; it < _items.size(); it++) { _items.at(it).update(frametime); // if the item has left the window, then delete it if (_items.at(it).getPosition().y > rw.getSize().y) { //_items.erase(_items.begin() + it); } } } /////////////////////////////////////////////////////////////////////////////////////////////// void Itemmanager::addItem(int combo, sf::Vector2f position) { bool spawn_probability = std::rand() % 2; // if the spawn_probability equals 1, then check with item so spawn if (spawn_probability == true) { // if the combo is equals 2, then spawn an enlarger if (combo == 2) { Enlarger enlarger; enlarger.setPosition(position); _items.push_back(enlarger); } } } /////////////////////////////////////////////////////////////////////////////////////////////// void Itemmanager::draw(sf::RenderTarget & target, sf::RenderStates states) const { // draw the itmes for (int it = 0; it < _items.size(); it++) { target.draw(_items.at(it)); } } |
Zitat
Eine abstrakte Klasse bezeichnet in der objektorientierten Programmierung eine spezielle Klasse, welche sich per Definition nicht instanziieren lässt (d.h. es lassen sich keine Objekte von ihr erzeugen) und die somit lediglich als Strukturelement innerhalb einer Klassenhierarchie dient. Innerhalb von abstrakten Klassen besteht die Möglichkeit abstrakte Methoden (also Methoden ohne „Rumpf“ (Implementierung) nur mit der Signatur) zu deklarieren.
Wikipedia Zitat
Zitat
Eine abstrakte Klasse bezeichnet in der objektorientierten Programmierung eine spezielle Klasse, welche sich per Definition nicht instanziieren lässt (d.h. es lassen sich keine Objekte von ihr erzeugen) und die somit lediglich als Strukturelement innerhalb einer Klassenhierarchie dient. Innerhalb von abstrakten Klassen besteht die Möglichkeit abstrakte Methoden (also Methoden ohne „Rumpf“ (Implementierung) nur mit der Signatur) zu deklarieren.
Administrator
Dein Problem ist der vector<Item>. Du brauchst einen vector<Item*> oder besser noch mit Smart-Pointern vector<unique_ptr<Item>>.
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Administrator
Das mit std::move ist allerdings für einen Einsteiger schwierig zu verstehen. Es ist vollkommen in Ordnung, wenn du da erst einmal hängen bleibst. Nun kannst du entweder den "einfachen" Weg gehen und normale Zeiger benutzen statt Smart-Pointer (früher oder später wirst du merken, dass sie sinnvoll sind) oder aber du nimmst dir vor, es von Beginn an richtig zu lernen. Das ist dir überlassen.
Werbeanzeige