SFML意外的sf :: Vertex运动

时间:2017-12-17 15:09:55

标签: c++ sfml

嘿大家,谢谢你的阅读,

我正在努力创造一个无尽的亚军,并创造了一个

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

TILE基本上是sf :: VertexArray的保姆类,它填充它,应用纹理,绘制对象并移动sf :: Vertex点(移动是问题)

我用

遍历所有数组
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
     }
  }

我的问题是大多数花车适用于

tiles[j]->move()

使物体“摆动”,使其看起来像是在浅水中。 我首先想到这是一个舍入错误,所以我经历了整个课程并将所有内容包裹在float(x)中,没有成功

我在数字中得到了正确的结果但是将应用的浮点数设置为float(0.05f) 很明显顶点的余像(也是对角线或反面)被其余部分拖动,经过几帧后它跳到了想要的位置,然后重复 由于数组中的每个对象都是这样做并且重叠到前一个对象上,因此摆动效应就会产生

我正在失去理智。 如何停止拖动并将其捕捉到它在控制台中显示的实际位置?

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

1 个答案:

答案 0 :(得分:0)

我一直试图删除那些没有结果的摆动

我试图在每个坐标上圆(或在地板上)。 不能工作

我试图将每个坐标乘以100(存储为int)然后除以(再次为100),希望只留下2个小数位。 不能工作

我试图乘以除以最大(和最小)int值。 不能工作

在某些情况下,乘以并除以不那么大 int(如10000)似乎有效

我的结论是问题与浮点小数有关,在某些情况下,这些小数是四舍五入的,会产生奇怪的效果。

对不起这个糟糕的帮助