예제 #1
0
    /// <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);
    }
예제 #2
0
    /// <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);
        }
      }
    }