我有一个简单的多线程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);
我错过了这里简单的事情或者发生了什么事吗?我自己找不到任何东西。
答案 0 :(得分:1)
使用y * x + x
作为tile索引肯定是错误的。它应该是y * width + x
。