假设我有一张每张包含8个精灵的瓷砖。每一颗雪碧都是一块30×30的瓷砖。
我编写了自己的自定义地图解析器/地图加载器,但是我在从文件中提取某个瓷砖sprite时遇到了问题。我会更好地描述我的问题,以便每个人都能理解。
我写了一堆材料,每一种材料都根据其相对于瓷砖的位置有一个值。例如,空值为1,草为2,岩石为3,等等。因此,在我的瓦片中,它们是这样表示的:
+---+---+---+---+---+
| 1 | 2 | 3 | 4 | 5 |
+---+---+---+---+---+
相当于:
+------+-------+-------+
| void | grass | stone |
+------+-------+-------+
基本上,在渲染时,我创建了一个平铺类,每个平铺都有两个坐标:X和Y(它们是自动计算的),材料可以用数字表示,也可以用值(ID)表示。在渲染时,我有一个精灵向量,它们都是从一个名为tilesheet.png的文件中提取的,但是每个文件只能绘制瓷砖的某一部分,例如,我有这样的东西:
tile coordinateBounds(topLeftX, topLeftY, tileWidth, tileHeight);
在地图的初始化过程中,我计算了一个瓷砖数组,并根据地图文件中的值和其他一些变量(如冲突)给出了每个瓷砖的位置、它们的材料。我需要根据他们的物质价值对每一个人应用coordinateBounds。例如,如果材料是草,那么它应该只从栏中提取草精灵。我还必须指出,我使用的是SFML,并且在这些块之间没有边框或间隔。
发布于 2012-12-14 20:02:09
您想要绘制瓷砖中表示所需材料的部分。在SFML 1.6中,这可以通过创建一个带有sf::IntRect的裁剪区域来完成。
sf::Sprite tileSheet;
sf::IntRect clipping;
int frame = 0; //id of the material you want to draw
int columns = 5; //number of columns in the tile sheet
int frameWidth = 30;
int frameHeight = 30;
//set the clipping rectangle
clipping.Left = (frame % columns) * frameWidth;
clipping.Top = (frame / columns) * frameHeight;
clipping.Right = clipping.Left + frameWidth;
clipping.Bottom = clipping.Top + frameHeight;
//apply the clipping rectangle to the tile sheet so it knows what portion to draw
tileSheet.SetSubRect(clipping);
https://gamedev.stackexchange.com/questions/44365
复制