鱼C论坛

 找回密码
 立即注册
查看: 3394|回复: 7

[已解决]easyx库能不能对界面的一部分进行刷新

[复制链接]
发表于 2023-4-28 21:45:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我在easyx库中画了图,然后想让图形运动,但是在界面上半部分有一部分图形不参与运动,我想让这部分图形在刷新的同时仍然保留,想问一下有没有办法只让图形下半部分刷新
最佳答案
2023-4-29 11:12:40
在easyx中,你可以使用putimage函数在指定的位置绘制位图,如果你想让位图的一部分不参与刷新,可以先将该部分绘制到另外一个位图上,然后在主绘图区域上绘制不需要刷新的部分。下面是一个示例代码,演示如何实现这个功能:
  1. from easygraphics import *

  2. # 初始化画布
  3. init_graph(640, 480)

  4. # 加载需要绘制的位图
  5. image = load_image("test.png")

  6. # 获取位图的宽度和高度
  7. w, h = image.get_size()

  8. # 创建一个临时位图,用于存储不需要刷新的部分
  9. tmp = create_image(w, h // 2)

  10. # 在临时位图上绘制不需要刷新的部分
  11. set_target(tmp)
  12. set_color(Color.WHITE)
  13. set_fill_color(Color.WHITE)
  14. draw_rectangle(0, 0, w, h // 2)

  15. # 恢复目标为主绘图区域
  16. set_target()

  17. # 循环绘制位图,并让它向下移动
  18. y = -h // 2
  19. while is_run():
  20.     clear_device()

  21.     # 绘制需要刷新的部分
  22.     putimage(0, y + h // 2, image)

  23.     # 绘制不需要刷新的部分
  24.     putimage(0, 0, tmp)

  25.     # 计算下一帧的位置
  26.     y += 1
  27.     if y > h // 2:
  28.         y = -h // 2

  29.     # 刷新屏幕
  30.     delay_fps(60)

  31. # 关闭图形窗口
  32. close_graph()
复制代码

在这个示例代码中,我们将原始位图分成了两部分:上半部分和下半部分。上半部分不需要刷新,我们将它绘制到一个临时位图上,并在主绘图区域上绘制不需要刷新的部分。在循环中,我们先绘制需要刷新的部分,然后再绘制不需要刷新的部分。这样,下半部分就会随着位图的移动而刷新,而上半部分则始终保持不变。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-4-28 21:47:31 | 显示全部楼层
有办法只让图形下半部分刷新。使用EasyX的`getimage()`和`putimage()`函数可以在内存中保存当前屏幕上的图像,然后使用`putimage()`函数将保存的图像恢复到屏幕上,从而达到保留图形的效果。

你可以按照以下步骤操作:

1. 在程序开始画图之前,使用`getimage()`函数将上半部分的图形保存到内存中。

2. 在每次刷新屏幕之前,使用`putimage()`函数将保存的图像恢复到屏幕上。

3. 接着,再绘制下半部分要运动的图形。

4. 最后,调用`FlushBatchDraw()`函数更新屏幕显示。

下面是实现这个功能的代码示例:


  1. #include <graphics.h>

  2. int main()
  3. {
  4.     initgraph(640, 480);
  5.    
  6.     // 保存上半部分图形
  7.     IMAGE upperImage = getimage(0, 0, 640, 240);

  8.     while (true)
  9.     {
  10.         // 恢复上半部分图形
  11.         putimage(0, 0, &upperImage);

  12.         // 绘制下半部分图形
  13.         setfillcolor(YELLOW);
  14.         fillellipse(320, 360, 50, 50);

  15.         FlushBatchDraw();   // 更新屏幕显示
  16.     }

  17.     closegraph();
  18.     return 0;
  19. }
复制代码


上面的代码先使用`getimage()`函数将屏幕上的上半部分图形保存到`upperImage`变量中。然后在每次更新屏幕之前,使用`putimage()`函数将这个图像恢复到屏幕上,再绘制下半部分图形。最后,调用`FlushBatchDraw()`函数更新屏幕显示。

注意,在使用`getimage()`和`putimage()`函数时,需要使用`IMAGE`类型的变量来存储图像。另外,通过这种方式只刷新图形的下半部分是可行的,但并不是一定更高效。因为每次更新屏幕都要执行两次绘制操作,即恢复上半部分图像和绘制下半部分图像。如果图形比较简单,刷全屏的效率可能会更快一些。
有用请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-28 21:49:23 | 显示全部楼层
EasyX 是一个用于 C++ 的图形库,用于绘制简单的图形和图像处理。EasyX 支持局部刷新。要实现局部刷新,您可以使用  putimage()  和  getimage()  函数结合双缓冲技术来完成。以下是一个简单的示例:

  1. #include <graphics.h>
  2. #include <conio.h>

  3. int main()
  4. {
  5.     initgraph(640, 480);
  6.     setbkcolor(WHITE);
  7.     cleardevice();

  8.     // 画一个不需要移动的矩形
  9.     setfillcolor(RED);
  10.     solidrectangle(10, 10, 100, 50);

  11.     // 准备动画部分
  12.     IMAGE movingPart;
  13.     getimage(0, 0, 640, 480, &movingPart); // 获取整个界面的图像
  14.     int y = 200;
  15.     int dy = 1;

  16.     while (!_kbhit()) // 按任意键退出
  17.     {
  18.         // 创建一个局部的缓冲区
  19.         IMAGE buffer;
  20.         getimage(0, y, 640, 480 - y, &buffer); // 获取需要刷新的部分
  21.         clearrectangle(0, y, 640, 480); // 清除需要刷新的部分

  22.         // 绘制动画
  23.         circle(320, y + 50, 50);
  24.         y += dy;
  25.         if (y > 400 || y < 200) dy = -dy;

  26.         // 将缓冲区的内容复制到屏幕上
  27.         putimage(0, y, &buffer, SRCCOPY);

  28.         Sleep(10); // 延迟 10 毫秒
  29.     }

  30.     closegraph();
  31.     return 0;
  32. }
复制代码


这个示例中,我们首先绘制一个不需要移动的矩形。然后,我们通过  getimage()  函数获取整个界面的图像。在循环中,我们不断地更新动画部分,并将局部缓冲区的内容复制到屏幕上。这样,只有下半部分图形会刷新,而上半部分保持不变。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-29 11:12:40 | 显示全部楼层    本楼为最佳答案   
在easyx中,你可以使用putimage函数在指定的位置绘制位图,如果你想让位图的一部分不参与刷新,可以先将该部分绘制到另外一个位图上,然后在主绘图区域上绘制不需要刷新的部分。下面是一个示例代码,演示如何实现这个功能:
  1. from easygraphics import *

  2. # 初始化画布
  3. init_graph(640, 480)

  4. # 加载需要绘制的位图
  5. image = load_image("test.png")

  6. # 获取位图的宽度和高度
  7. w, h = image.get_size()

  8. # 创建一个临时位图,用于存储不需要刷新的部分
  9. tmp = create_image(w, h // 2)

  10. # 在临时位图上绘制不需要刷新的部分
  11. set_target(tmp)
  12. set_color(Color.WHITE)
  13. set_fill_color(Color.WHITE)
  14. draw_rectangle(0, 0, w, h // 2)

  15. # 恢复目标为主绘图区域
  16. set_target()

  17. # 循环绘制位图,并让它向下移动
  18. y = -h // 2
  19. while is_run():
  20.     clear_device()

  21.     # 绘制需要刷新的部分
  22.     putimage(0, y + h // 2, image)

  23.     # 绘制不需要刷新的部分
  24.     putimage(0, 0, tmp)

  25.     # 计算下一帧的位置
  26.     y += 1
  27.     if y > h // 2:
  28.         y = -h // 2

  29.     # 刷新屏幕
  30.     delay_fps(60)

  31. # 关闭图形窗口
  32. close_graph()
复制代码

在这个示例代码中,我们将原始位图分成了两部分:上半部分和下半部分。上半部分不需要刷新,我们将它绘制到一个临时位图上,并在主绘图区域上绘制不需要刷新的部分。在循环中,我们先绘制需要刷新的部分,然后再绘制不需要刷新的部分。这样,下半部分就会随着位图的移动而刷新,而上半部分则始终保持不变。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-30 13:16:12 | 显示全部楼层
isdkz 发表于 2023-4-28 21:49
EasyX 是一个用于 C++ 的图形库,用于绘制简单的图形和图像处理。EasyX 支持局部刷新。要实现局部刷新,您 ...

不好意思 ,我不知道为什么不能发出新帖,想在这里问您一个关于if函数的问题,希望能帮忙看看
我想用if函数实现
如果ht=灰铁200 或者=灰铁150 或者=灰铁100,且Ra≥6.3,则{TD=32,a1=496,b1=162,L1=40,L2=15,L3=32,B1=40,H1=32,hh=2.6;}
如果ht不为上面几种材质,或者Ra<6.3,则{TD=32,a1=196,b1=162,L1=40,L2=15,L3=32,B1=40,H1=32,hh=2.6;}
想实现这些需求要怎么编函数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-30 14:10:17 | 显示全部楼层
isdkz 发表于 2023-4-28 21:49
EasyX 是一个用于 C++ 的图形库,用于绘制简单的图形和图像处理。EasyX 支持局部刷新。要实现局部刷新,您 ...

代码报错,显示cannot convert parameter 5 from 'class IMAGE *' to 'int'
这是怎么回事
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-30 14:10:53 | 显示全部楼层
sfqxx 发表于 2023-4-28 21:47
有办法只让图形下半部分刷新。使用EasyX的`getimage()`和`putimage()`函数可以在内存中保存当前屏幕上的图 ...

代码报错,显示'getimage' : function does not take 4 parameters
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-30 14:12:13 | 显示全部楼层
大苏打dd 发表于 2023-4-30 14:10
代码报错,显示'getimage' : function does not take 4 parameters

解决了就不要问了

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-9 20:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表