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

06.10.2014, 11:07

[SFML][C++]RenderWindow schließt sich

Hey,
ich lerne zur Zeit C++ und wollte mal zur Abwechslung ein kleines einfaches Spiel mit SFML programmieren. Ich habe mir auf YouTube ein Video über SFML angeguckt. Nur leider bugt es anscheinend bei dem RenderWindow: Wenn ich das Programm starte, erscheint die Konsole und das Framework. Nur dann schließen sie sich sofort wieder. Wenn ich die Konsole mit getchar(); offen halte, ist das Framework weiß, obwohl ich es grün sein sollte, ich kann es nich bewegen und nicht schließen. In dem Video hat das Framework die vorgegebene Farbe und reagiert, obwohl ich es so gemacht habe wie im Video.
Hier der Link zu dem Video https://www.youtube.com/watch?v=OWQmYfuEJXE
L.G. Thun3r
Framework.hpp

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

#include <iostream>
#include <SFML/Graphics.hpp>

class Framework {
public:
    
    Framework();
    ~Framework();

    void run();

private:

    void update();
    void handleEvents();
    void render();

    void quit();
    
    sf::RenderWindow    *pRenderWindow;
    sf::Event           *pMainEvent;

    bool                mRun;

};


#endif

Framework.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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "Framework.hpp"



Framework::Framework(){

    pRenderWindow       = new sf::RenderWindow(sf::VideoMode(600, 800, 32), "Spiel");
    pMainEvent          = new sf::Event;

    bool mRun           = true;

}

Framework::~Framework(){
}



void Framework::run(){

    while (mRun == true) {

        update();
        handleEvents();
        render();

        quit();

    }

}


void Framework::update(){
}

void Framework::handleEvents(){

    while (pRenderWindow->pollEvent(*pMainEvent)) {
        if (pMainEvent->type == sf::Event::Closed)
            mRun = false;
    }

}

void Framework::render(){

    pRenderWindow->clear(sf::Color::Green);
    pRenderWindow->display();

}



void Framework::quit(){

    if (mRun == false)
        pRenderWindow->close();

}

main.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <SFML/Graphics.hpp> 

#include "Framework.hpp"


int main() {
    
    Framework frmwrk;

    frmwrk.run();
    

    
    return 0;
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

06.10.2014, 11:22

bool mRun = true; Das ist falsch. Du erzeugst damit eine neue lokale Variable innerhalb des Konstruktors, die nur dort gilt und die *nichts* mit dem Attribut der Klasse zu tun hat, außer dass sie auch so heißt.
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]

3

06.10.2014, 11:27

Vielen Dank,
hat geklappt :)
L.G.

4

06.10.2014, 16:33

Muss die sf::RenderWindow Instanz wirklich aufm Heap liegen?
Wozu ist eine weitere, auf dem Heap liegende sf::Event Instanz da? Warum nicht als temporäre Variable einfach vor dem pollEvent-Aufruf? Solltest du die Events speichern wollen, müsstest du sowieso einen Vektor anlegen, ansonsten hat die Instanz immer nur das zuletzt geschehene Event gespeichert.
Warum kein std::unique_ptr?

MfG
Check

5

06.10.2014, 17:12

Muss die sf::RenderWindow Instanz wirklich aufm Heap liegen?
Wozu ist eine weitere, auf dem Heap liegende sf::Event Instanz da? Warum nicht als temporäre Variable einfach vor dem pollEvent-Aufruf? Solltest du die Events speichern wollen, müsstest du sowieso einen Vektor anlegen, ansonsten hat die Instanz immer nur das zuletzt geschehene Event gespeichert.
Warum kein std::unique_ptr?

MfG
Check

Ich lege das sf::RenderWindow auch immer auf dem Heap ab, weil wenn ich eine normale Instanz mache (also kein Zeiger) dann bekomme ich irgendeinen Fehler mit sf::NonCopyable.

6

06.10.2014, 17:49

So einen Fehler bekommt man eigentlich nur, wenn man eben versucht dieses NonCopyable Objekt zu kopieren....
Also folgendes funktioniert zum Beispiel sehr gut, eben erst auch mal mit g++ kompiliert:

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <SFML/Graphics/RenderWindow.hpp>
#include <SFML/Window/Event.hpp>
#include <SFML/System/Clock.hpp>

