旋转块时如何修复块之间的间距?

时间:2019-05-27 23:14:32

标签: c++ sfml

您好,我目前正在尝试旋转正方形内的块。但是,当我开始旋转它们时,它开始在不需要的块之间创建怪异的空间。您能帮我解决砌块之间的间距问题吗?这是一些代码和屏幕截图,看起来如何。

https://imgur.com/a/BLuO7FF

我已经检查了所有角度和半径是否正确计算,并且在那里没有发现任何问题。

World.h

#pragma once
#include <SFML/Graphics.hpp>

class World
{
public:
    World(sf::Vector2f Wpos);

    float AngleToRadian(int angle);
    void RotateWorld();
    void draw(sf::RenderWindow &window);

    sf::Texture tx;
    sf::Sprite** Block;
    sf::Vector2f Pos;
    sf::Vector2i Size;
    float** radius;
    float** angle;
}; 

World.cpp

#include "World.h"
#include <SFML/Graphics.hpp>
#include <iostream>
#include <cmath>

#define PI 3.14159

World::World(sf::Vector2f Wpos)
{
    Pos = Wpos;
    Size = sf::Vector2i(10, 10);

    Block = new sf::Sprite*[Size.y];
    radius = new float*[Size.y];
    angle = new float*[Size.y];

    for (int i = 0; i < Size.y; i++)
    {
        Block[i] = new sf::Sprite[Size.x];
        radius[i] = new float[Size.x];
        angle[i] = new float[Size.x];
    }

    tx.loadFromFile("Img/Block.png");
    sf::Vector2i off(Size.x * tx.getSize().x / 2, Size.y * tx.getSize().y / 2); //tx size is 32px x 32px

    for (int y = 0; y < Size.y; y++)
    {
        for (int x = 0; x < Size.x; x++)
        {
            Block[y][x].setTexture(tx);
            Block[y][x].setOrigin(tx.getSize().x / 2, tx.getSize().y / 2);
            Block[y][x].setPosition(x*tx.getSize().x + Wpos.x - off.x + Block[y][x].getOrigin().x, y*tx.getSize().y + Wpos.y - off.y + Block[y][x].getOrigin().y);

            radius[y][x] = sqrt(pow(Pos.x - Block[y][x].getPosition().x, 2) + pow(Pos.y - Block[y][x].getPosition().y, 2));

            angle[y][x] = (atan2(Block[y][x].getPosition().y - Pos.y, Block[y][x].getPosition().x - Pos.x) * 180.0) / PI;

            if ((atan2(Block[y][x].getPosition().y - Pos.y, Block[y][x].getPosition().x - Pos.x) * 180.0) / PI < 0)
            {
                angle[y][x] += 360;
            }

            //angle[y][x] = round(angle[y][x]);
            /*radius[y][x] = round(radius[y][x]);*/
        }
    }
}

void World::RotateWorld()
{
    float dx = 0, dy = 0;

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::E))
    {
        for (int y = 0; y < Size.y; y++)
        {
            for (int x = 0; x < Size.x; x++)
            {
                Block[y][x].rotate(1);
                if (angle[y][x] >= 360)
                {
                    angle[y][x] = 0;
                }
                angle[y][x]++;

                dx = cos(AngleToRadian(angle[y][x])) * radius[y][x];
                dy = sin(AngleToRadian(angle[y][x])) * radius[y][x];

                Block[y][x].setPosition(Pos.x + dx, Pos.y + dy);
            }
        }
    }
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Q))
    {
        for (int y = 0; y < Size.y; y++)
        {
            for (int x = 0; x < Size.x; x++)
            {
                Block[y][x].rotate(-1);
                if (angle[y][x] >= 360)
                {
                    angle[y][x] = 0;
                }
                angle[y][x]--;

                dx = cos(AngleToRadian(angle[y][x])) * radius[y][x];
                dy = sin(AngleToRadian(angle[y][x])) * radius[y][x];

                Block[y][x].setPosition(Pos.x + dx, Pos.y + dy);
            }
        }
    }
}

我希望它可以旋转,之间没有任何间隔。如果有人能帮助我,我将非常感激。

1 个答案:

答案 0 :(得分:1)

我会尝试使用sf::Sprite方法而不是getGlobalBounds()大小获取器来设置sf::Texture的原点。

差异似乎很小,也许是这种情况。

    Block[y][x].setTexture(tx);
    Block[y][x].setOrigin(Block[y][x].getGlobalBouds().width / 2, Block[y][x].getGlobalBouds().height / 2);
    Block[y][x].setPosition(x*Block[y][x].getGlobalBouds().width + Wpos.x - off.x + Block[y][x].getOrigin().x, y*Block[y][x].getGlobalBouds().height + Wpos.y - off.y + Block[y][x].getOrigin().y);