2017-12-17 13 views
1

Hey everyone und vielen Dank für das Lese,SFML unerwartet sf :: Vertex Bewegung

Ich versuche, einen Endless Runner zu machen und erstellt ein

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

TILE ist im Grunde eine Babysitter-Klasse für einen sf: : VertexArray auffüllt, die es gilt Textur, zieht das Objekt und bewegt die sf :: Scheitelpunkte (moving das Problem ist)

I Schleife durch alle Arrays mit

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 
    } 
    } 

hier Mein Problem ist, dass die meisten Schwimmer

tiles[j]->move() 

Ursache des Objekts zu ‚wackeln‘ auf

angewandt, so dass es im flachen Wasser aussehen ist es. Ich dachte zuerst ein Rundungsfehler war es so dass ich durch die ganze Klasse ging und wickelte alles in float(x), keinen Erfolg

ich die richtigen Ergebnisse in Zahlen zu erhalten, aber wenn der angelegten Schwimmer float(0.05f) Einstellung wird es sehr deutlich, dass die Das Nachbild des Vertex (auch diagonal oder umgekehrt) wird vom Rest gezogen und nach ein paar Frames springt es an seine gewünschte Position und wiederholt dann Da jedes Objekt im Array dies tut und sich mit dem vorherigen, dem Wiggle, überschneidet Effekt ist geboren

Ich verliere meinen Verstand. Was kann ich tun, um das Ziehen zu stoppen und es an seiner tatsächlichen Position zu arretieren, zeigt es mir in der Konsole?

P.S. Ich habe die Float-Wrapper ausgelassen, weil es nicht geholfen hat und es weniger lesbar macht (auch einige derzeit ungenutzte Funktionen sind weggelassen) :)

Vielen Dank im Voraus!

#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

I eine vorübergehende Lösung durch die Schaffung einer Offset-Variable in der TILE-Klasse gefunden wird, dann bewegen sich geändert() in dieses: Offset + = dir; \t \t globalPos.x + = Boden (Richt.x); \t \t globalPos.y + = floor (dir.y); \t \t Körper [0] .position.x + = Boden (dir.x); \t \t Körper [0] .position.y + = Boden (dir.y); \t \t Körper [1] .Position.x + = Boden (Richt.x); \t \t Körper [1] .position.y + = Boden (dir.y); \t \t Körper [2] .Position.x + = Boden (Richt.x); \t \t Körper [2] .position.y + = Boden (dir.y); \t \t Körper [3] .Position.x + = Boden (Richt.x); \t \t Körper [3] .position.y + = Boden (dir.y); funktioniert jetzt – Farrrbi

Antwort

1

Ich habe versucht, ohne Ergebnisse Wackeln zu entfernen, dass.

Ich versuchte, jede Koordinate (oder Boden, wie Sie versuchten) zu runden. Funktioniert nicht

ich versuchte, die jeweils durch 100 (Speicher als int) koordinieren zu multiplizieren und dann dividieren (100 wieder), mit der Hoffnung, leave nur 2 Nachkommastellen. Funktioniert nicht

Ich versuchte zu multiplizieren und zu teilen, aber durch max (und min) int Werte. Funktioniert nicht

In einigen Fällen multiplizieren und dividieren durch eine nicht so großint (wie 10000) scheint

Mein Fazit zur Arbeit ist, dass Problem mit float Dezimalstellen bezogen ist, und In einigen Fällen sind diese Dezimalstellen gerundet, was den seltsamen Effekt verursacht.

Leider für diese schlechte Hilfe

+1

Danke für den Versuch! Ich habe festgestellt, dass die getPosition() - Rückgabewerte von RenderWindow zu Integer-Werten führen können. Denken Sie daran, ich habe nicht einfach den eingehenden 'dir' Wert floored, ich speicherte es intern und floored es kurz vor dem Anwenden auf die Vertices, was dazu führt, dass es entweder ein int oder ein int hat. Es hat sicherlich das Wackeln für mich entfernt (da es sich immer alle paar Sekunden um volle Ints bewegte, anstatt jeden Frame zu schweben (was RenderWindow vielleicht nicht verkraftet)) Nochmals vielen Dank – Farrrbi