class Application
{
public:
    Application() = default;
    Application(const Application&) = delete;
    Application& operator=(const Application&) = delete;

    int main(const std::vector<std::string>& arguments);

private:
    bool run(const sf::Time& step){/*do base-stuff*/}
    void readArguments(const std::vector<std::string>& /*arguments*/){/*read commandline parameters*/}
    void handleEvents();
private:
    sf::RenderWindow _renderApp {sf::VideoMode(800U, 600U), "sppro rulez!1!"};
};

int Application::main(const std::vector<std::string>& arguments)
{
    readArguments(arguments);
    sf::Clock clock;
    sf::Time timeSinceLastUpdate;
    while(_renderApp.isOpen())
    {
        timeSinceLastUpdate += clock.restart();
        handleEvents();

        while(timeSinceLastUpdate > sf::seconds(1.f / 60.f))
        {
            timeSinceLastUpdate -= sf::seconds(1.f / 60.f);
            handleEvents();
            run(sf::seconds(1.f / 60.f));
        }

        _renderApp.clear();

        _renderApp.display();
    }

    return 0;
}

void Application::handleEvents()
{
    sf::Event event;
    while(_renderApp.pollEvent(event))
    {
        if(event.type == sf::Event::Closed)
            _renderApp.close();
    }
}

int main(int argc, char** args)
{
    std::vector<std::string> arguments;

    for(int i = 1; i < argc; ++i)
        arguments.push_back(args[i]);

    Application app;
    return app.main(arguments);
}


MfG
Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

06.10.2014, 18:24

Kopieren heißt in diesem Zusammenhang auch es als Parameter an eine andere Methode zu übergeben ohne dabei eine Referenz zu verwenden. Das ist natürlich keine gute Idee und von daher ist zumindest an dieser Stelle SFML sehr ordentlich und verhindert das gleich. Übergibt man Referenzen oder Pointer, tritt das Problem natürlich gar nicht erst auf, weil das Fenster nicht kopiert wird.
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]

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

8

06.10.2014, 19:08

Muss die sf::RenderWindow Instanz wirklich aufm Heap liegen?
Wozu ist eine weitere, auf dem Heap liegende sf::Event Instanz da? Warum nicht als temporäre Variable einfach vor dem pollEvent-Aufruf? Solltest du die Events speichern wollen, müsstest du sowieso einen Vektor anlegen, ansonsten hat die Instanz immer nur das zuletzt geschehene Event gespeichert.
Warum kein std::unique_ptr?

MfG
Check


Darum:
Hey,
ich lerne zur Zeit C++ und wollte mal zur Abwechslung ein kleines einfaches Spiel mit SFML programmieren.


Die wenigsten Quellen sind aktuell was das angeht und das Video-Tutorial, das er da hat, ist halt ein typisches Video Tutorial.


@TE:
Ich rate dir zu diesem SFML Game Development Buch(auf Packthub), da lernst du SFML direkt ordentlich und einigermaßen aktuell und noch dazu auf (fast) neuestem C++-Standard.
WIP Website: kevinheese.de

9

06.10.2014, 20:53

Auf der einen Seite räts du ihm zu dem Buch, auf der anderen Seite machst du klar, dass sein Stand nicht ausreiche um sich smart_pointer zuzuführen. (ja, das waren rhetorische Fragen :))
Das Buch wird eher überfordernd sein. Grundsätzlich ist aber dazu zu raten, man sollte nur wirklich schon einigermaßen fit mit C++ und insbesondere C++11 sein, sowie gewisse Konzepte der Informatik angewandt und/oder verstanden haben.
Viel eher wären die Tutorials, die direkt von der SFML stammen, fürs erste zu empfehlen. Die gibts ja hier.

MfG
Check
Überrascht mich doch etwas, zu faul zu sein, um das "MfG\nCheck" beim zitieren aus ästhetischen Gründen zu entfernen. xD

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

10

06.10.2014, 21:16


Das Buch wird eher überfordernd sein.

Nö, denn dort wird es erklärt und vor allem auch warum man es benutzt. Ich hab das schon sehr bewusst empfohlen weil es zwar ein wenig ein Quereinstieg ist, aber wenn er sich schon mit SFML auseinandersetzen will dann soll er es gleich richtig machen! :P
WIP Website: kevinheese.de

Werbeanzeige