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

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

31

16.02.2012, 12:35

Hier die Ball klasse und CRessorcen m_Ressorcen; erstellt eine instanz von Ressorcen;

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
class CBall
{
    private:
        int m_X, m_Y, m_Farbe;
        float m_AnimX, m_AnimY;
        bool m_Fall;
        bool m_Destroy;
        sf::Sprite m_Sprite_Ball;
        CRessorcen m_Ressorcen;



Und hier die Ressorcen klasse

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
class CRessorcen
{
    private:
        std::map<std::string, sf::Image> m_mMap;
        sf::Image m_Image_Ball_Yellow;
        sf::Image m_Image_Ball_Blue;
        sf::Image m_Image_Ball_Red;

    public:
        CRessorcen ();
        sf::Image &GetImage (std::string string) {return m_mMap.at(string);}
};


So und wenn 1 ball erstellt wird wird doch eine instanz von Ressorcen erstellt. Ressorcen hat 3 Images und bei 2 Bällen währen es doch 2 instanzen von Ressorcen also 6 images?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

32

16.02.2012, 12:41

Ja, so kann das logischer Weise nichts werden, das ist wohl richtig. Es darf nur eine einzige Instanz von Ressourcen geben, die von allen Bällen benutzt wird. Jetzt bitte nicht auf die Idee kommen und einen Singleton oder Static zu bauen, sondern bitte extern eine Ressource anlegen und eine Referenz darauf im Konstruktor an einen Ball übergeben.
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]

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

33

16.02.2012, 12:42

Was ich mich mehr Frage: wozu dienen die hier eig.:

Zitat


sf::Image m_Image_Ball_Yellow;
sf::Image m_Image_Ball_Blue;
sf::Image m_Image_Ball_Red;

Du hast doch deine Map unlängst für die Bilder.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

34

16.02.2012, 12:56

Das ist zwar hier falsch aber damit Architekt weis wofür das gut ist

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
CRessorcen::CRessorcen ()
{
    for (std::map<std::string, sf::Image>::iterator it; it!=m_mMap.end(); it++)
    {
        if (it != m_mMap.find ("Ball_Yellow"))
        {
            m_Image_Ball_Yellow.LoadFromFile ("gfx/Balls/Yellow.png");
            m_mMap["Ball_Yellow"] = m_Image_Ball_Yellow;
        }
        
        if (it != m_mMap.find ("Ball_Blue"))
        {
            m_Image_Ball_Blue.LoadFromFile ("gfx/Balls/Blue.png");
            m_mMap["Ball_Blue"] = m_Image_Ball_Blue;
        }

        if (it != m_mMap.find ("Ball_Red"))
        {
            m_Image_Ball_Red.LoadFromFile ("gfx/Balls/Red.png");
            m_mMap["Ball_Red"] = m_Image_Ball_Red;
        }
    }
}


Habe jetzt erst bemerkt das ich auch direkt das image in die map laden kann.
Aber wie kriege ich nur die Referenz in den Ball?
Ich weis nur wie ich eine Instanz erstellen kann.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

35

16.02.2012, 17:39

Stichworte für Dich: Methode, Pointer/Referenz, Parameter.
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]

storage

Treue Seele

Beiträge: 138

Wohnort: Bad Salzungen

  • Private Nachricht senden

36

16.02.2012, 19:12

Ich habe mich auch mal daran versucht, funktz auch soweit, fange halt keine Fehler ab zur Zeit.
Ach ja fast vergessen du must das ganze nur auf sf::Image umschreiben, da ich schon SFML 2.0 nutze und man dort sf::Texture verwenden muss.

Vielleicht hilft es dir ja weiter.

RessourceMgr.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
#include <string>
#include <map>
#include <iostream>
#include <SFML\Graphics.hpp>


#ifndef RESSOURCEMGR_H
#define RESSOURCEMGR_H

class RessourceMgr
{
private:
    std::string m_TexturePath;
    std::map<std::string, sf::Texture> m_Textures;
    sf::Texture m_Texture;
public:
    RessourceMgr(void);
    ~RessourceMgr(void);
    sf::Texture &GetTexture(const std::string sourceName);
};

#endif


