EasyX擦除绘制的透明背景图实现画面刷新

这是我的show函数和unshow函数,show函数用于用原码图与掩码图绘制透明背景的图片,unshow函数用于擦除之前画的图,实现游戏画面的刷新,但是实际调试中发现会留下痕迹,请教一下该如何修改unshow函数实现擦除之前画的图并不影响背景?

//环境:VC2022+EasyX
void Player::show()
{
    putimage(x, y, &img_Player[direction + status + 4], NOTSRCERASE);//画掩码图
    putimage(x, y, &img_Player[direction + status ], SRCINVERT);//画原码图
}

void Player::unshow()
{
    putimage(x, y, &img_Player[direction + status + 4], SRCPAINT);
}

img

该回答引用ChatGPT-3.5,仅供参考,不保证完全正确

根据你提供的代码,可以看出问题出在unshow函数的实现上。目前的unshow函数使用SRCPAINT模式来擦除之前画的图像,但这会导致背景图像受到影响。为了解决这个问题,你可以尝试以下修改:

void Player::unshow()
{
    // 创建一个与掩码图像大小相同的临时图像
    IMAGE tempImage;
    GetImage(&tempImage, x, y, img_Player[direction + status + 4].getwidth(), img_Player[direction + status + 4].getheight());
    
    // 将临时图像与掩码图像进行合成,以恢复背景
    putimage(x, y, &tempImage, SRCCOPY);
}

这里的修改思路是将之前绘制的掩码图像与临时图像进行合成,以恢复背景。首先,我们使用GetImage函数从屏幕上获取与掩码图像相同大小的临时图像。然后,使用putimage函数将临时图像与掩码图像进行合成,并采用SRCCOPY模式,这样就可以将之前的绘制内容擦除而不影响背景图像。


请注意,这种方法假设背景图像在每次刷新时都是一致的。如果背景图像也在刷新或改变,你可能需要采取其他方法来恢复背景,比如在每次绘制之前保存背景图像的副本,并在擦除时将其重新绘制。


该回答引用NewBing,仅供参考,不保证完全正确

根据我从网络上搜索到的信息,你的 unshow 函数可能有以下问题:

  • 你没有使用 SRCINVERT 模式来擦除原码图,而是使用了 SRCPAINT 模式,这会导致原码图和背景图的颜色混合,而不是还原。
  • 你没有考虑到透明度的影响,如果你的原码图有透明度,那么擦除时也需要考虑透明度的计算,否则会出现残影。

我建议你参考以下网页中的方案来修改你的 unshow 函数:

  • EasyX 绘制透明背景图 - Bluemultipl - 博客园:这篇博客介绍了如何使用三元光栅操作来绘制和擦除带有透明背景的图像,其中有一个 drawAlpha 函数可以设置透明度参数,并且给出了具体的公式和代码。
  • EasyX Graphics Library for C++:这是 EasyX 官方网站,提供了 EasyX 的安装、使用、参考手册等信息,其中有一个 cleardevice 函数可以清空整个绘图区域,如果你不需要保留背景图,可以直接使用这个函数来擦除之前画的图。
  • 小白基础知识必备||C语言图形库:Easy X库 - 知乎:这篇文章介绍了 EasyX 的基本概念和功能,以及一些常用的绘图函数和示例代码,可以帮助你快速上手 EasyX 图形编程。

源: 与必应的对话, 2023/7/18
(1) EasyX 绘制透明背景图 - Bluemultipl - 博客园. https://www.cnblogs.com/Bluemultipl/p/15947876.html.
(2) EasyX Graphics Library for C++. https://easyx.cn/.
(3) 小白基础知识必备||C语言图形库:Easy X库 - 知乎. https://zhuanlan.zhihu.com/p/248871203.
(4) undefined. https://easyx.cn/setup.
(5) undefined. https://docs.easyx.cn/.
(6) undefined. https://easyx.cn/used-in-vc6-console.
(7) undefined. https://easyx.cn/used-in-vc6-win32.
(8) undefined. https://easyx.cn/used-in-vc2010-console.
(9) undefined. https://easyx.cn/used-in-vc2010-win32.
(10) undefined. https://codebus.cn/.