Du bist nicht angemeldet.

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

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

1

26.08.2016, 18:26

[C++ | SFML] Vektorelemente können nicht gezeichnet werden?

Hallo,

ich schreibe gerade eine Klasse, welche Rechtecke (Bricks) so anordnen soll, dass diese automatisch eine Art "Zeilenumruch" vornehmen, wenn die eine Zeile gefüllt ist. Aber das ist eine andere Sache. Kommen wir zum eigentlichen Problem: Die Klasse Brick erbt von der Klasse Entity (da die Anwendung auf dem Entity-Component-System basieren soll). Entity ist abstrakt und erbt von public sf::Transformable und public sf::Drawable. Deshalb kann ich keine Instanzen der Klasse Brick erstellen, sondern nur zb. einen shared_ptr, was zur Folge hat, dass der Container (std::vector) shared_ptr als Elemente aufnehmen muss. Nun bekomme ich diesen Fehler, wenn ich den Code compilieren will:
C2664 "void sf::RenderTarget::draw(const sf::Vertex *,std::size_t,sf::PrimitiveType,const sf::RenderStates &)" : Konvertierung von Argument 1 von "const std::shared_ptr<Brick>" in "const sf::Drawable &" nicht möglich

[Hier der Code]

Entity.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
#ifndef ENTITY_H
#define ENTITY_H

#include <SFML\Graphics.hpp>
#include <core\Resource.h>
#include <iostream>

class Entity : public sf::Transformable, public sf::Drawable
{
public:
    Entity();

    virtual void update(sf::RenderWindow& rw, float deltatime) = 0;
    virtual void handle(sf::Event& ev) = 0;

    void setSize(sf::Vector2f size);
    sf::Vector2f getSize() const;

private:
    sf::Vector2f _size;

};
#endif // !ENTITY_H


Brick.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
#ifndef BRICK_H
#define BRICK_H

#include <game\Entity.h>
#include <SFML\Graphics.hpp>

class Brick : public Entity
{
public:
    Brick(sf::Color color=sf::Color::Red);

    void update(sf::RenderWindow& rw, float deltatime) override;
    void handle(sf::Event& ev) override;

    void setAlive(bool alive);
    void setColor(sf::Color color);
    
    void draw(sf::RenderTarget &target, sf::RenderStates states) const;

    bool getAlive();

private:
    sf::Vector2f _size;

    sf::Sprite _sprite;

    bool _alive;
};

#endif


Brick.cpp:

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
#include <game\Brick.h>

///////////////////////////////////////////////////////////////////////////////////////////////
Brick::Brick(sf::Color color)
    : _size(Resource::getTexture("brick.png").getSize())
    , _alive(true)
{
    setSize(_size);
    _sprite.setTexture(Resource::getTexture("brick.png"));
    _sprite.setColor(color);
}
///////////////////////////////////////////////////////////////////////////////////////////////
void Brick::update(sf::RenderWindow & rw, float deltatime)
{
}
///////////////////////////////////////////////////////////////////////////////////////////////
void Brick::handle(sf::Event & ev)
{
}
///////////////////////////////////////////////////////////////////////////////////////////////
void Brick::setAlive(bool alive)
{
    _alive = alive;
}
///////////////////////////////////////////////////////////////////////////////////////////////
void Brick::setColor(sf::Color color)
{
    _sprite.setColor(color);
}
///////////////////////////////////////////////////////////////////////////////////////////////
void Brick::draw(sf::RenderTarget & target, sf::RenderStates states) const
{
    target.draw(_sprite);
}
///////////////////////////////////////////////////////////////////////////////////////////////
bool Brick::getAlive()
{
    return _alive;
}
///////////////////////////////////////////////////////////////////////////////////////////////


Brickmanager.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
#ifndef BRICKMANAGER_H
#define BRICKMANAGER_H

#include <SFML\Graphics.hpp>
#include <game\Brick.h>

#include <vector>
#include <memory>

class Brickmanager : public sf::Drawable, public sf::Transformable
{
public:
    Brickmanager();
    ~Brickmanager();

    void addBrick();
    void deleteBrick(Brick &brick);

private:
    void draw(sf::RenderTarget &target, sf::RenderStates states) const;

private:
    std::vector<std::shared_ptr<Brick>> _bricks;

    sf::Color _brickColors[4];
};

#endif


