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

CodeBase

Treue Seele

  • »CodeBase« ist der Autor dieses Themas

Beiträge: 98

Wohnort: Österreich -> Salzburg

Beruf: Datenbank Entwickler

  • Private Nachricht senden

1

21.04.2011, 10:49

SFML Laden eines Sprites

Hallo Leute,

ich habe ein Problem. Ich möchte gerne ein kleines Spiel schreiben und bin gerade dabei alles aufzuziehen. Das MainWindow geht schon mal und man kann etwas auswählen usw.
Bisher habe ich für diese anzeige immer Schriften genommen, jetzt möchte ich das ganze aber Umbauen damit da Buttons sind. Bisher hat sich die Farbe und die größe der schrift verändert wenn man darüber fuhr und wenn man mit der Maus klickte dann kam man (bisher) in das CreditsFenster oder man konnte das Spiel beenden, soweit so gut. Jetzt dachte ich mir "Ok baust das ganze mal um das da Buttons sind die ihre Farbe verändern wenn man mit der Maus drüber fährt". So habe mir mal schnell einen Button gebaut mit 2 versch. posis, einmal wenn man nicht darüber ist mit der maus und einmal wenn man mit der Maus darüber ist.

so nun wollte ich das ganze meinem ObjectManager mitteilen das er doch bitte jetzt anstelle des Textes ein SpriteObject laden soll und kein TextObject mehr. So jetzt baue ich mir mein Sprite Object zusammen und will es in den ObjectManager laden. Das ganze lässt sich auch anlegen und ist in der ObjectListe vorhanden nur das Bild bleibt weiß. Generell funkt das ganze auch mit der Maske und allem habe das mal schnell in einem ExtraProjekt getestet. Ich weiß einfach nicht wie ich weiter machen soll.

Ich habe dann was gelesen das ich die Referenz oder einen Pointer auf das Image übergeben soll, nur bekomm ich das mit meinem OjkektManager nicht zusammen. Ich muss allerdings gestehen das ich noch nicht sooo der c++ Profi bin ich kann es zwar nur halt nicht perfekt. Ich bin auch so in der Programmierung tätig allerdings PL/SQL und ein bisschen Java und C#.

So hier mal meine Struct plus liste des ObjectManager:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
struct GameObjectList
    {
    int ID;
    std::string szName;
    GameObjectState GameState;
    GameObjectGroup ObjectGroup;
    GameObject ObjectInstance; 
    };

    std::list<GameObjectList> ObjectList;


so wenn ich nun ein Object übergeben will dann rufe ich die Funktion dafür im ObjectManager auf:

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
bool ObjectManager::AddObject(std::string i_szName,
                            GameObjectState i_GameState,
                            GameObjectGroup i_GameObjectGroup,
                            GameObject i_ObjectInstance)
{

    int ObjectId = 0;

    try
    {
    ObjectId = GetNextObjectId();

    GameObjectList GameObject;
     GameObject.GameState = i_GameState;
     GameObject.ID = ObjectId;
     GameObject.ObjectGroup = i_GameObjectGroup;
     GameObject.ObjectInstance = i_ObjectInstance;
     GameObject.szName = i_szName; 


     ObjectList.push_front(GameObject);
    return LIST_SUCESS;

     }catch(int ex)
     {
        return LIST_FAILED;
     }

}


Hier noch die Struct für das GameObject

C-/C++-Quelltext

1
2
3
4
5
6
7
8
struct GameObject
    {
        float height;
        float wide;
        sf::String StringObject;
        sf::Sprite SpriteObject;
        sf::Image ImageObject;
    };


So jetzt rufe ich die Funktion AddObject so auf (dies ist mal für Text)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ObjectManager::GameObject v_GameObject;

    sf:String PrintString;
    sf:Sprite PrintSprite;

        // Begin to Load Objects

        PrintString.SetColor(sf::Color(255,0,0));
        PrintString.SetText(sf::Unicode::Text("Welcome to 2D Paschln"));
        PrintString.SetPosition(190.00f, 50.00f);
        PrintString.SetSize(40.00f);

        

        //Add to List
        v_GameObject.ImageObject = PrintImage;
        v_GameObject.SpriteObject = PrintSprite;
        v_GameObject.StringObject = PrintString;
    
        // Push to List
        m_ObjectManager->AddObject("MAINMENU_TITEL", ObjectManager::GameMainWindow, ObjectManager:StringObject, v_GameObject);


