在错误的位置绘制瓷砖

时间:2017-06-07 22:32:20

标签: c++ drawing sfml

我终于设法以正确的方式在屏幕上绘制了我的瓷砖。虽然位置有点偏,我似乎无法弄明白为什么......

我使用SFML绘图。

Tile.hpp:

#ifndef TILE_HPP
#define TILE_HPP

#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>

#include "textureManager.hpp"

class Tile {
public:
    Tile();
    Tile(sf::Vector2i coord, int biome);
    ~Tile();

    sf::Vector2i getCoord() const { return coord; };
    int getBiome() const { return biome; };

    void setCoord(sf::Vector2i coord) { this->coord = coord; };
    void setBiome(int biome) { this->biome = biome; };

    void draw(int x, int y, sf::RenderWindow* rw);
    void update(sf::Texture& texture);

private:
    sf::Vector2i coord;
    int biome;

    sf::Sprite sprite;
};

#endif

Tile.cpp

#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>

#include "textureManager.hpp"
#include "tile.hpp"

Tile::Tile()
{}

Tile::Tile(sf::Vector2i coord, int biome) {
    this->biome = biome;
    this->coord = coord;
}

Tile::~Tile(){}

void Tile::draw(int x, int y, sf::RenderWindow* rw)
{
    sprite.setPosition(x, y);
    rw->draw(sprite);
}

void Tile::update(sf::Texture& texture)
{
    switch (biome)
    {
        // Not important here
    }
}

现在更相关的部分:图纸

void StatePlay::draw(const float dt)
{
    game->window.setView(view);
    game->window.clear(sf::Color::Black);

    sf::Vector2f offset = camera.getLocation();
    int newX = (offset.x / map.getTileSize()) - (map.chunkSize / 2);
    int newY = (offset.y / map.getTileSize()) - (map.chunkSize / 2);

    for (int x = 0; x < map.chunkSize; x++)
    {
        for (int y = 0; y < map.chunkSize; y++)
            {
                Tile tile = map.getTile(newX + x, newY + y);
                tile.draw((newX + x) * map.getTileSize(), (newY + y) * map.getTileSize(), &game->window);
            }
        }

    return;
}

StatePlay::StatePlay(Game* game)
{
    this->game = game;
    sf::Vector2f pos = sf::Vector2f(game->window.getSize()); // 1366x768
    view.setSize(pos);
    pos *= 0.5f; // 688x384
    view.setCenter(pos);

    // Initialize map
    map.init(game->gameTime, game->textureManager.getImage("tileset.png"));

    float w     = (float) map.getWidth(); // 500
    float h     = (float) map.getHeight(); // 500
    w           *= 0.5f; // 250
    h           *= 0.5f; // 250
    w           *= map.getTileSize(); // 250 * 32 = 8000
    h           *= map.getTileSize(); // 250 * 32 = 8000
    // Move camera
    // Uses view::move from sfml to move the view with w and h
    // Also sets camera private to w and h values, return with camera::getLocation()
    camera.setLocation(&view, sf::Vector2f(w, h));
}

结果是我只在屏幕的左下角看到了~10个方块,覆盖了大约3/4。

Example

选择了正确的图块,但绘制位置错误...它应该绘制64x64(每个x 32px)图块的中心,尽可能多地适合屏幕。

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题。这是一个非常愚蠢的错误......

首先不绘制任何内容,将视图置于0.5f * sf::View::getSize()的中心以使视图居中显示在窗口中是正常的。所以中心已经是我窗户大小的一半。使用Camera::setLocation()时,我使用sf::View::move()相应地移动视图。所以当试图将它放在地图上时,它正确地添加了x和y,但也是我窗口大小的一半。这导致偏移量不正确。提取或遗漏这些价值已经解决了这个愚蠢的问题。

感谢您的帮助。