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

Werwofl

Treue Seele

  • »Werwofl« ist der Autor dieses Themas

Beiträge: 100

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

1

28.09.2011, 14:25

Tile-Map ist langsam

Bei mir gibt es eine "Welt" die aus TileMaps besteht. Man sieht immer nur die momentane TileMap.

Jede TileMap besteht mir im Projekt in einer sepearten Datei: 2 Dateien = 2 TileMaps 3 Dateien = 3TileMaps usw. .
Jede TileMap beseht aus einem 5x5 Gitter aus chars.

T.T.T.
TTTTT
.....
T.T.T.
T.T.T.

Dieses char wird dem Tile selbst übergeben und das entsprechend Bild für das Sprite wird dann geladen.

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
void TileMap::loadDataFromFile(std::string fileName){
    std::ifstream file(fileName.c_str());
    if(!file.is_open()){
        std::cout<<"Datei konnte nicht geöffnet werden"<<std::endl;
    }
    std::string line;
    
    sizeTileMap();
    int y = 0;
    int x = 0;
    
    while(!file.eof()){                                                         //quasi y
        std::getline(file,line);
        for (std::string::iterator i = line.begin(); i != line.end(); i++){     //quasi 
           tileMap[y][x].loadImage("world_ground.png");
           tileMap[y][x].setTile(*i);
           tileMap[y][x].getSprite().SetPosition(x*128,y*128);
            x++;
        }
        x=0;
        y++;
    }
    file.close();
}

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

2

28.09.2011, 15:09

du hast zwar geschrieben, dass die Tile-Map langsam sei, aber was meinst du mit langsam?
lädt sie langsam? (das würde ich aufgrund des Quelltextes vermuten)
wenn ja: wie lange dauert es denn, eine Tile Map zuu laden? (also ein Funktionsdurchlauf)

hat es einen Grund, warum du ein und die selbe Bilddatei jedes Mal erneut lädst?
da sie in deinem Programm/Spiel vermutlich nicht bearbeitet wird, wirst du wohl nur 1 Kopie im Arbeitsspeicher benötigen (undn nicht 25)
da die Zeichen (warum auch immer...) den Index für ein Teilbild des geladenen Bildes darzustellen scheinen, handelt es sich dabei wohl um ein Chipset/Tileset

den 3. Schritt der for-Schleife kann ich auch nicht ganz nachvollziehen, da man beim durchgehen aller Felder (beim Zeichnen) weiß, an welcher Stelle sich diese im Array befinden

ich weiß nicht, ob es in C++ auch möglich ist, aber du könntest das x++ hinter das i++ setzen (ich finde ein solches "i++, x++" etwas hübscher ^^)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Werwofl

Treue Seele

  • »Werwofl« ist der Autor dieses Themas

Beiträge: 100

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

3

28.09.2011, 15:30

Also nein sie lädt nicht langsam, während der laufzeit sondern beim initialen Start. Die komplette Welt ist noch nicht groß, aber was noch nicht ist kann ja noch werden. Deswegen bin ich eher auf die Frage hinaus ob das wirklich normal ist das man so lange lädt.

Der Grund dafür das ich jedes mal die Bild-Datei neulade ist da jedes Tile ein eigenes Sprite (und somit auch ein Image) besitzt. Da das sfml-Sprite eine Referenz übergeben bekommt weiß ich nicht wie sich das ganze mit dem sf::SubRect verhält, müsste ich evtl. mal ausprobieren.

P.S.: Die Welt besteht aus einem 5x5 TileMap-Gitter und die TileMaps aus einem 5x5 Tile Gitter. :P

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Werwofl« (28.09.2011, 15:36)


Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

4

28.09.2011, 15:44

Sprite...
Sprites sind nicht dafür gedacht, dass damit die Map geladen/erstellt/gespeichert/... wird
dafür solltest du dir etwas anderes ausdenken, was aber auch sehr simpel sein dürfte
ich habe das bisher immer so gemacht, dass ich in einem 2 Dimensionalem Array (hast du ja auch) die Position der Tiles in dem Tileset für jedes einzelne Feld gespeichert habe (also ein 2-dimensionales Ganzzahlen-Array) und zusätzlich das Tileset
(dadurch wird dann das Problem behoben, dass dein Tileset 25 Mal geladen wird)

Sprites sind dafür da, damit man mit diesen Figuren einfacher im Spiel verwalten kann
(um ehrlich zu sein habe ich dafür bisher nie vorgefertigte Mittel verwendet, sofern diese aber deinen Ansprüchen (nicht für die Maps!) genügen, kannst du sie ruhig verwenden)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

5

28.09.2011, 15:50

du lädst pro tile die png-datei neu - das solltest du nur einmal machen ;) benutzt du sfml?

6

28.09.2011, 15:55

sf::Image bzw. seit kurzer Zeit sf::Texture ist nicht umsonst von sf::Sprite getrennt. Das Image bzw. die Textur musst du nur ein einziges mal laden (sofern du sie nicht irgendwie bearbeiten willst) und kannst dann beliebig viele Sprites erstellen, die dieses Image benutzen. Das Subrect gibt an, welcher Teil des Images vom Sprite repräsentiert wird. Ob das Image jetzt als Referenz übergeben wird oder nicht ist dabei egal.

Lg

Werwofl

Treue Seele

  • »Werwofl« ist der Autor dieses Themas

Beiträge: 100

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

7

28.09.2011, 19:50

@TrommlBomml: Jo, ganz genau;)

Ja ok wenn das so ist werd ich das wenn ich Zeit habe so implementieren.

Kurz Frage nochmal: Kann ich den jetzt Sprites für die Tiles benutzen oder wie Scaladur schreibt lieber nicht? Ich wüsste nämlich nicht wie ich mit der SFML das realisiere :P

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

8

28.09.2011, 20:00

Wieso nicht einfach die Image Klasse benutzen?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werwofl

Treue Seele

  • »Werwofl« ist der Autor dieses Themas

Beiträge: 100

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

9

28.09.2011, 20:45

Wieso nicht einfach die Image Klasse benutzen?

Hm, weil das meines Erachtens nicht funktioniert, wenn nicht belehr mich bitte eines besseren :P

C-/C++-Quelltext

1
2
3
4
5
sf::Image myImage;
if(myImage.LoadFromFile("player.png")){
     std::cout<<"nope"<<std::endl;
}
gameWindow.Draw(myImage);


sf::Image ist ja blöderweise nicht Drawable.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

10

28.09.2011, 21:05

Zwei Threads grundsätzlich zum Thema:
Tile (Engine?) mit SFML
Benötige Denkanstöße für 2D TileEngine

Und ich glaub das müsste passen wegen deinem sf::Image Problem:
http://www.dreamincode.net/forums/topic/…scratch-part-2/
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige