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

Flutschi

Treue Seele

  • »Flutschi« ist der Autor dieses Themas

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

1

09.09.2012, 18:39

SFML 2.0 & draw() & display() frage..

Guten Tag,


Aaaalso, soweit ich das verstanden habe tut draw() eine Texture oder Text oder was weis ich was alles zeichnen und display() updated sozusagen einfach den Bildschirm, so, wenn ich jetzt aber eine Map z.b. habe die ich ja nicht immer wieder zeichnen will dann flackert es.

Will heissen das display() meines wissens nach ja die 2 Screens umschaltet die ich sehe, und da ich draw() ja nur einmal aufgerufen hab ist ja auch nur einer der beiden Screens bezeichnet oder?

also müsst ich ja einfach:

draw()
display()
draw()

machen, aber irgendwie scheint mir das ziemlich doof irgendwie... oder nicht?

Ich lese hier meine Map in ein Array, und draw dieses dann, nun müsst ich aber diese Map ja 2x zeichnen für jeden screeen einmal, gibt es da nicht etwas "einfacheres"?
klar, ich weis schon das es sehr einfach ist zu realisieren, aber irgendwie scheint mir das bisschen doof, gibt es nciht sowas wie "CopyToOtherScreen()"?


hoffe ihr versteht was ich meine?

Vielen Dank fürs Antworten!
♥ SFML 2.0 Visual Express 2010 ♥

Beiträge: 26

Wohnort: Dort wo mein PC steht

  • Private Nachricht senden

2

09.09.2012, 20:07

Nein, du brauchst nur einmal Draw() aufzurufen. Du zeichnest deine Map in den Doublebuffer und diesen zeigst Du dann mit Display() an.
Der Doublebuffer ist dazu da, dass das Bild nicht flackert (wenn du das Bild mehrmals in der Sekunde zeichnest).

Mfg Caesiumhydroxid :D
Wer Rechtschreibfehler findet, darf sie behalten ;)

Flutschi

Treue Seele

  • »Flutschi« ist der Autor dieses Themas

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

3

09.09.2012, 20:43

Nö, deine aussage ist nicht ganz korrekt bei mir, denn Draw zeichnet bei mir nur immer in den background Screen, also in den Screen der beim nächsten Display aufruf vorgeholt wird...

Flackert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    sf::RenderWindow mainWindow;
    mainWindow.create(sf::VideoMode(100,100,32), "Hi");

    sf::Texture t_bild;
    sf::Sprite s_bild;

    t_bild.loadFromFile("Bilder/Rot.png");
    s_bild.setTexture(t_bild);
    mainWindow.draw(s_bild); // <<----- Draw ausserhalb der schlaufe, also einmal aufrufen.

    sf::Event events;
    while (mainWindow.isOpen())
    {

        mainWindow.display();
        while (mainWindow.pollEvent(events))
        {
            if (events.type == sf::Event::Closed)
                mainWindow.close();
        }
    }


Flackert nicht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    sf::RenderWindow mainWindow;
    mainWindow.create(sf::VideoMode(100,100,32), "Hi");

    sf::Texture t_bild;
    sf::Sprite s_bild;

    t_bild.loadFromFile("Bilder/Rot.png");
    s_bild.setTexture(t_bild);

    sf::Event events;
    while (mainWindow.isOpen())
    {

            mainWindow.draw(s_bild); // <<---- Bild wird immerwieder gezeichnet, also kein flackern..
        mainWindow.display();
        while (mainWindow.pollEvent(events))
        {
            if (events.type == sf::Event::Closed)
                mainWindow.close();
        }
    }



Ich könnt das flackern umgehn wenn ich

C-/C++-Quelltext

1
2
3
    mainWindow.draw(s_bild);
    mainWindow.display();
    mainWindow.draw(s_bild);


dashier mache, aber irgendwie is das doch nicht sinn der Sache? bei grösseren Projekten kann ich mir das schlecht vorstellen das sie einfach alles 2x drawen?

ich glaub irgendwo is bei mir der Wurm drin? ;)
♥ SFML 2.0 Visual Express 2010 ♥

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

4

09.09.2012, 22:08

Du musst nach dem display nichts mehr zeichnen ;)
Einmal vor display pro Schleifendurchlauf reicht vollkommen aus.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

5

09.09.2012, 22:15

Es flackert nur, weil du den BackBuffer nicht "clearst".
http://www.sfml-dev.org/documentation/2.…f46114aeaf60f26

Flutschi

Treue Seele

  • »Flutschi« ist der Autor dieses Themas

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

6

09.09.2012, 22:16

Du musst nach dem display nichts mehr zeichnen ;)
Einmal vor display pro Schleifendurchlauf reicht vollkommen aus.


jo ne das is mir schon klar, der obere code sollte so aussehn:

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
    sf::RenderWindow mainWindow;
    mainWindow.create(sf::VideoMode(100,100,32), "Hi");

    sf::Texture t_bild;
    sf::Sprite s_bild;

    t_bild.loadFromFile("Bilder/Rot.png");
    s_bild.setTexture(t_bild);
    mainWindow.draw(s_bild); //
    mainWindow.display();      //    <---- hier so meint ich das mit draw / display / draw..
    mainWindow.draw(s_bild); // 

    sf::Event events;
    while (mainWindow.isOpen())
    {

        mainWindow.display();
        while (mainWindow.pollEvent(events))
        {
            if (events.type == sf::Event::Closed)
                mainWindow.close();
        }
    }
♥ SFML 2.0 Visual Express 2010 ♥

Flutschi

Treue Seele

  • »Flutschi« ist der Autor dieses Themas

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

7

09.09.2012, 22:23

Es flackert nur, weil du den BackBuffer nicht "clearst".
http://www.sfml-dev.org/documentation/2.…f46114aeaf60f26


Naja ich will ja das die Map, also der Hintergrund, bleibt... und nicht immer neu gezeichnet werden muss...
♥ SFML 2.0 Visual Express 2010 ♥

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

8

09.09.2012, 22:44

Dann hast du aber ein Problem, wenn sich andere Grafiken bewegen, die werden dann nämlich nicht gelöscht ;)
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Flutschi

Treue Seele

  • »Flutschi« ist der Autor dieses Themas

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

9

09.09.2012, 22:51

Dann hast du aber ein Problem, wenn sich andere Grafiken bewegen, die werden dann nämlich nicht gelöscht ;)


hmm das stimmt dann auch wieder, hmmmm... shit :D
♥ SFML 2.0 Visual Express 2010 ♥

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

10

09.09.2012, 23:00

Nur den Background jedes Mal neu zu zeichnen braucht auch nicht wirklich Leistung, ist ja nur ein einzelnes Sprite.

Zur Erklärung, wieso es bei deinem flackernden Bild überhaupt flackert: Du zeichnest den Background nur einmal, und zwar auf Buffer 1. Dann wechselst du jedoch andauernd zwischen Buffer 1 und dem leeren Buffer 2, was das Flackern erklärt.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Werbeanzeige