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.04.2012, 16:20

SFML - Sprite wird nicht richtig dargestellt

Hallo Community
ich arbeite mit SFML 1.6.

Ich habe mich mal an einer PacMan Animation versucht, wobei Pacman seinen Mund im Sekundentakt
Auf und zu machen sollte( mit Hilfe vom Sprites und sf::Clock), aber stattdessen kommen die
Sprites im unregelmäßigem Flimmern auf den Schirm.

Hoffe hier kennt jemand eine lösung...

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
67
68
#include <SFML\Audio.hpp>
#include <SFML\System.hpp>
#include <SFML\Graphics.hpp>
#include <SFML\Window.hpp>
#include <Windows.h>
#include <iostream>

using namespace std;

int main()
{
    
    sf::RenderWindow App(sf::VideoMode::GetMode(0) , "Game" );
    sf::Clock clock;
    sf::Image PacO(454,340);
    sf::Image PacC(454,340);

    PacO.LoadFromFile("PacManOpen.jpg");
    PacC.LoadFromFile("PacManClose.jpg");

    PacO.CreateMaskFromColor(sf::Color(255,255,255),0);
    PacC.CreateMaskFromColor(sf::Color(255,255,255),0);

    int PosW = 0, PosH = 0; // unrelevant im Moment
    int Touble = 0;

    sf::Sprite PAC;
    
    float t1=0.0f, t2 = 1.0f;

    while(App.IsOpened())
    {
           
        
            t2 = clock.GetElapsedTime();
            if ( t2 >= t1+1) 
            {
                if(Touble % 2 ==0)
                   {
                       App.Clear();
                       PAC.SetImage(PacC);
                       App.Draw(PAC);
                    
                   }
                   else
                   {
                       App.Clear();
                       PAC.SetImage(PacO);
                       App.Draw(PAC);
                   }
                t1 = clock.GetElapsedTime();
                   Touble++;

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

    App.Display();
    }

    return 0;
}

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

2

06.04.2012, 17:08

Willkommen im Forum.
Erstmal zur Reihenfolge in der Schleife. Es ist üblich zuerst die Eventschleife zu durchlaufen, dann die updates zu machen und anschließend zu zeichnen.
Du solltest auch auf die Formatierung des Codes achten.

Du machst es dir schwerer als es ist...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
App.Clear();
if(static_cast<int>(clock.GetElapsedTime())%2)
{
    PAC.SetImage(PacO);
}
else
{
    PAC.SetImage(PacC);
}
App.Draw(PAC);
App.Display();

Das Wechseln des Images ist allerdings auch nicht besonder schön. Am besten packst du beide Bilder in ein Image und benutzt SubRects um nur ein Teil des Images zu zeichnen.
"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?

3

06.04.2012, 18:28

Vielen Dank :thumbsup:
Aber wie kann ich jetzt die Geschwindigkeit der Animation bestimmen, vorher hatte ich den float wert.

4

06.04.2012, 18:34

Mach es so, dass du eine float Variable nimmst, und in der Schleife reinschreibst, dass die float Variable größer wird. Wenn die float Variable größer als ein gewisser Wert ist, dann kommt das nächste Bild, usw....
Dabei sollst du nicht vergessen, wenn die Reihenfolge der Bilder beim Anzeigen schon durchlaufen sind, den Wert der float Variable auf 0.f zustellen.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

5

06.04.2012, 18:51

if(static_cast<int>(clock.GetElapsedTime()*FPS)%2)

@Coder: Wieso so kompliziert?

edit: es ist doch Time*FPS, nicht Time/FPS :D
"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« (06.04.2012, 18:57)


6

06.04.2012, 18:56

@NachoMan: Ich denk immer so kompliziert nach, jeder sagt das. ._.

7

06.04.2012, 19:28

Das war ES !! Vielen Danke so kann ich das super regulieren :thumbup:

8

06.04.2012, 20:41

Wenn du erst neulich mit SFML angefangen hast würde ich dir empfehlen lieber direkt auf SFML 2.0 umzusteigen, da sind einige Probleme
behoben worden und die Performance wurde erheblich gesteigert... Nur ein Tipp von mir! :)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

9

06.04.2012, 21:02

Dafür gibts bei der SFML 2.0 neue Probleme. Mein Tipp: Bleib bei 1.6 bis zum Release. xD
"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?

10

07.04.2012, 08:47

Also ich hatte bis jetzt kein Problem gehabt und hab auch ne Menge mit geschrieben... ich habs halt nur empfohlen, weil der Release nicht
mehr lange auf sich warten lässt und einige Element Funktionen Bezeichnungen sowie Klassen Bezeichnungen verändert wurden, da kann der
Thread Autor sich direkt dran gewöhnen. ^^

Abgesehen davon gibt es auch einige Sachen in SFML 2.0 die enfternt wurden, da wärs besser wenn
man bei größeren Projekten direkt die SFML 2.0 Syntax verwendet als später sich zu quälen beim Wechsel
von 1.6 zu 2.0, ich hab damit Erfahrungen gemacht.

Auf Klartext, in meinen Augen ist SFML 1.6 ziemlich veraltet, also ist der Wechsel früher oder später von nöten... ^^

Aber wie jesagt allet nur mene Meinung! :D

Werbeanzeige