コード例 #1
0
ファイル: DrawSkin.cs プロジェクト: MaxKlaxxMiner/SokoWahn
    /// <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
ファイル: DrawSystem.cs プロジェクト: MaxKlaxxMiner/SokoWahn
 /// <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);
 }
コード例 #3
0
ファイル: DrawSkin.cs プロジェクト: MaxKlaxxMiner/SokoWahn
    /// <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);
    }
コード例 #4
0
ファイル: RawBitmap.cs プロジェクト: MaxKlaxxMiner/SokoWahn
    /// <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);
        }
      }
    }