gpt4 book ai didi

c# - Image RotateFlip 仅在直接调用时有效

转载 作者:太空宇宙 更新时间:2023-11-03 13:27:05 25 4
gpt4 key购买 nike

我有一个这样的 Sprite 类:

public class Sprite : System.ICloneable
{
public Image SpriteImage { get; private set; }
public Image SpriteMask { get; private set; }

public Sprite(Image img, Image maskImg = null)
{
this.SetImage(img, maskImg);
}

public void SetImage(Image img, Image maskImg = null)
{
this.SpriteImage = new Bitmap(img,img.Width,img.Height);

if (maskImg != null)
{
this.SpriteMask = new Bitmap(maskImg, maskImg.Width, maskImg.Height);
}
else
{
this.SpriteMask = this.SpriteImage;
}
}

public virtual object Clone()
{
return new Sprite(this.SpriteImage,this.SpriteMask);
}

public void FlipHorizontally()
{
this.SpriteImage.RotateFlip(RotateFlipType.RotateNoneFlipX);
this.SpriteMask.RotateFlip(RotateFlipType.RotateNoneFlipX);
}

public void FlipVertically()
{
this.SpriteImage.RotateFlip(RotateFlipType.RotateNoneFlipY);
this.SpriteMask.RotateFlip(RotateFlipType.RotateNoneFlipY);
}
}

因为我有 SpriteMask 和 SpriteImage,所以我创建了一个函数来轻松旋转它们。在另一个类(class)我有:

public void ChangeDirection(bool facingRight)
{
if (facingRight != this.FacingRight)
{

for(int i = 0; i < this.Sprites.Count; i++)
{
this.Sprites[i].FlipHorizontally();
}

foreach (Weapon weapon in this.CollectedWeapons)
{
weapon.ChangeDirection(facingRight);
}
this.FacingRight = facingRight;
}
}

this.Sprites 是 List<Sprite> Sprites; .现在运行这段代码时, Sprite 不会翻转,但如果我更改 sprite.FlipHorizontallythis.Sprites[i].SpriteImage.RotateFlip(RotateFlipType.RotateNoneFlipX);它工作正常。这是为什么?

最佳答案

在您的Sprite 构造函数中,您允许 Sprite 掩码参数为空。如果为空,看看你做了什么:

if (maskImg != null)
{
this.SpriteMask = new Bitmap(maskImg, maskImg.Width, maskImg.Height);
}
else
{
this.SpriteMask = this.SpriteImage;
}

您将 SpriteMask 设置为 SpriteImage - 因为图像是引用类型,所以您只分配引用。仍然只有一个 Image 对象,但两个变量都指向它。当你打电话时:

public void FlipHorizontally()
{
this.SpriteImage.RotateFlip(RotateFlipType.RotateNoneFlipX);
this.SpriteMask.RotateFlip(RotateFlipType.RotateNoneFlipX);
}

...因为 SpriteImageSpriteMask 是同一个对象,所以您正在翻转图像,然后再将其翻转回去。如果未提供蒙版,您可能会考虑为蒙版制作 Sprite 图像的副本:

if (maskImg != null)
{
this.SpriteMask = new Bitmap(maskImg, maskImg.Width, maskImg.Height);
}
else
{
this.SpriteMask = new Bitmap(this.SpriteImage);
}

关于c# - Image RotateFlip 仅在直接调用时有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22056130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com