public SpriteSheet GetSpriteSheet(FrameGroupType groupType) { FrameGroup frameGroup = this.GetFrameGroup(groupType); if (frameGroup == null) { return(null); } Sprite[] sprites = this.sprites[groupType]; int totalX = frameGroup.PatternZ * frameGroup.PatternX * frameGroup.Layers; int totalY = frameGroup.Frames * frameGroup.PatternY; int bitmapWidth = (totalX * frameGroup.Width) * Sprite.DefaultSize; int bitmapHeight = (totalY * frameGroup.Height) * Sprite.DefaultSize; int pixelsWidth = frameGroup.Width * Sprite.DefaultSize; int pixelsHeight = frameGroup.Height * Sprite.DefaultSize; Bitmap bitmap = new Bitmap(bitmapWidth, bitmapHeight, PixelFormat.Format32bppArgb); Dictionary <int, Rect> rectList = new Dictionary <int, Rect>(); BitmapLocker lockBitmap = new BitmapLocker(bitmap); lockBitmap.LockBits(); for (int f = 0; f < frameGroup.Frames; f++) { for (int z = 0; z < frameGroup.PatternZ; z++) { for (int y = 0; y < frameGroup.PatternY; y++) { for (int x = 0; x < frameGroup.PatternX; x++) { for (int l = 0; l < frameGroup.Layers; l++) { int index = frameGroup.GetTextureIndex(l, x, y, z, f); int fx = (index % totalX) * pixelsWidth; int fy = (int)(Math.Floor((decimal)(index / totalX)) * pixelsHeight); rectList.Add(index, new Rect(fx, fy, pixelsWidth, pixelsHeight)); for (int w = 0; w < frameGroup.Width; w++) { for (int h = 0; h < frameGroup.Height; h++) { index = frameGroup.GetSpriteIndex(w, h, l, x, y, z, f); int px = (frameGroup.Width - w - 1) * Sprite.DefaultSize; int py = (frameGroup.Height - h - 1) * Sprite.DefaultSize; lockBitmap.CopyPixels(sprites[index].GetBitmap(), px + fx, py + fy); } } } } } } } lockBitmap.UnlockBits(); lockBitmap.Dispose(); return(new SpriteSheet(bitmap, rectList)); }
public SpriteSheet GetSpriteSheet(ushort id, ThingCategory category, FrameGroupType groupType) { ThingType thing = this.Things.GetThing(id, category); if (thing == null) { return(null); } FrameGroup group = thing.GetFrameGroup(groupType); int totalX = group.PatternZ * group.PatternX * group.Layers; int totalY = group.Frames * group.PatternY; int bitmapWidth = (totalX * group.Width) * Sprite.DefaultSize; int bitmapHeight = (totalY * group.Height) * Sprite.DefaultSize; int pixelsWidth = group.Width * Sprite.DefaultSize; int pixelsHeight = group.Height * Sprite.DefaultSize; Bitmap bitmap = new Bitmap(bitmapWidth, bitmapHeight, PixelFormat.Format32bppArgb); Dictionary <int, Rect> rectList = new Dictionary <int, Rect>(); BitmapLocker lockBitmap = new BitmapLocker(bitmap); lockBitmap.LockBits(); for (int f = 0; f < group.Frames; f++) { for (int z = 0; z < group.PatternZ; z++) { for (int y = 0; y < group.PatternY; y++) { for (int x = 0; x < group.PatternX; x++) { for (int l = 0; l < group.Layers; l++) { int index = group.GetTextureIndex(l, x, y, z, f); int fx = (index % totalX) * pixelsWidth; int fy = (int)(Math.Floor((decimal)(index / totalX)) * pixelsHeight); rectList.Add(index, new Rect(fx, fy, pixelsWidth, pixelsHeight)); for (int w = 0; w < group.Width; w++) { for (int h = 0; h < group.Height; h++) { index = group.GetSpriteIndex(w, h, l, x, y, z, f); int px = ((group.Width - w - 1) * Sprite.DefaultSize); int py = ((group.Height - h - 1) * Sprite.DefaultSize); uint spriteId = group.SpriteIDs[index]; lockBitmap.CopyPixels(this.Sprites.GetSpriteBitmap(spriteId), px + fx, py + fy); } } } } } } } lockBitmap.UnlockBits(); return(new SpriteSheet(bitmap, rectList)); }