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

moritz31

Treue Seele

  • »moritz31« ist der Autor dieses Themas

Beiträge: 259

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

11

02.08.2016, 17:39

also die Klasse sieht so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class TileMap : public sf::Drawable
{
private:
    mutable sf::Sprite tile;
    sf::Texture tileTexture;
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const;
    int field[10][10];

    int width;
    int height;

public:
    TileMap();
    ~TileMap();

    sf::Sprite* getTile();
    void loadTileTexture(std::string path);

    
};


Die Funktion draw um die es ja eigentlich geht so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void TileMap::draw(sf::RenderTarget& target, sf::RenderStates states) const {

    tile.setTexture(this->tileTexture);
    tile.setTextureRect(sf::IntRect(0, 0, 95, 95));

    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {
            switch (this->field[x][y])
            {
            case 0:
                tile.setPosition(sf::Vector2f(x * 95, y * 95));
                target.draw(this->tile);
                break;
            default:
                break;
            }
        }
    }

}


Ist jetzt eigentlich nur ne einfache Funktion die das Tile überall hinsetzt und zeichnet.

12

02.08.2016, 18:20

Das const am Ende de Funktion draw sagt aus das Innerhalb der Methode nichts geändert werden darf (Klassenmember).
Du änderst ab fleißig Werte (der Klassenmember) innerhalb der Methode.

Dann ist klar das der Compiler mekert. Dafür ist aber auch die Update-Methode gedacht, da werden alle Berechnungen durchgeführt.

Edit: Ich würde Tile als Extraklasse machen, die dann auch ein sf::Sprite haben. Auch würde ich von einem festen Array weggehen hin zu einem Vector.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

moritz31

Treue Seele

  • »moritz31« ist der Autor dieses Themas

Beiträge: 259

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

13

03.08.2016, 21:45

Natürlich ist das Array nur ein Platzhalter zum schnellen testen, wird später ausgetauscht.
Warum genau würdest du Tile nochmal als Extraklasse machen ? Hätte das irgendwelche Vorteile?

Und klar verändere ich in Draw etwas. Der Vorteil der Tilemap ist ja das ich nur ein Tilehabe, dass ich an verschiedenen stellen zeichne, von daher kann man das doch auch gar nicht in die update packen oder ?
Der Vorgang ist ja im Prinzip Update -> Draw -> Update -> Draw -> Update -> Draw (wobei jedes Update hier das neue setzten des Tiles darstellt).

Gruß
;oritz

14

04.08.2016, 01:03

Warum genau würdest du Tile nochmal als Extraklasse machen ?
In der Regel möchtest du ein Tile nicht nur Zeichnen, sondern auch andere Information hinterlegen z.B. Tile ist Begehbar oder nicht und noch andere Sachen.

Der Vorteil der Tilemap ist ja das ich nur ein Tilehabe,
In wie weit ist das ein Vorteil? Stell dir mal vor wie deine Draw-Methode ausschaut, wenn wir hier über 100 oder mehr verscheiden aussehende Tiles sprechen.

Der Vorgang ist ja im Prinzip Update -> Draw -> Update -> Draw -> Update -> Draw (wobei jedes Update hier das neue setzten des Tiles darstellt).
Du hattest nach einer Sauberen Lösung gefragt, das ist eine. Zu dem muß die Position nicht immer neu gesetzt werden wenn es in einer Extraklasse ausgelagert ist.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

moritz31

Treue Seele

  • »moritz31« ist der Autor dieses Themas

Beiträge: 259

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

15

04.08.2016, 08:55

also könnte ich quasi so etwas wie myTile.getTileAtPos(x,y) machen, dann in der Klasse die Position des Sprites setzen und das dann an meine Draw Methode returnen ?

Würde dann quasi in etwa so Aussehen,

Quellcode

1
2
newTile = myTile.getTileAtPos(x,y);
target.draw(newTile);

16

04.08.2016, 12:25

Wie wäre es mit sowas?

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
class Tile : public sf::Drawable
{
privat:
    sf::Sprite m_sprite;
    sf::Vector2i m_mapPosition;
...
public:
    Tile(const sf::Vector2i& mapPosition,
         const sf::Texture& texture,
         const sf::IntRect& textureRect);
    void update();
    void draw(sf::RenderTarget& target, sf::RenderStates states) const;
};

class TileMap
{
private:
    std::vector<Tile> m_tiles;
public:
    TileMap();
    void update();
    void draw(sf::RenderTarget& target, sf::RenderStates states) const
    {
         for(auto it = begin(m_tiles); it != end(m_tiles); ++it)
             it->draw(target);
    }

};
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

moritz31

Treue Seele

  • »moritz31« ist der Autor dieses Themas

Beiträge: 259

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

17

04.08.2016, 18:07

Danke :) hab das jetzt auch so in der Art Umgesetzt und funzt wunderbar

Werbeanzeige