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

23.02.2012, 12:47

SFML 1.6: Resourcenmanager sf::Image, sf::Sprite frage zum Handling

Hallo zusammen,

mich Quält jetzt schon seit längerer Zeit eine Frage zu einem Resourcenmanager und dem Handling mit diesen, in Bezug auf sf::Image, sf::Sprite. Es klappt zwar bei mir aber ein gewisser Punkt will mir nicht ganz einleuchten und ich denke irgendwo mache ich in meinem Code noch einen Fehler. Ich erklär es am besten mal mit den dazupassenden Codeausschnitten.

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
#ifndef IMAGEMANAGER_HPP
#define IMAGEMANAGER_HPP

#include <SFML\Graphics.hpp>
#include <string>
#include <map>

class c_ImageManager 
{
    private:

        std::map    < std::string, sf::Image >  ImageMap;
        std::map    < std::string, sf::Image >::iterator im;

    public:

        sf::Image get_image(const std::string &data)
        {
            im = ImageMap.find(data);

            if ( im == ImageMap.end() )
            {
                sf::Image load;

                im = ImageMap.insert ( std::make_pair ( data, load ) ).first;

                if ( !im->second.LoadFromFile(data) )
                {

                }
            }

            return im->second;
        }

        void Release_Image(const std::string &data);
        void Release_All_Images();
};

#endif IMAGEMANAGER_HPP


Hier erstelle ich den RescourcenManager, wo ich mir nicht ganz sicher bin ob das alles so passt, aber weiter gehts.


C-/C++-Quelltext

1
2
3
4
5
6
class c_framework
{
    public:

        c_ImageManager imanag;
}


In dieser Klasse erstelle ich den ImageManager den ich dann zusammen mit dem Framework Header rumreiche.


C-/C++-Quelltext

1
2
3
4
5
6
class c_mineshaft_01_battle
{
    private:

        c_framework &framework;
}


In der Klasse wo ich den Image Manager verwenden will habe ich dann eine Referenz auf das Framework.

C-/C++-Quelltext

1
2
3
4
c_mineshaft_01_battle::c_mineshaft_01_battle(c_framework &framework) : framework (framework)
{

}


Welches mit der Intilisierungsliste mit dem Framework verknüpft wird.


C-/C++-Quelltext

1
2
3
4
sf::Image &Image = framework.imanag.get_image("background.png");

sf::Sprite background(Image);
background.SetPosition(0.f, 0.f);


Wenn ich dann das Image wie hier aufgeführt verwende klappt alles und so läuft das Programm auch tadellos. Was mir dabei aber nicht sonderlich gefällt ist, das ich zuerst eine Referenz Image erstellen muss und das dann erst an das Sprite zu übergeben.


C-/C++-Quelltext

1
2
3
sf::Sprite background(framework.imanag.get_image("background.png"));

background.SetPosition(0.f, 0.f);


oder


C-/C++-Quelltext

1
2
3
4
5
sf::Sprite background;
background.SetImage(framework.imanag.get_image("background.png"));


background.SetPosition(0.f, 0.f);


Wenn ich es dann auf eine dieser beiden Varianten Probiere, erhalte ich nur ein weißes Sprite. Meine Frage ist jetzt nun, warum ist das so, warum klappt es über das Referenz Image, wenn ich es aber gleich zuweiße geht es nicht. Bzw. was müsste ich Ändern damit das auch Funktioniert, wo habe ich da einen Denkfehler in meinem Code? Ich komme zwar mit der andere Variante auch einigermaßen Zurecht aber sie hat mir bis jetzt doch einiges Schwieriger gemacht.

Da ich auf Arbeit bin kann ich bei evtl. Fragen wahrscheinlich erst heute Abend antworten. Aber Hoffe ich habe es ausführlich genug erklärt.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

23.02.2012, 12:50

Kurz überflogen: Du musst get_image auch eine Referenz zurückgeben lassen.

Gibt er dir in dieser Zeile keine Warnung aus?
sf::Image &Image = framework.imanag.get_image("background.png");

Und wieso ist imanag als public deklariert?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

3

23.02.2012, 13:09

Hmm das mit der Referenz muss ich heut Abend mal Probieren.

Bei der von dir erwähnten Zeile bekomme ich auch keine Warnung, da ich
doch mehrere Images so zuweise hätte mir das aufallen müssen. Zur Info
ich benütze Visual Studio 2010 Express Edition.

Imanag hatte ich public gemacht damit ich einfacher darauf zugreifen
kann. Denke mal mein "framework.imanag." würd sonst nicht mehr ohne
Zugriffsfunktion dann funktionieren. Aber man muss auch sagen das es
mein erstes ausführlicheres Programm ist, deswegen bin ich vllt mit der
Handhabung von manchen Stellen noch nicht so sicher.

Danke schonmal fürs Helfen.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

23.02.2012, 13:15

Dann schreibst du halt eine Methode imanag, die eine Referenz zurück gibt und kannst über framework.imanag(). zugreifen.
Was hast du davon? Naja, stell dir vor du musst/willst imanag durch einen Zeiger ersetzen weil du den Speicher dynamisch verwalten willst. Wenn du ein größeres Programm hast musst du vielleicht an zehn oder mehr stellen aus "framework.imanag.", "framework.imanag->" machen.
Machst du es per Zugriffsmethode musst du nur in der Methode dereferenzieren und im restlichen Programm ändert sich nichts. Ein gutes Beispiel für den Nutzen von Zugriffsmethoden.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

5

23.02.2012, 14:24

Vielleicht hilft dir dieser Artikel etwas weiter, der beschreibt wie man einen solche Image-Manager bspw. implementieren könnte: https://github.com/LaurentGomila/SFML/wi…ialImageManager

6

23.02.2012, 18:41

Danke, das mit der Referenz hat einwandfrei geklappt und ich schlag mich hier seit Weihnachten mit dem hier so rum. Das macht mir doch einiges einfacher. Ich hatte zwar ein paar Vorlagen als ich ihn erstellt hatte, aber irgendwo ist mir das wohl untergegangen, vorallem da ich bei so manchem Code aus ihnen nicht so ganz schlaugeworden bin. Waren auch meine ersten Schritte mit der Graphik Darstellung gewesen.

Das mit dem Imanag stimmt, hab ich sicher auch schon über 10x verbaut und tendenz steigend. Denke zwar nicht das ich es für das Projekt umbauen werde, aber für spätere kommende Projekte könnte ichs aufjedenfall auch jetzt schon richtig machen, wer weiß was da noch auf mich zukommt. ^^

Aber denke da verbirgt sich noch so mancher kleiner Stolperstein, kommt davon wenn man nicht ganz so klein Anfangen will und doch etwas Umfangreicher plant. Aber soweit klappt das meiste ziemlich gut, soweit ich das momentan abschätzen kann.

@Fred

Danke für den Link, kann ich gut gebrauchen und mir sicher noch ein paar hilfreiche Infos rausholen.

Werbeanzeige