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

31.08.2009, 17:15

SFML Bei Mausbewegung bewgt sich das sprite schneller

Hi Leute hab da n Problem und hoffe das mir jemand helfen kann.

Vorweg ich arbeite mit SFML.

Das Problem ist folgendes, ich habe ein Draufsicht auf eine Figur.
Die Figur wird mit W A S D gesteuert.
Desweiteren habe ich einen Punkt welcher die Position der Maus darstellt.
Wenn ich Maus udn figur zur gleichen Zeit bewege ,bewegt sich Die Figur etwa doppelt so schnell.

Hier ist der code

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
int main() 
{ 
//Klasseninstanzen 


sf::Sprite Sprite; 
sf::Sprite Point; 
sf::Image ImageSprite; 
sf::Image ImagePoint; 
sf::Event Event; 
sf::Input Input; 

//Fenster erzeugen 

sf::RenderWindow App(sf::VideoMode(1024,768,32), "Projekt 001",sf::Style::Close); 

ImageSprite.LoadFromFile("Figur.png"); 
Sprite.SetImage(ImageSprite); 
ImagePoint.LoadFromFile("Punkt.png"); 
Point.SetImage(ImagePoint); 
Sprite.SetPosition(500,400); 
Sprite.SetCenter(16,16); 



//Spielschleife 


while(App.IsOpened()) 
{App.Clear(sf::Color(200,200,200)); 


//Eventabfrage 

while(App.GetEvent(Event)) 
{ 
if((Event.Type == sf::Event::KeyPressed)&&(Event.Key.Code == 
sf::Key::Escape)) 
{ 
App.Close(); 
} 



// Wasd Tastenabfrage 

if (App.GetInput().IsKeyDown(sf::Key::A)) Sprite.Move(-2, 0); 
if (App.GetInput().IsKeyDown(sf::Key:)) Sprite.Move( 2, 0); 
if (App.GetInput().IsKeyDown(sf::Key::W)) Sprite.Move(0, -2); 
if (App.GetInput().IsKeyDown(sf::Key::S)) Sprite.Move(0, 2); 


} 

// Mauspositionabfrage 

if(Event.Type == sf::Event::MouseMoved) 
{ 
int x = static_cast<int>(App.GetInput().GetMouseX()); 
int y = static_cast<int> (App.GetInput().GetMouseY()); 
Point.SetPosition(x,y); 
} 



App.Draw(Sprite); 
App.Draw(Point); 
App.Display(); 
} 
return 0; 
} 


Ich hoffe das mir jemand helfen kann
Dankle schonmal im Voraus


Edit von TrikkieMikkie:
Bitte C++ Codetags verwenden
Hab das mal für dich erledigt

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

31.08.2009, 17:41

Was hat dir an der Antwort hier nicht gepasst?
http://www.c-plusplus.de/forum/viewtopic-var-t-is-248873.html

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

3

31.08.2009, 17:41

Stichwort: framerate-unabhängige Bewegung.

Multipliziere die Strecke, die du dich fortbewegst mit der verstrichenen Zeit seit dem letzten Frame.

Edit: und natürlich sollte der Move-Befehl nicht in der Event-Schleife sein :roll:
Edit: das Einrücken von Code wär auch sehr zu empfehlen.

4

31.08.2009, 19:23

Das mit der Frameratze werd ich gleich ma probieren. Mich wundert nur warum das prite schneller gezeichnet wird. Müsste die Koordinatenabfrage und die Tastenabfrage nich jeweils nur 1 mal pro schleifendurchlauf erfolgen?

Wo würdest du den Sprite.Move() platzieren, wen nicht in der event schleife?

Danke für den Tipp!

Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

5

31.08.2009, 22:22

Zitat

Wo würdest du den Sprite.Move() platzieren, wen nicht in der event schleife?


na aus der eventschleife raus...
und die abfrage der maus kannste auch aus der eventschleife raus machen, da GetInput nich viel mit Events zutun haben und Events nich für Tastaturabfragen wie z.b. Sprite Bewegen geeignet sind...und das liegt glaub ich daran dass pro Frame nur ein Event verarbeitet wird, wenn ich falsch liege korrigiert mich bitte.... :D
New Project: Operation CityRacer

6

01.09.2009, 00:20

Du wartest in jedem Frame auf Nutzereingaben. Tastendrücke z.B.
Die werden ja, beim gedrückthalten alle x Sekunden wiederholt, sieht man sehr schön, wenn man in einem Textfeld eine Taste gedrückt hält.

Meinetwegen also alle 0.1 Sekunden ein Event, sonst gar nix, solange eine Taste gedrückt gehalten wird.
Kommt jetzt die Maus dazu, erzeugt diese evtl. auch alle 0.1 Sekunden ein Event, wegen der Bewegung. Jetzt kommen im selben Zeitraum doppelt so viele Events, und deine Spielschleife wird so schnell abgearbeitet, dass der größte Teil der zeit auf neue Events gewartet wird.

Doppelt so viele Events->Halb so lange Wartezeit->die Spielschleife wird doppelt so oft durchlaufen->das Sprite bewegt sich doppelt so oft.

Das war stark vereinfacht, aber daran liegt es. Eigentlich sehr einfach, aber wir waren ja alle mal Anfänger^^
Lieber dumm fragen, als dumm bleiben!

7

01.09.2009, 16:41

So Leute danke für die hilfe hab es hinbekommen habe die mausabfrage aus der event schleife rausgenommen und nun funktionierts ^^.

Danke schön

Werbeanzeige