Okay, danke für die ganzen Antworten. Bewegung klappt nun super. Allerdings habe ich jetzt noch ein kleines Problem mit der Tastenabfrage: Ich habe eine while-Schleife eingebaut in der die Events abgefragt werden. Außerdem habe ich außerhalb dieser while-Schleife (noch vor der Window.display(); Funktion folgende weitere Schleife:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
|
while(skippedTime > 0.01)
{
if (Event.key.code == sf::Keyboard::Down)
{
Sprite.setPosition(vec.x, vec.y+=Yspeed);
}
skippedTime -= 0.01;
}
|
Diese ist für das Update da, welches jedes Bild pro Sekunde ausgeführt wird. Habe, um das ganze mal zu testen, diese if () Funktion mit eingebaut. Funktioniert prima. Allerdings habe ich nun das Problem, dass ich in die Update-Schleife keine switch case - Abfrage für die Bewegungstasten einbauen will... Andersherum geht es ebenfalls nicht, ich kann die Update-Schleife nicht in die switch case Schleife einbauen, weil sich dann mein Sprite nur noch total verkrüppelt bewegt -.-*
Um das ganze mal etwas klarer zu machen, hier mein gesamter Quellcode. In Zeile 63 soll nun die Abfrage für die gedrückte Richtungstaste hineinkommen...
|
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
86
87
88
89
|
// Erstes Projekt mit sfml 2.0
// Ein Image bewegen
#include <SFML\Graphics.hpp>
#include <SFML\Window.hpp>
#include <SFML\System.hpp>
#include <SFML\System\Vector2.hpp>
#include <iostream>
using namespace std;
// FPS initialisieren
sf::Clock timer;
double skippedTime = 0;
// Hauptprogramm
//
int main()
{
// Videomode
sf::VideoMode VMode(800, 600, 32);
sf::RenderWindow Window(VMode, "sfml 2.0 - moving image");
// Texture Laden
sf::Texture Texture;
if(!Texture.loadFromFile("player.png"))
{
return 1;
}
// Sprite initialisieren
sf::Sprite Sprite;
Sprite.setTexture(Texture);
sf::Vector2f vec = Sprite.getPosition();
vec.x;
vec.y;
// Geschwindigkeit initialisieren
float Yspeed = 1.0f;
float Xspeed = 1.0f;
Window.setFramerateLimit(30);
// Gameloop
while(Window.isOpen())
{
const double elapsedTime = timer.restart().asSeconds();
skippedTime += elapsedTime;
sf::Event Event;
while(Window.pollEvent(Event))
{
switch(Event.type)
{
case sf::Event::Closed:
std::cout << "The window was closed." << std::endl;
Window.close();
break;
case sf::Event::KeyPressed:
//
// Bewegung
//
break;
default:
break;
}
}
while(skippedTime > 0.01)
{
if (Event.key.code == sf::Keyboard::Down)
{
Sprite.setPosition(vec.x, vec.y+=Yspeed);
}
skippedTime -= 0.01;
}
// running fps
Window.clear(sf::Color(255, 255, 255));
Window.draw(Sprite);
Window.display();
}
return 0;
}
|