/// <summary> /// zeichnet ein Sprite (mit Alpha-Kanal) in ein Bitmap /// </summary> /// <param name="target">Bild, wohin das Sprite gezeichnet werden soll</param> /// <param name="fieldX">Feld X-Position</param> /// <param name="fieldY">Feld Y-Position</param> /// <param name="type">Typ des zu zeichnenden Sprites</param> /// <param name="parts">Teile des Sprites</param> public void BlitSprite(RawBitmap target, int fieldX, int fieldY, SpriteType type, SpriteParts parts = SpriteParts.All) { var targetRect = new RectInt(fieldX * spriteSize.w, fieldY * spriteSize.h, spriteSize.w, spriteSize.h); int elY = (int)type / 7; int elX = (int)type - (elY * 7); var sourceRect = new RectInt(elX * spriteSize.w, elY * spriteSize.h, spriteSize.w, spriteSize.h); switch (parts) { case SpriteParts.All: break; case SpriteParts.Left: targetRect.w /= 2; sourceRect.w /= 2; break; case SpriteParts.Right: targetRect.w /= 2; sourceRect.w /= 2; targetRect.x += spriteSize.w / 2; sourceRect.x += spriteSize.w / 2; break; case SpriteParts.Top: targetRect.h /= 2; sourceRect.h /= 2; break; case SpriteParts.Bottom: targetRect.h /= 2; sourceRect.h /= 2; targetRect.y += spriteSize.h / 2; sourceRect.y += spriteSize.h / 2; break; case SpriteParts.TopLeft: targetRect.w /= 2; targetRect.h /= 2; sourceRect.w /= 2; sourceRect.h /= 2; break; case SpriteParts.TopRight: targetRect.w /= 2; targetRect.h /= 2; sourceRect.w /= 2; sourceRect.h /= 2; targetRect.x += spriteSize.w / 2; sourceRect.x += spriteSize.w / 2; break; case SpriteParts.BottomLeft: targetRect.w /= 2; targetRect.h /= 2; sourceRect.w /= 2; sourceRect.h /= 2; targetRect.y += spriteSize.h / 2; sourceRect.y += spriteSize.h / 2; break; case SpriteParts.BottomRight: targetRect.w /= 2; targetRect.h /= 2; sourceRect.w /= 2; sourceRect.h /= 2; targetRect.x += spriteSize.w / 2; sourceRect.x += spriteSize.w / 2; targetRect.y += spriteSize.h / 2; sourceRect.y += spriteSize.h / 2; break; default: throw new Exception("unknown parts: " + (int)parts); } if (type == SpriteType.Empty) { target.FillRectangle(targetRect.x, targetRect.y, targetRect.w, targetRect.h, 0x001122); } target.BlitAlpha(targetRect.x, targetRect.y, spriteBitmap, sourceRect); }
/// <summary> /// erzeugt ein komplett neues Spielfeld /// </summary> void Init() { // alle Felder leeren, damit das gesamte Spielfeld neu gezeichnet Array.Clear(drawField.fieldData, 0, drawField.fieldData.Length); pictureBitmap = new Bitmap(drawField.width * skin.spriteSize.w, drawField.height * skin.spriteSize.h, PixelFormat.Format32bppArgb); pictureBox.Image = pictureBitmap; drawBitmap = new RawBitmap(pictureBitmap); }
/// <summary> /// Konstruktor /// </summary> /// <param name="skinFile">Skin-Datei welche geladen werden soll</param> public DrawSkin(string skinFile) { spriteBitmap = new RawBitmap(skinFile); int spriteWidth = spriteBitmap.Width / 7; int spriteHeight = spriteBitmap.Height / 8; if (spriteWidth != spriteHeight) throw new Exception("Skin-Format Error"); spriteSize = new SizeInt(spriteWidth, spriteHeight); }
/// <summary> /// zeichnet einen Bildausschnitt mit Alpha-Kanal /// </summary> /// <param name="xPos">X-Position des Bildes</param> /// <param name="yPos">Y-Position des Bildes</param> /// <param name="bitmap">Bild, welches gezeichnet werden soll</param> /// <param name="bitmapSource">Ausschnitt des Bildes, welches gezeichnet werden soll</param> public void BlitAlpha(int xPos, int yPos, RawBitmap bitmap, RectInt bitmapSource) { Debug.Assert(xPos >= 0 && xPos < size.w); Debug.Assert(yPos >= 0 && yPos < size.h); Debug.Assert(bitmapSource.w >= 0 && xPos + bitmapSource.w <= size.w); Debug.Assert(bitmapSource.h >= 0 && yPos + bitmapSource.h <= size.h); Debug.Assert(bitmapSource.x >= 0 && bitmapSource.x < bitmap.size.w); Debug.Assert(bitmapSource.y >= 0 && bitmapSource.y < bitmap.size.h); Debug.Assert(bitmapSource.x + bitmapSource.w <= bitmap.size.w); Debug.Assert(bitmapSource.y + bitmapSource.h <= bitmap.size.h); fixed (uint* pd = &data[xPos + yPos * size.w]) fixed (uint* ps = &bitmap.data[bitmapSource.x + bitmapSource.y * bitmap.size.w]) { for (int line = 0; line < bitmapSource.h; line++) { Unsafe.CopyLineAlpha(pd + line * size.w, ps + line * bitmap.size.w, bitmapSource.w); } } }