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

09.09.2009, 18:22

[SFML] Sprite in anderer Klasse zeichnen

Soo, mein erster richtiger Beitrag und schon ne Frage...
Ich habe jetzt mit C++ und der SFML angefangen (komme von C#/XNA), und habe schon ein Problem.
Wie kann ich das Zeichnen eines Sprites in einer anderen Klasse als der Main Klasse übernehmen?
Aus XNA bin ich es gewohnt, einer Draw-Methode der Klasse (als beispiel "Roboter") ein "SpriteBatch"-Objekt zu übergeben, aber in der SFML übernimmt ja das RenderWindow das Zeichnen, und dass is "NonCopyable"... Wie also kann ich das am besten machen? Geht das nur, indem ich das Sprite als public deklariere?

Der DANNZ

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

2

09.09.2009, 18:37

Was soll eine Main Klasse in C++ sein? Kannst du ein Code Beispiel geben, das zeigt, was du gerne erreichen möchtest?

3

09.09.2009, 18:48

Jaaaa, main-Methode meine ich^^
Also, in der main-Methode läuft der Window-Loop, und dann habe ich eine Klasse, z.B. Roboter. Und die hat als Member ein Sprite. Jetzt möchte ich das auf de Bildschirm kriegen. Eigentlich ganz einfach^^ Aber das Zeichnen wird ja vom RenderWindow übernommen, wovon die Roboter-Klasse ja nichts weiß. Übergeben kann ich der Roboter-Klasse das RenderWindow aber auch nicht (z.B. in einer Draw-Methode). Wie schaffe ich es jetzt, das Sprite aus der Roboter-Klasse ins RenderWindow zu kriegen :?:

DANNZ

4

09.09.2009, 18:53

Zitat von »"DANNZ"«

Übergeben kann ich der Roboter-Klasse das RenderWindow aber auch nicht (z.B. in einer Draw-Methode).

zeiger oder referenz?

5

09.09.2009, 19:15

Natürlich, ich hab wieder nicht genung C++ig gedacht^^ Wie gsagt ich komme von C#, da brauchte ich keine Zeiger und so... Da muss ich mich erst dran gewöhnen^^ Aber ist ja eigentlich ganz logisch, danke!
Probier ich gleich mal aus...

DANNZ

C--

Alter Hase

Beiträge: 465

Beruf: Schüler

  • Private Nachricht senden

6

09.09.2009, 19:41

Zitat von »"DANNZ"«

Wie gsagt ich komme von C#, da brauchte ich keine Zeiger und so...


Ne, da ist theoretisch jede Objekltvariable (ausser bei structs) ein Zeiger. ;)
Aber man kann auch in unsafe Code bei C# zeiger Benutzen ;)
Ich spreche: C/C++, C++/CLI C#, VBA, VB.NET, Delphi, (HTML, Javascript(bisschen))
------------------------------------------------------------
Hier steht eventuell schon in ein paar Monaten der Link zu meiner Homepage!

return 0;
;)

7

09.09.2009, 19:56

Das zählt nicht! :p
Habs jetzt mit einer Referenz gelöst, aber angezeigt wird immer noch nichts... Mal ein bisschen Code:

Die main-Methode:

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
#include <SFML/System.hpp>
#include <SFML/Graphics.hpp>
#include "Mech.hpp"

int main()
{
    sf::RenderWindow App(sf::VideoMode(800, 600, 32), "SFML Window");
    Mech player;

    player.Load();

    while(App.IsOpened())
    {
        sf::Event mainEvent;
        while(App.GetEvent(mainEvent))
        {
            if(mainEvent.Type == sf::Event::Closed)
            {
                App.Close();
            }
        }

        player.Draw(App);

        App.Clear(sf::Color(211, 211, 211));
        App.Display();
    }

    return 0;
}


Und die Mech-Klasse (Header und Source):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef MECH_HPP_INCLUDED
#define MECH_HPP_INCLUDED

class Mech
{
    private:
        sf::Sprite sprite;
    public:
        Mech();
        void Load();
        void Draw(sf::RenderWindow &app);
};

#endif // MECH_HPP_INCLUDED

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
#include <iostream>
#include <SFML/System.hpp>
#include <SFML/Graphics.hpp>

#include "Mech.hpp"

Mech::Mech()
{
    sprite.SetX(10);
    sprite.SetY(10);
};

void Mech::Load()
{
    sf::Image image;
    image.LoadFromFile("Sprites\\Mech.png");
    sprite.SetImage(image);
};

void Mech::Draw(sf::RenderWindow &app)
{
    app.Draw(sprite);
};


Das Bild wird auch geladen, gezeichnet... Keine sichtbaren Fehler... Aber ich hab ja auch keine Ahnung von der SFML^^

DANNZ

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

8

09.09.2009, 20:32

Zitat

Draw

Clear

Display


die Reihenfolge ist natürlich Schwachsinn.

Erstmal löschen, dann zeichnen, dann darstellen:

Quellcode

1
2
3
4
5
Clear

Draw

Display

9

09.09.2009, 20:40

Oc nein, gleich im ersten Thread so dumm anstellen... :?
Naja, danke, jetzt hats geklappt, mein erster SFML-Kampfroboter wude gezeichnet! *woohoo*

DANNZ

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

Werbeanzeige