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 infloat(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; }
};
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