2016-05-21 9 views
0

Aus irgendeinem Grund, wenn ich den Code unten ausführen ... Der Charakter bewegt sich nur diagonal nach unten. I "m Zeichnung können sagen Linie ist Charakter:SFML seltsame Bewegung

\ 
\ 
    \ 
    \ 
    \ 

Das ist die einzige Richtung es sich bewegt, wenn ich drücken oben, rechts, unten oder links Taste

Bitte helfen Sie, ich will nach rechts gehen, wenn es richtig, ., wenn oben, nach unten, wenn Sie nach unten, und wenn links links

mein Code:

#include<iostream> 
#include<string> 
#include<SFML\Graphics.hpp> 

using std::cout; 
using std::endl; 

enum Direction 
{ 
    DOWN, 
    LEFT, 
    RIGHT, 
    UP 
}; 

int main() 
{ 
    sf::RenderWindow _Win(sf::VideoMode(600, 600), "Hello World"); 
    sf::Texture _texture; 
    if (!(_texture.loadFromFile("Resources/SPRITE.png"))) 
    { 
     cout << "Could not load iamge" << endl; 
    } 

    //Source, tell us our starting position. 
    //Vector2i = Vector of 2 in SFML 
    sf::Vector2i source(1, DOWN/*or 0*/); 

    sf::Sprite _sprite(_texture); 

    float x = _sprite.getPosition().x; 
    float y = _sprite.getPosition().y; 
    while (true) 
    { 
     sf::Event _event; 
     while (_Win.pollEvent(_event)) 
     { 
      switch (_event.type) 
      { 
      case sf::Event::Closed: 
       _Win.close(); 
       exit(1); 
       break; 
      case sf::Event::KeyPressed: 
       switch (_event.key.code) 
       { 
       case sf::Keyboard::Up: 
        source.y = UP; 
        _sprite.move(sf::Vector2f(x,y--)); 
        y = 3, x=3; 

        break; 
       case sf::Keyboard::Down: 
        source.y = DOWN; 
        _sprite.move(sf::Vector2f(x, y++)); 
        y = 3, x = 3; 
        break; 
       case sf::Keyboard::Right: 
        source.y = RIGHT; 
        _sprite.move(sf::Vector2f(x++, y)); 
        y = 3, x = 3; 
        break; 
        case sf::Keyboard::Left: 
        source.y = LEFT; 
        _sprite.move(sf::Vector2f(x--, y)); 
        y = 3, x = 3; 
        break; 
       } 
       break; 
      } 
     } 

     //Cropping Out Image 
     //Please Look at sprite in resources/Sprite.png 
     //When we run this : 
     //_sprite.setTextureRect(sf::IntRect(source.x*32 , source.y*32 , 32 , 32)); 
     //Its going to give us the top left corner sprite image. Thats so because 
     //we are cropping source.x*32 , which of 32 is the width of the sprite.. So it 
     //starts from 1 * 32. 32 is the width of one sprite so it goes to the end of it. 
     //Same Applies to the y. source.y * 32. It just goes to the end of the down sprite. 
     //As you go down the y increases, 1 * 32 = 32. And 32 is the width of one sprite 
     //so it shows body of one full sprite. 
     _sprite.setTextureRect(sf::IntRect(source.x*32 , source.y*32 , 32 , 32)); 
     //Clears Window(Flickering..) 
     _Win.clear(); 
     //Draw Sprite 
     _Win.draw(_sprite); 
     //And Finally Display the Window. 
     _Win.display(); 
    } 
} 

Antwort

1

In jedem Fall Ihrer Switch-Anweisung, bewegen Sie die Sprite von (x, y) und dann entweder inkrementieren oder dekrementieren x oder y , abhängig von der Richtung. Dies ist jedoch ergebnislos, da auf der nächsten Zeile, können Sie sie beide zu 3. Also in der Tat zurückzusetzen, was auch immer Richtungstaste gedrückt wird, tun Sie das:

_sprite.move(sf::Vector2f(3, 3)); 

Das heißt, 3 Einheiten nach rechts und 3 Einheiten runter, was genau zu Ihrer Beschreibung der Bewegung passt, die Sie sehen. Ich bin mir nicht sicher, welche Art von Bewegung, die Sie für gehen, aber hier ist ein Beispiel, das funktionieren könnte:

switch (_event.key.code) { 
case sf::Keyboard::Up: 
    _sprite.move(sf::Vector2f(0, -3)); 
    break; 
case sf::Keyboard::Down: 
    _sprite.move(sf::Vector2f(0, 3)); 
    break; 
case sf::Keyboard::Right: 
    _sprite.move(sf::Vector2f(3, 0)); 
    break; 
case sf::Keyboard::Left: 
    _sprite.move(sf::Vector2f(-3, 0)); 
    break; 
} 

Dies würde die Sprite 3 Einheiten jedesmal, wenn eine Richtungstaste gedrückt wurde, in diese Richtung bewegen.

+0

Vielen Dank! ... –