RessourceMgr.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
#include "RessourceMgr.h"


RessourceMgr::RessourceMgr(void)
{
    this->m_TexturePath = "assets\\textures\\";
}


RessourceMgr::~RessourceMgr(void)
{
}

sf::Texture &RessourceMgr::GetTexture(const std::string sourceName)
{
    std::map<std::string, sf::Texture>::iterator it;
    
    it = this->m_Textures.find(sourceName);

    if (it != this->m_Textures.end())
    {
        return it->second;
    }else {
        std::cout << "RessourcenManager: texture " << sourceName << " is not available... try to loading" << std::endl;
    }

    sf::Texture texture;

    if (!texture.LoadFromFile(this->m_TexturePath + sourceName + ".png"))
    {
        std::cout << "RessourcenManager: loading texture " << sourceName << " failed" << std::endl;
    }

    std::pair<std::string, sf::Texture> tex = std::make_pair(sourceName, texture);
    this->m_Textures.insert(tex);

    return this->m_Textures.at(sourceName);
}


Player.h (entspricht bei dir CBall)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <SFML\Graphics.hpp>
#include <SFML\Window.hpp>
#include <iostream>

#ifndef PLAYER_H
#define PLAYER_H

class Player
{
private:
    sf::Sprite m_Sprite;
public:
    Player(void);
    Player(sf::Texture &texture);
    ~Player(void);
    sf::Sprite GetSprite(void);
    void Move(float elapsedTime);
};

#endif


Player.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "Player.h"

Player::Player(void)
{
}

Player::Player(sf::Texture &texture)
{
    this->m_Sprite.SetTexture(texture);
}

Player::~Player(void)
{
}


Hier meine Game Klasse wo ich eine Instanz von Player erzeuge. Somit habe ich nur eine Texture geladen und kann sie unabhängig von einander nutzen.
Game.cpp (Konstruktor)

C-/C++-Quelltext

1
2
this->m_Player = Player(this->ResMgr.GetTexture("player"));
this->m_Player2 = Player(this->ResMgr.GetTexture("player"));


Ich bin jetzt kein super pro wie manch andere hier und es müsste noch ein bisschen was verfeinert werden aber das überlasse ich dann dir.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

37

16.02.2012, 19:26

Komplettlösungen sind hier eigentlich nicht so gern gesehen...

Wenn du eine gibst, dann übergebe das Sprite und Strings bitte als Referenz (auf const).

edit: Ja, mir ist klar, dass du geschrieben hast es sei nicht perfekt. Du musst aber daran denken, dass jemand vielleicht von dem Code "lernen will" und dann etwas falsches lernt.
"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?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (16.02.2012, 19:32)


storage

Treue Seele

Beiträge: 138

Wohnort: Bad Salzungen

  • Private Nachricht senden

38

16.02.2012, 19:33

Meinst du bei meiner Player Klasse?

C-/C++-Quelltext

1
sf::Sprite GetSprite(void);


zu

C-/C++-Quelltext

1
const sf::Sprite &GetSprite(void);

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

39

16.02.2012, 19:50

und bei der GetTexture Methode ;)

Die Regel lautet: Solang er kein eingebauter Typ(Zeiger, int, float, double, char) ist und es keinen Grund gibt es anders zu machen (weil man z.B. sowieso eine Kopie des Objekts benötigt, weil man sie zum Berechnen eines Wertes brauch) wird ein Parameter als konstante Referenz übergeben.
"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?

storage

Treue Seele

Beiträge: 138

Wohnort: Bad Salzungen

  • Private Nachricht senden

40

16.02.2012, 20:08

Ok, danke dir.

Das sind dinge die man zwar schon mal gehört hat aber oftmals vergisst wenn man dinge bastelt weil der Kopf da eh schon rotiert und die Routine fehlt.

Ich habe noch ne Frage zu Map, ich hatte die Textur vorher als Klassenmember im ressourcen Manager und habe sie jetzt als lokale Variable in der Funktion GetTexture eingeführt und diese lokale variable wird ja nachdem verlassen der Funktion zerstört, macht Map wenn ich ein "pair" hinzufüge automatisch eine kopie meines Objektes oder kann es da zu Problemen kommen?

Werbeanzeige