Ich lege also ein Object mit dem Name "MAINMENU_TITEL" an. Diese Object werden dann durch diese Funktion in das RenderWindow geladen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool ObjectManager::LoadObjectInWindow(ObjectManager::GameObjectState i_GameState, sf::RenderWindow *m_Window)
{

    for(std::list<GameObjectList>::iterator it = ObjectList.begin(); it != ObjectList.end(); ++it)
    {
        if(it->GameState == i_GameState)
        {
            
            m_Window->Draw(it->ObjectInstance.SpriteObject);
            m_Window->Draw(it->ObjectInstance.StringObject);
        }
    }   

    return LIST_SUCESS;

}


Das ImageObject habe ich nicht drinne das geht so leider nicht.

naja das Problem ist das die Texte zwar gezeigt werden aber das Bild bleibt weiß. Was muss ich den machen damit das Funktioniert?

Ich brauche da einen Denkanstoß.

Würde mich freuen wenn mir einer Helfen könnte.

lg
Christoph

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

2

21.04.2011, 11:02

du lädst das image ja garnicht, wie soll da was angezeigt werden?^^
schnapp dir lieber nochmal dein buch wenn du in C++ entwickeln willst. an referenzen und zeigern kommst du einfach nicht vorbei. oder wechsel wieder zu C# wenn du keine lust hast das richtig zu lernen.
"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?

CodeBase

Treue Seele

  • »CodeBase« ist der Autor dieses Themas

Beiträge: 98

Wohnort: Österreich -> Salzburg

Beruf: Datenbank Entwickler

  • Private Nachricht senden

3

21.04.2011, 11:06

Achso sry. ich haeb ganz vergessen das mit dem Image zu zeigen ;)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
sf::Image  PrintImage;
        PrintImage.LoadFromFile("D:\\BUTTON_START.png");
  
        PrintSprite.SetImage(PrintImage);
        PrintSprite.SetPosition(310.00f, 250.00f);
        v_GameObject.SpriteObject = PrintSprite;
        v_GameObject.StringObject = DummyString;

        m_ObjectManager->AddObject("MAINMENU_STARTGAME", ObjectManager::GameMainWindow, ObjectManager::SpriteObject, v_GameObject);
        


doch ich will ja c++ lernen und das machen. Ich weiß im Prinzip habe ich es ja schon verstanden ich brauche nur übung und ein bisschen zeit das zu lernen, es ist noch kein Meister vom himmel gefallen ;)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

4

21.04.2011, 11:16

zusammengesetzte datentypen übergibt man in der regel als referenz. versuch dich dran zu halten. das image wird beim verlassen des gültigkeitsbereit wieder freigegeben. sorg dafür, dass es länger erhalten bleibt, aber trenn es vom sprite damit du es mehrfach verwenden kannst. z.b. mit hilfe eines resourcenmanagers. wieso verwendest du so viele structs? versuch deine daten zu kapseln. der code wird viel übersichtlicher wenn du deinen membervariablen einen unterstrich voransetzt.
das kann man alles nachlesen. dir fehlt eher die theorie als die praxis^^
"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?

CodeBase

Treue Seele

  • »CodeBase« ist der Autor dieses Themas

Beiträge: 98

Wohnort: Österreich -> Salzburg

Beruf: Datenbank Entwickler

  • Private Nachricht senden

5

21.04.2011, 11:23

Ok danke dir für den Input ich werde es mal versuchen.
Dann werde ich das ganze mal wieder begraben und beim Hello World anfangen ist wahrscheinlich eh besser
;(

CodeBase

Treue Seele

  • »CodeBase« ist der Autor dieses Themas

Beiträge: 98

Wohnort: Österreich -> Salzburg

Beruf: Datenbank Entwickler

  • Private Nachricht senden

6

21.04.2011, 15:08

Habs jetzt geschafft. Das laden übernimmt jetzt mein ObjectManager
lg

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

7

21.04.2011, 16:57

der code wird viel übersichtlicher wenn du deinen membervariablen einen unterstrich voransetzt

Damit musst du aber aufpassen.
Ich zitiere den C++ Standard(17.4.3.1.2)

Zitat von »C++ Standard«

Each name that contains a double underscore (_ _) or begins with an underscore followed by an uppercase
letter (2.11) is reserved to the implementation for any use.
Each name that begins with an underscore is reserved to the implementation for use as a name in the
global namespace.165)


