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

01.01.2014, 14:12

Erneutes Arbeiten mit SFML, Bewegungsprobleme

Hallo an alle,
nach einer zweimonaten "Programmierpause" steige ich in den letzten Tagen wieder ein. Die Grundlegenden sachen wie Schleifen, Klassen etc waren mir noch einigermaßen bekannt, also habe ich gleich mit SFML wieder angefangen.
Nach einigen Problemen die ich schon selbst bearbeitet habe, habe ich nun das Problem, dass sich mein Sprite nicht bewegt. Wenn ich mein window.clear(); entferne sieht man eine unschöne Bewegung, daher denke ich, dass meine Bewegungsklasse ansich funktioniert. Man muss dazu sagen, dass ich versuche erstmal einfach zu programmieren, da mich Sachen wie Vektoren, Pointer etc doch sehr abschrecken... :wacko: Kann man hier vllt mal ein paar Denkanstöße mitgeben? :rolleyes:

Hier mein Code (Achtung nicht sehr schön.....) :thumbsup:

main.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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include "SFML\Graphics.hpp"
#include "iostream"
#include "Pokemon.hpp"

using namespace sf;


int main()
{
    
    
    Sprite Hintergrund;
    Texture Bild;
    if(!Bild.loadFromFile("image.png"))
    {
        std::cout << "Texture couldn't load" << std::endl;
    }
    else
    {
        std::cout << "Texture has loaded" << std::endl;                                                         //Startbild laden
    }
    Hintergrund.setTexture(Bild);                   
    Hintergrund.setOrigin(200,250);
    Hintergrund.setPosition(225,275);

        
        RenderWindow window(VideoMode(450, 550), "Drücke einen beliebigen Buchstaben",sf::Style::Resize);      //Start laden 
        
                  Event event;

                  while (window.isOpen())
{
    

                  while (window.pollEvent(event))                                                               //Eventsuche, Fehlerausschließung  
                { 
                    if (event.type == sf::Event::KeyPressed)
                      {
    
                    
                  window.create(VideoMode(800, 600), "Game",sf::Style::Resize); 
                   Clock clock;                                                                             //Spielfenster startet
                Pokemon Spieler("Spieler.png");
                  
              

                                        while (window.isOpen())
                                        {
    float ElapsedTime = clock.restart().asMilliseconds();
    
                                        Event event;
                                                while (window.pollEvent(event))                             //Eventsuche, Fehlerausschließung
                                                {
                                                        if (event.type == sf::Event::KeyPressed) 
                                                        { 
                                                                if(Keyboard::isKeyPressed(Keyboard::Escape))
                                                                {
                                                                window.close();
                                                                }
                                                        }
                                                

                                                         window.clear(Color::Black);
 

        Spieler.Update(window, ElapsedTime);
        Spieler.Render(window);
 
        window.display();
                                                  }
                                            }
                      }
                      
                }

                window.clear();
                window.draw(Hintergrund);                                                                   //Startfenster s.o
                window.display();
}



        
    return 0;
}


Pokemon.hpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <SFML\Graphics.hpp>
#include "string"

using namespace sf;

 
class Pokemon
{
    public:
 
        void Update (RenderWindow &Window, float ElapsedTime);
        void Render (RenderWindow &Window);
        Pokemon (String tex);
 
    private:
        float Speed;
        Texture Textur;
        Sprite Pok;
};


Pokemon.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
#include "Pokemon.hpp"

Pokemon::Pokemon(String tex)
{
    Speed = 50.0f;
 
    if(!Textur.loadFromFile(tex))
    {
        std::cout << "Textur konnte nicht geladen werden." << std::endl;
    } else {
        std::cout << "Textur wurde erfolgreich geladen." << std::endl;
    }
 
    Textur.setSmooth(false);
    Pok.setTexture(Textur);
    Pok.setOrigin(17.5f, 17.5f);
    Pok.setPosition(160.f, 120.f);
}
 
void Pokemon::Update(RenderWindow &Window, float ElapsedTime)
{
 
    if(Keyboard::isKeyPressed(Keyboard::Left))
    {
        Pok.move(-Speed*ElapsedTime,0);
    }
 
    if(Keyboard::isKeyPressed(Keyboard::Right))
    {
        Pok.move(Speed*ElapsedTime,0);
    }
 
    if(Keyboard::isKeyPressed(Keyboard::Up))
    {
        Pok.move(0,-Speed*ElapsedTime);
    }
 
    if(Keyboard::isKeyPressed(Keyboard::Down))
    {
        Pok.move(0,Speed*ElapsedTime);
    }
}
 
void Pokemon::Render(RenderWindow &Window)
{
    Window.draw(Pok);
}

 


Ich bin dankbar und offen für alle Verbesserungen :)

Liebe Grüße und ein frohes neues Jahr

Lukas

Nimelrian

Alter Hase

Beiträge: 1 216

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

  • Private Nachricht senden

2

01.01.2014, 14:49

Speed ist viel zu hoch.
Dein Sprite bewegt sich aktuell mit 50*1000 = 50000px/s.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

3

01.01.2014, 14:53

Hallo,
danke für die Antwort, aber daran liegt es nicht. Das war nur ein Test ;)
Habe Speed von 1 bis 100 ausprobiert und dabei ist dann die 50 in den Kopiergang verrutscht!

LG

Nimelrian

Alter Hase

Beiträge: 1 216

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

  • Private Nachricht senden

4

01.01.2014, 15:35

Bei 1 sind es immer noch 1000px/s.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

5

01.01.2014, 15:39

Hallo,
müsste dann nicht der Sprite aus dem Bild verschwinden? Er bleibt ja exakt da wo er ist...
Ist denn der Rest korrekt?

Nimelrian

Alter Hase

Beiträge: 1 216

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

  • Private Nachricht senden

6

01.01.2014, 15:57

Ich dachte, wenn du window.clear() rauslässt sieht man, dass sich was bewegt?

Und bitte fixe im OP die Formatierung, man kann nicht direkt sehen, was innerhalb irgendwelcher Klammern steht und was nicht.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

7

01.01.2014, 16:38

Ja wenn ich den window.clear(); rausnehme bewegt es sich nicht wirklich.. einmal ist der Sprite "gesprungen" und er verpixelt am Rand leicht..
Wie meinst du das im OP? Die Klammern die zueinander gehören liegen eignt immer untereinander!

Nimelrian

Alter Hase

Beiträge: 1 216

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

  • Private Nachricht senden

8

01.01.2014, 17:12

Die main.cpp sieht aus wie... kA.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Dreat

Frischling

Beiträge: 86

Wohnort: Heilbronn

  • Private Nachricht senden

9

01.01.2014, 17:38

Probiers doch mal so


C-/C++-Quelltext

1
2
3
4
5
6
                Spieler.Update(window, ElapsedTime);

                window.clear();
                window.draw(Hintergrund);
                Spieler.Render(window)
                window.display();

10

01.01.2014, 17:56

Hallo,
das Aussehen der Main kommt davon, dass ich am Anfang da einfach nur rumprobiert habe...
Wird sicher nochmal anders geschrieben.
Das ganze soll halt so ablaufen, dass sich erst ein kleineres Fenster mit einem Hintergrund öffnet und es dann auf Knopfdruck auf das Game umspringt.
Das ist mein verpackter Schleifenwahnsinn :search:

Werde ich mal probieren. (Der Hintergrund gehört noch zum ersten Window, also zum Startfenster, s. Randbemerkungen)

Werbeanzeige