ねえみんなと読書のためのおかげで、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; }
};
ため申し訳ありませんが、私はこれに移動()を変更し、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