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

1

02.05.2013, 16:10

[C++ - SFML] Sprites auf X- oder Y- Achse wiederholen (eine Instanz).

Guten Tag,

ich arbeite momentan an einer TileMap. Es geht um die Wiederholung von Sprites in der X- und/oder Y-Achse.
Die Bedingung für die Wiederholung wird in der Level-Datei beim Einlesen festgelegt.

Da ich alles so effizient wie möglich halten möchte, würde ich nur ungern für jede Position ein Sprite definieren, wenn feststeht dass diese wiederholt werden kann/wird. Die Idee ist, direkt vor dem Aufruf der "draw()" Funktion, einmal setPosition() aufzurufen.

Mein Code, für die Schleifen und das Zeichnen sieht folgendermaßen aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for (int x = 0; x < mapSize.x; x++)
    {
        for (int y = 0; y < mapSize.y; y++)
        {
            for (int z = 0; z < layerCount; z++)
            {
                for (int i = 0; i < sprites.size(); i++)
                {
                    if (sprites[i]->getLayer() == z && sprites[i]->isRepeated())
                    {
                        sprites[i]->setPosition(x * sprites[i]->getSize().x, y * sprites[i]->getSize().y);
                        Manager::ScreenMngr::draw(*sprites[i]);
                    }
                }
            }
        }
    }




Leider bleibt das Fenster schwarz.
Beim Debuggen war die Textur gültig, d.h. daran kann es schon mal nicht liegen.
Wäre nett, wenn mir jemand einen Denkanstoß geben könnte, ich steh gerade nach einer langen Nacht völlig auf dem Schlauch :).
Vielen Dank!


infected1


Nimelrian

Alter Hase

Beiträge: 1 216

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

  • Private Nachricht senden

2

02.05.2013, 16:23

Bei Tilemaps mit der SFML2 gibt es ein Zauberwort: VertexArray :)
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

3

02.05.2013, 16:24

An Deiner Stelle würde ich den Debugger anwerfen, in Zeile 11 einen Breakpoint setzen und mit dann anschauen, was da als Koodinaten rauskommt.
Fehlt Dir ansonsten eventuell ein passender View oder ein .display() ?
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]

4

04.05.2013, 11:34

Guten Morgen, vielen Dank für die schnellen Antworten.
Es hat funktioniert, nachdem ich das .display() an einer anderen Stelle aufgerufen habe.
Bin dann trotzdem auf sf::VertexArray umgestiegen, gibt ja momentan ein Tutorial speziell für TileMaps.
Auch wenn das vielleicht nicht ganz hier reingehört, hoffe ich dass es okay ist.

Im Tutorial speichert folgender Code, einen Zeiger.

C-/C++-Quelltext

1
2
       // get a pointer to the current tile's quad
       sf::Vertex* quad = &m_vertices[(i + j * width) * 4];


Mein Ausgangspunkt ist, dass ich ein sf::VertexArray hab, welches zur Laufzeit erzeugt wird.

C-/C++-Quelltext

1
sf::VertexArray *tempMap = new sf::VertexArray;


Folgender Code, wird bei mir nicht kompiliert.

C-/C++-Quelltext

1
2
// Zeiger auf aktuellen sf::Quad.
sf::Vertex* quad = &tempMap[(x + y * mapSize.x) * 4];


Mit der Fehlermeldung kann ich leider nicht viel anfangen.

Quellcode

1
    1   IntelliSense: Ein Wert vom Typ ""sf::VertexArray *"" kann nicht zum Initialisieren einer Entität vom Typ ""sf::Vertex *"" verwendet werden.


Hat vielleicht jemand einen Denkanstoß? Übersehe ich vllt. etwas?!

Viele Grüße
infected1

Fourb

Treue Seele

Beiträge: 122

Beruf: Schüler

  • Private Nachricht senden

5

04.05.2013, 12:03

Ich arbeite jetzt zwar nicht viel mit den VertexArrays von SFML, aber ich kann dir schon mal sagen, dass du Pointer tunlichst vermeiden solltest.
Probiers einfach mal ohne.. Allein beim Schlüsselwort "new" bekomm ich krämpfe.
42 / Pi = 13,37

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

04.05.2013, 12:10

Das Problem ist, dass dein tempMat ein sf::VertexArray* ist und kein sf::VertexArray. Überleg mal, was tempMat[bla] bei dir also genau tun wird...

[...] aber ich kann dir schon mal sagen, dass du Pointer tunlichst vermeiden solltest.

Gibt's dafür auch einen Grund? Ich find Pointer eigentlich ganz praktisch... ;)

Probiers einfach mal ohne..

Hast du vielleicht einen konkreten Vorschlag wie man das hier am besten machen würde?

Allein beim Schlüsselwort "new" bekomm ich krämpfe.

Ja, das new hier ist vermutlich keine gute Idee, da hast du wohl recht.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

7

04.05.2013, 12:12

[...]dass du Pointer tunlichst vermeiden solltest.

Generell? :huh:
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Fourb

Treue Seele

Beiträge: 122

Beruf: Schüler

  • Private Nachricht senden

8

04.05.2013, 13:19

Meiner Meinung nach geht auch viel ohne Pointer. Ich hab nie gute Erfahrungen damit gemacht, weil ich immer diesen dummen Stern vergesse. Natürlich ist es manchmal nicht umgänglich, zumindest benutzt ich ihn doch ab und zu.

Ehm ja..
42 / Pi = 13,37

9

04.05.2013, 13:45

Ich würde Krämpfe kriegen, gäbe es keine Pointer. Ich vermeide sogar Smartpointer nur um mehr Spaß zu haben.

10

05.05.2013, 17:59

Hm,
der Grund wofür ich ein dynamisches VertexArray brauche ist die Tatsache, dass ich ein

C-/C++-Quelltext

1
std::vector<sf::Drawable*>
habe.
Diesen Vector übergebe ich an die Zeichnen-Funktion. Würde ich das VertexArray auf dem Stack erstellen, würde es nachdem es den Gültigkeitsbereich verlassen hat, ja zwangsläufig "aufgeräumt". Kennt jemand für dieses Problem eine Lösung?!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »infected1« (05.05.2013, 18:47)


Werbeanzeige