Dem Unterstrich darf bei einer Membervariable also kein Großbuchstabe folgen. Ich persönlich stetz den Unterstrich immer hinten ran, das ist ebenso übersichtlich und gefahrlos.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

8

21.04.2011, 17:51

gut zu wissen^^ danke
ich hab aber schon vorher mit kleinbuchstaben angefangen :D

edit:vertippt
"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« (21.04.2011, 21:36)


Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

9

21.04.2011, 21:26

@Nacho:
Ich würds eher allgemein halten: Der Code wird viel übersichtlicher, wenn Attribute anderen Namenskonvetionen folgen, als parameter oder lokale variablen...

Mit einem Unterstrich is nämlich, wie Fred schon zitiert hat, nicht gewährleistet, dass der code mit jedem Compiler kompiliert und 2. reine geschmackssache. Ich krieg zum Beispiel immer das kotzen, wenn ich variablen sehe, die mit einem unterstrich anfangen...

CodeBase

Treue Seele

  • »CodeBase« ist der Autor dieses Themas

Beiträge: 98

Wohnort: Österreich -> Salzburg

Beruf: Datenbank Entwickler

  • Private Nachricht senden

10

22.04.2011, 08:00

Hallo Leute,

ich glaube mir ist gestern das Licht aufgegangen bezüglich Klassen usw. ICh weiß ihr kennt euch alle schon besser aus damit usw. aber jeder hat mal angefangen und ich würde euch bitten nicht zu hart mit mir ins Gericht zu fahren. Also wenn ich jetzt zb. in meinem Spiel einen Button anlegen will dann mach ich das so.

Ich lege mir eine Klasse mit dem Namen Button an, die könnte ihn etwa so aussehen

Button.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
#include "stdafx.h"

class Button
{
public:

Button(const std::string &ImageFile);
Button(void);
~Button(void);

sf::Sprite GetSprite(void);

private:

sf::Image ButtonImage;
sf::Sprite Sprite;


};


Button.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "Button.h"

Button::Button(const std::string &ImageFile)
{
ButtonImage.LoadFromFile(ImageFile);
Sprite.SetImage(ButtonImage);
}

Button::Button(void)
{
}

Button::~Button(void)
{
}

sf::Sprite Button::GetSprite()
{
return Sprite;
}


in meinem ObjectManager lege ich nun einen Struct fest damit ich das ganze speichern kann.

weiters kommt noch eine List dazu damit ich später durchsuchen kann

C-/C++-Quelltext

1
2
3
4
5
6
7
struct TButton
{
std::string v_ButtonName;
Button *v_ButtonObject;
};

std::list<TButton> ButtonList;


So nun schreibe ich eine Funktion in meinem ObjectManager

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
bool ObjectManager::CreateButton(std::string i_szButtonImageFile, std::string i_szButtonName)
{
Button *_Button = new Button(i_szButtonImageFile);
TButton _TButton;

_TButton.v_ButtonName = i_szButtonName;
_TButton.v_ButtonObject = _Button;

ButtonList.push_front(_TButton);

return LIST_SUCESS;

}


die Funktion kann ich dann so aufrufen:

C-/C++-Quelltext

1
CreateButton("TestSprite.png", "TestButton");


der Überladene Konstruktor der Klasse Button wird aufgerufen und das Bild geladen. Nachdem das alles geschehen ist speicher ich mir noch den Namen und den Zeiger auf das Objekt in der Liste und fertig.

Wenn ich jetzt den Button zeichnen will dann gehe ich einfach in meine Liste und rufe die Funktion getSprite der Klasse auf.

C-/C++-Quelltext

1
2
3
4
    for(std::list<TButton>::iterator it = ButtonList.begin(); it != ButtonList.end(); ++it)
    {
        m_Window->Draw(it->v_ButtonObject->GetSprite());
    }


Habe ich das so richtig verstanden ??

lg

ps: natürlich fehlen in der Klasse Button noch Funktionen wie SetPosition oder SetSubRect oder dergleichen aber mal nur ob ich mal das Prinzip verstanden habe

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »CodeBase« (22.04.2011, 08:07)


Werbeanzeige