对于我在C-SDL中的视频游戏,我需要使用自己制作的spritesheet。 图片大小为100x100,我想拍的每张图片为25x25
我找到了一个很好的功能,可以为我做到这一点:
// Wraps a rectangle around every sprite in a sprite sheet and stores it in an array of rectangles(Clip[])
void spriteSheet(){
int SpriteWidth = 25; int SpriteHeight= 25; int SheetDimension = 4;
int LeSprites = SheetDimension * SheetDimension;// Number of Sprites on sheet
SDL_Rect Clip[LeSprites]; // Rectangles that will wrap around each sprite
int SpriteXNum = 0;// The number sprite going from left to right
int SpriteYNum = 0;// The number sprite going from top to bottom
int YIncrement = 0;// Increment for each row.
int i = 0;
for(i = 0; i< LeSprites; i++){// While i is less than number of sprites
if(i = 0){// First sprite starts at 0,0
Clip[i].x = 0;
Clip[i].y = 0;
Clip[i].w = SpriteWidth;
Clip[i].h = SpriteHeight;
}
else{
if(SpriteXNum < SheetDimension - 1 ){// If we have reached the end of the row, go back to the front of the next row
SpriteXNum = 0;
}
if(YIncrement < SheetDimension - 1){
SpriteYNum += 1; // Example of 4X4 Sheet
} // ________________
Clip[i].x = SpriteWidth * SpriteXNum; // | 0 | 1 | 2 | 3 |
Clip[i].y = SpriteHeight * SpriteYNum; // |===============|
// | 0 | 1 | 2 | 3 |
// |===============|
Clip[i].w = SpriteWidth; // | 0 | 1 | 2 | 3 |
Clip[i].h = SpriteHeight; // |===============|
// | 0 | 1 | 2 | 3 |
} // |---------------|
SpriteXNum++;
YIncrement++;
}
}
但现在我不知道怎样才能加载我的(png)图片来应用这个功能。
答案 0 :(得分:1)
看起来这段代码只为你提供了精灵表每个方格的剪裁坐标。它似乎根本不与图像交互。
如果您要加载PNG,则应使用额外的SDL_image library。它将生成一个SDL_Surface
指针,当您调用SDL_BlitSurface
将其绘制到屏幕时,可以将其与剪切坐标一起使用。
请注意,您应该尝试从图像本身获取SpriteDimension
等值(通过将图像宽度(w
)和高度(h
)除以个人精灵)。
将来,您可以通过设计一个SpriteSheet类来扩展这个想法,该类保存其计算的剪切位置和有关精灵表的其他信息,并根据需要将调用包装到SDL_BlitSurface
。