大苏打dd 发表于 2023-4-28 21:45:40

easyx库能不能对界面的一部分进行刷新

我在easyx库中画了图,然后想让图形运动,但是在界面上半部分有一部分图形不参与运动,我想让这部分图形在刷新的同时仍然保留,想问一下有没有办法只让图形下半部分刷新

sfqxx 发表于 2023-4-28 21:47:31

有办法只让图形下半部分刷新。使用EasyX的`getimage()`和`putimage()`函数可以在内存中保存当前屏幕上的图像,然后使用`putimage()`函数将保存的图像恢复到屏幕上,从而达到保留图形的效果。

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

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

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

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

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

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


#include <graphics.h>

int main()
{
    initgraph(640, 480);
   
    // 保存上半部分图形
    IMAGE upperImage = getimage(0, 0, 640, 240);

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

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

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

    closegraph();
    return 0;
}


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

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

isdkz 发表于 2023-4-28 21:49:23

EasyX 是一个用于 C++ 的图形库,用于绘制简单的图形和图像处理。EasyX 支持局部刷新。要实现局部刷新,您可以使用putimage()和getimage()函数结合双缓冲技术来完成。以下是一个简单的示例:

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

int main()
{
    initgraph(640, 480);
    setbkcolor(WHITE);
    cleardevice();

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

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

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

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

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

      Sleep(10); // 延迟 10 毫秒
    }

    closegraph();
    return 0;
}


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

陶远航 发表于 2023-4-29 11:12:40

在easyx中,你可以使用putimage函数在指定的位置绘制位图,如果你想让位图的一部分不参与刷新,可以先将该部分绘制到另外一个位图上,然后在主绘图区域上绘制不需要刷新的部分。下面是一个示例代码,演示如何实现这个功能:
from easygraphics import *

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

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

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

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

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

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

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

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

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

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

    # 刷新屏幕
    delay_fps(60)

# 关闭图形窗口
close_graph()

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

大苏打dd 发表于 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;}
想实现这些需求要怎么编函数

大苏打dd 发表于 2023-4-30 14:10:17

isdkz 发表于 2023-4-28 21:49
EasyX 是一个用于 C++ 的图形库,用于绘制简单的图形和图像处理。EasyX 支持局部刷新。要实现局部刷新,您 ...

代码报错,显示cannot convert parameter 5 from 'class IMAGE *' to 'int'
这是怎么回事

大苏打dd 发表于 2023-4-30 14:10:53

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

代码报错,显示'getimage' : function does not take 4 parameters

sfqxx 发表于 2023-4-30 14:12:13

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

解决了就不要问了

页: [1]
查看完整版本: easyx库能不能对界面的一部分进行刷新