没有在指定位置绘制的精灵

时间:2015-02-02 20:34:42

标签: c++ multithreading 2d sprite sfml

我有一个简单的多线程2D程序,它试图绘制一个16 x 16精灵/图块视图,其中每个图块的大小为32x32像素。

首先,在主线程中,我为每个tile创建一个类的实例,每个实例都包含一个sprite:

Tile.h

class Tile
{
    Point2D pos;
    public:
    Point2D getPos() { return pos; }
    sf::Sprite getSprite() { return sprite; }
    sf::Sprite sprite;
    Tile(int _x, int _y, int _type);
    ~Tile();
};

World.cpp构造函数

    for (size_t y = 0; y < WORLD_HEIGHT; y++) {
    for (size_t x = 0; x < WORLD_WIDTH; x++) {
         tiles.push_back(Tile(x, y, 0));
    }
}

Tile.cpp

Tile::Tile(int _x, int _y, int _type) {
pos = Point2D(_x, _y);

sprite.setTexture(world->rm->dirt); 
sprite.setPosition(world->TILE_WIDTH * _x, world->TILE_HEIGHT * _y);

}

到目前为止,一切似乎都很好,事实上当我在这里打印出所有值时,值就像我预期的那样,_x_y的增量为1,因为它们来自循环,sprite.setPosition()获得32的增量,例如0,32,64等作为参数传递。

初始化此视图后,然后在另一个线程中绘制精灵:

的main.cpp

void renderingThread(sf::RenderWindow* window) {

// the rendering loop
while (window->isOpen()) {
    window->clear();
    for (size_t y = 0; y < world->WORLD_HEIGHT; y++) {
        for (size_t x = 0; x < world->WORLD_WIDTH; x++) {
            window->draw(world->tiles[y * x + x].sprite);
        }
    }
    window->display();
}
}

在这里,值变得奇怪,导致这样的视图: https://drive.google.com/file/d/0BxYb1RtxJEu8bGRRaEFORHY2enM/view?usp=sharing

在绘制前重置精灵在渲染循环中的位置无效:

world->tiles[y * x + x].sprite.setPosition(world->tiles[y * x + x].getPos().x * 32, world->tiles[y * x + x].getPos().y * 32);

我错过了这里简单的事情或者发生了什么事吗?我自己找不到任何东西。

1 个答案:

答案 0 :(得分:1)

使用y * x + x作为tile索引肯定是错误的。它应该是y * width + x