Brickmanager.cpp:

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
#include <game\Brickmanager.h>

///////////////////////////////////////////////////////////////////////////////////////////////
Brickmanager::Brickmanager()
{
    _brickColors[0] = sf::Color::Blue;
    _brickColors[1] = sf::Color::Red;
    _brickColors[2] = sf::Color::Green;
    _brickColors[3] = sf::Color::Yellow;
}
///////////////////////////////////////////////////////////////////////////////////////////////
Brickmanager::~Brickmanager()
{
    _bricks.clear();
}
///////////////////////////////////////////////////////////////////////////////////////////////
void Brickmanager::addBrick()
{
    std::shared_ptr<Brick> brickptr;

    brickptr->setColor(_brickColors[std::rand() + 0 % 4]);

    _bricks.push_back(brickptr);
}
///////////////////////////////////////////////////////////////////////////////////////////////
void Brickmanager::deleteBrick(Brick &brick)
{
    for (int it = 0; it < _bricks.size(); it++)
    {
        _bricks.erase(_bricks.begin() + it);
    }
}
///////////////////////////////////////////////////////////////////////////////////////////////
void Brickmanager::draw(sf::RenderTarget & target, sf::RenderStates states) const
{
    for (int it = 0; it < _bricks.size(); it++)
    {
        ////////////////////////////
        // HIER IST DER FEHLER !! //
        ////////////////////////////
        target.draw(_bricks.at(it));
    }
}
///////////////////////////////////////////////////////////////////////////////////////////////


Wo habe ich etwas falsch gemacht?
Vielen Dank im Voraus :D

PS: Ich hoffe, dass es nicht zu viel Code auf einmal ist ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »cojo2015« (26.08.2016, 18:45)


2

26.08.2016, 19:45

Ja die lieben Smartpointer, haben mich am Anfang auch verwirrt.

Wenn du im Brick Manager die at()-Methode verwendest bekommst du den Smartpointer.
Schau dir mal die get()-Methode des Smartpointers an.

Und dann Frage ich mich wieso das ein shared_ptr ist wenn die Klasse die ihn Hält Manager im Namen hat, wahrscheinlich ist unique_ptr die bessere Wahl.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

3

26.08.2016, 19:46

Ein std::shared_ptr ist nunmal kein Drawable. Du vergisst die Dereferenzierung. Außerdem bin ich mir zu 99% sicher, dass ein s_ptr hier fehl am Platz ist.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

26.08.2016, 19:58

Entity ist abstrakt und erbt von public sf::Transformable und public sf:rawable. Deshalb kann ich keine Instanzen der Klasse Brick erstellen, sondern nur zb. einen shared_ptr
Diese Aussage strotzt vor Unsinn. Bitte ordne deine Gedanken noch einmal und fang nochmal an.
Und was managed denn dein Brick-Manager? Wie ich das sehe ist das eigentlich auch nur ein Vektor, dem man noch eine Farbe geben kann. Mehr ist es doch nicht. Ein gewrappter und verstümmelter, farbiger Vektor.
Wieso es außerdem unbedingt ein shared_ptr statt einem vernünftigen unique_ptr sein soll, erschließt sich mir nicht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (26.08.2016, 20:05)


cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

5

27.08.2016, 21:06

Danke trotzdem, ich habe den Fehler gefunden :D

6

27.08.2016, 21:46

Danke trotzdem, ich habe den Fehler gefunden :D

Und was war der Fehler?

Du solltest trotzdem über die angebrachte Kritik, mal nachdenken, 3 Antworden und alle 3 sagen dir das shared_ptr nicht die Richtige wahl ist!
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

7

28.08.2016, 08:37

Und was war der Fehler?
Ich musste die draw-Methode in Entity als virtual deklarieren.

Du solltest trotzdem über die angebrachte Kritik, mal nachdenken, 3 Antworden und alle 3 sagen dir das shared_ptr nicht die Richtige wahl ist!

Jap. Nachdem ich die draw-Methode als virtual deklariert hatte, hat es auch ohne shared_ptr geklappt.

Trotzdem Danke :D

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

28.08.2016, 16:27


Jap. Nachdem ich die draw-Methode als virtual deklariert hatte, hat es auch ohne shared_ptr geklappt.

Vielleicht solltest du dir trotzdem die Zeit nehmen und dich mit unique_ptr vertraut machen. Kompliziert ist das ganze ja nicht.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige