2017-01-05 11 views
0

私はスプライトを動かすためのクラスをアニメーション、かなり基本的なものとともに作成しました。SFMLスプライトの動き

最終的にすべてのエラーを取り除いた後、基礎ロジックとすべてをチェックして、動きベクトルがほんとうに私が望んでいたものを見ました。問題は一度、スプライトちょっと動いてから元の位置に戻ります。

My class move(スプライトの移動とアニメーションを担当)は、moveで設定された変数に従って移動するメインソースコード内で使用されるスプライトを返します。

変数を十分高い値に設定すると、スプライトが元の位置を瞬時に移動してから戻ってきて再び移動して戻ります。コードをチェックしました。スプライトをリセットしていませんポジションかそのようなもの。 は、ここでは、コードです: -

ソースコード: -

#include"SFML\Graphics.hpp" 
#include"check.h" 
#include"display.h" 
int main() 
{ 
sf::Sprite plop; 
sf::RenderWindow window(sf::VideoMode(1360, 720), "Larger SFML", sf::Style::Default); 
sf::Texture texture; 
texture.loadFromFile("bahamut.png"); 
texture.setRepeated(false); 
float fraps = 0.0; 
check playa; 
sf::Clock fps; 
while (window.isOpen()) 
{ 
    fraps = fps.restart().asSeconds(); 
    plop = playa.movereturn(100000.,fraps,&texture); 
    window.clear(); 
    window.draw(plop); 
    display dis(window); 
} 

return 0; 

} 

ここでは、チェックのためのヘッダである: - ここに

#pragma once 
#include"SFML\Graphics.hpp" 
class check 
{ 
public: 
    check(); 
    sf::Sprite movereturn(float speed,float fps,sf::Texture* texture); 
    ~check(); 
}; 

は、チェックの定義です: -

#include "check.h" 



check::check() 
{ 
} 

sf::Sprite check::movereturn(float speed,float fps,sf::Texture* texture) 
{ 
    sf::Sprite playas; 
    playas.setTexture(*texture); 
    sf::Vector2f movements = { 0.,0. }; 
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::A)) 
    { 
     movements = { -speed*fps,0. }; 
     playas.move(movements); 
    } 
    else 
    { 
     if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::D)) 
     { 
      movements = { speed*fps, 0. }; 
      playas.move(movements); 
     } 
     else 
     { 
      if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::S)) 
      { 
       movements = { 0.,speed*fps }; 
       playas.move(movements); 
      } 
      else 
      { 

       if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::W)) 
       { 
        movements = { 0.,-speed*fps }; 
        playas.move(movements); 
       } 
       else 
        movements = { 0., 0. }; 

      } 
     } 
    } 
    return playas; 

} 


check::~check() 
{ 
} 

Displayはウィンドウを取り込んでwindow.display()関数を持っています。このクラスがなければハンドラがあります例外なので、私はこれを強制する必要があります。

+0

あなたは自分を必要とせずにwindow.display()を呼び出すことができるはずですこれは基本的に同じコードなので、あなたは持っている問題で他の質問も更新する必要があります。 – Eddge

答えて

0

コードに問題があります。

  1. フロートに正しい構文を使用する必要があります。 0.0fはfloat、0.0はdoubleを表します。あなたのコンパイラがあなたにそれに関する警告を与えていないのを驚かせてください。
  2. あなたのスプライトは、あなたのmovereturn関数内のすべてのフレームで作り直されています。だから、あなたのスプライトは、あなたに向かう方向をあなたに任せています。その次のフレームはデフォルト値(0の位置)で再作成されます。組み込みのビジュアルスタジオデバッガを使用している場合、スプライトのプレイ位置が常にデフォルトにリセットされていることがわかりますあなたの問題に大きなヒント。
  3. プレイヤーは1方向のみを動かすことができるように制限しているため、斜めに移動することはできません(左上)。あなたは他のステートメントをすべて必要としません。
  4. 常に、1行のif文で常にかっこを使用するかどうかにかかわらず、角かっこを使用してください。それを取り除くことは許されていますが、大括弧を使うとデバッグがずっと簡単になります。

これはあなたの問題を解決する必要があります。

Check.h

#pragma once 
#include"SFML\Graphics.hpp" 
class check 
{ 
    sf::sprite playas; 
public: 
    check(); 
    sf::Sprite movereturn(float speed,float fps,sf::Texture* texture); 
    ~check(); 
}; 

を確認します。あなたは斜めの動きを望んでいた場合、あなたのmovereturn機能では、このようにコードを変更することができます

sf::Sprite check::movereturn(float speed,float fps,sf::Texture* texture) 
{ 
    playas.setTexture(*texture); 
    sf::Vector2f movements = { 0.0f,0.0f }; 
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::A)) 
    { 
     movements = { -speed*fps,0.0f }; 
    } 
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::D)) 
    { 
     movements = { speed*fps, 0.0f };   
    } 
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::S)) 
    { 
     movements = { 0.0f,speed*fps }; 
    } 
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::W)) 
    { 
     movements = { 0.0f,-speed*fps }; 
    } 
    playas.move(movements); 
    return playas; 
} 

をCPP:

sf::Sprite check::movereturn(float speed,float fps,sf::Texture* texture) 
{ 
    playas.setTexture(*texture); 
    sf::Vector2f movements = { 0.0f,0.0f }; 
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::A)) 
    { 
     movements.x = -speed*fps; 
    } 
    else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::D)) 
    { 
     movements.x = speed*fps;   
    } 
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::S)) 
    { 
     movements.y = speed*fps; 
    } 
    else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::W)) 
    { 
     movements.y = -speed*fps; 
    } 
    playas.move(movements); 
    return playas; 

} 
関連する問題