2017-12-17 50 views
1

ねえみんなと読書のためのおかげで、SFML予想外のSF ::頂点移動

私はエンドレスランナーをしようと

vector<TILE*>* tiles = new vector<TILE*>[LANE_HEIGHT] //LANE_HEIGHT is the number of vertical TILEs 

タイルは基本的にsfのベビーシッタークラスで作成されています: :それを移入VertexArrayは、テクスチャを適用するオブジェクトを描画し、SF ::頂点を

for (int i = 0; i < LANE_HEIGHT;i++) { 
    for (int j = 0; j < tiles.size(); j++) { 
     if(tiles[j] != nullptr) 
      tiles[j]->move(sf::Vector2f(0.2f,0)); //Framerate is set to 30 to make this clearer 
    } 
    } 
012とのすべての配列を介して

Iループ(移動が問題である)移動します

ここに私の問題は、ほとんどの山車が、それは浅い水の中だようにそれが見えるように、「ウィグル」にオブジェクト原因

tiles[j]->move() 

に適用されるということです。 私が最初に私が数字で右の結果を得るが、float(0.05f) に適用フロートを設定するとき、それは、非常に明確になり、私はクラス全体を経て、float(x)のすべてを包んだので、それは丸め誤差たいかなる成功

を考えません頂点の残像(斜めも逆も)が残りの部分でドラッグされていて、数フレーム後に望みの位置にジャンプした後、繰り返す 配列内のすべてのオブジェクトがこれを行い、前のオブジェクトにオーバーラップするため、効果が生まれた

私は自分の心を失っています。 ドラッグを停止して実際の位置にスナップすると、コンソールに表示されます。

P.S.浮動小数点型のラッパーを省略したため、読み込みが難しくなりました(現在使用されていない関数もいくつか残っています)。

ありがとうございます!

#pragma once 
#include <iostream> 
#include <vector> 
#include "SFML/Graphics.hpp" 

class TILE{ 
private: 
    const float WIDTH;    //Width of the object 
    const float HEIGHT;    //Height of the object 
    sf::VertexArray body;   //Body for drawing purposes (holds all Vertex points) 
    sf::Vector2f globalPos;   //Global position in the game window 
    sf::Texture* texture;   //Stores applied texture 
public: 
    TILE::TILE(sf::Vector2f dim) : WIDTH(dim.x), HEIGHT(dim.y) { } 
    TILE::TILE(sf::Vector2f position, sf::Texture* tex, sf::Vector2f dim) : WIDTH(dim.x), HEIGHT(dim.y){ 
     globalPos = position; 
     texture = tex; 
     body = sf::VertexArray(sf::TriangleFan, 4); 

     //Maps the coordinates to the vectors, top-left = [0] then clockwise 
     body[0].position = sf::Vector2f(globalPos.x + (-(WIDTH/2.f)), globalPos.y + (-(HEIGHT/2.f))); 
     body[1].position = sf::Vector2f(globalPos.x + (WIDTH/2.f), globalPos.y + (-(HEIGHT/2.f))); 
     body[2].position = sf::Vector2f(globalPos.x + (WIDTH/2.f), globalPos.y + (HEIGHT/2.f)); 
     body[3].position = sf::Vector2f(globalPos.x + (-(WIDTH/2.f)), globalPos.y + (HEIGHT/2.f)); 
     body[0].texCoords = sf::Vector2f(0.f, 0.f); 
     body[1].texCoords = sf::Vector2f(float(texture->getSize().x), 0.f); 
     body[2].texCoords = sf::Vector2f(float(texture->getSize().x), float(texture->getSize().y)); 
     body[3].texCoords = sf::Vector2f(0.f, float(texture->getSize().y)); 
    } 
    TILE::~TILE() { 
     texture = nullptr; 
    } 
    void draw(sf::RenderWindow &window) { window.draw(body, texture); } 
    sf::Vector2f getBB_TopLeft() { return body[0].position; } 
    sf::Vector2f getBB_BotRight() { return body[2].position; } 
    void move(sf::Vector2f dir) { 
     globalPos += dir; 
     body[0].position += dir; 
     body[1].position += dir; 
     body[2].position += dir; 
     body[3].position += dir; 
    } 
    sf::Vector2f getGlobalPos() { return globalPos; } 
}; 
+0

ため申し訳ありませんが、私はこれに移動()を変更し、TILEクラスにオフセット変数を作成することによって、一時的な解決策を見つけた: + = DIRを相殺。 \t \t globalPos.x + = floor(dir.x); \t \t globalPos.y + = floor(dir.y); \t \t body [0] .position.x + = floor(dir.x); \t \t body [0] .position.y + = floor(dir.y); \t \t body [1] .position.x + = floor(dir.x); \t \t body [1] .position.y + = floor(dir.y); \t \t body [2] .position.x + = floor(dir.x); \t \t body [2] .position.y + = floor(dir.y); \t \t body [3] .position.x + = floor(dir.x); \t \t body [3] .position.y + = floor(dir.y); 今のところ – Farrrbi

答えて

1

私はが無い結果とを揺らすことを削除しようとしてきました。

各座標を丸めてみました。 は休暇ちょうど2小数点以下の桁数の期待して、私は(再び100で)は、それぞれ(intとして記憶)100によって調整した後、分割乗算しようと

動作しません。 は動作しません

私は掛け算して分けようとしましたが、最大値(および最小値)はintです。 、いくつかのケースでは

仕事int(10000など)それほど大きくないによって乗算と除算しませんが

私の結論は、フロートがを小数でその問題が関係しているで動作しているようですし、場合によっては、これらの小数は四捨五入され、奇妙な結果を引き起こします。

この乏しいヘルプ

+1

お試しいただきありがとうございます!私はRenderWindowのgetPosition()が整数値を返すので、浮動小数点数に問題があると考えました。 私は単純に着信 'dir'値をフロアさせていないので、内部で保存し、頂点に適用する直前にフロアして、intまたはintのいずれかになります。 それは確かに私のためのウィッグリングを削除しました。(RenderWindowが処理できないかもしれないすべてのフレームを浮動させるのではなく、常に数秒ごとに完全な整数で移動します) もう一度ありがとう – Farrrbi

関連する問題