SFML意外的sf :: Vertex运动

问题描述 投票:0回答:1

大家好,谢谢你的阅读,

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

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)时,很明显顶点的余像(也是对角线或反向)被其余部分拖动,并且在几帧后它跳到了想要的位置,然后重复由于数组中的每个对象都是这样做并且重叠到前一个对象上,因此摆动效应就会产生

我正在失去理智。我该怎么做才能阻止拖动并将其捕捉到它在控制台中显示的实际位置?

附:我省略了浮动包装器,因为它没有帮助并使其可读性降低(也忽略了一些当前未使用的功能):)

先感谢您!

#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; }
};
c++ sfml
1个回答
0
投票

我一直试图消除那种没有结果的摆动。

我试图在每个坐标上进行圆形(或测试)。不行

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

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

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

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

对不起这个糟糕的帮助

© www.soinside.com 2019 - 2024. All rights reserved.