鱼C论坛

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

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

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

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

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

x
我在easyx库中画了图,然后想让图形运动,但是在界面上半部分有一部分图形不参与运动,我想让这部分图形在刷新的同时仍然保留,想问一下有没有办法只让图形下半部分刷新
最佳答案
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()
在这个示例代码中,我们将原始位图分成了两部分:上半部分和下半部分。上半部分不需要刷新,我们将它绘制到一个临时位图上,并在主绘图区域上绘制不需要刷新的部分。在循环中,我们先绘制需要刷新的部分,然后再绘制不需要刷新的部分。这样,下半部分就会随着位图的移动而刷新,而上半部分则始终保持不变。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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`类型的变量来存储图像。另外,通过这种方式只刷新图形的下半部分是可行的,但并不是一定更高效。因为每次更新屏幕都要执行两次绘制操作,即恢复上半部分图像和绘制下半部分图像。如果图形比较简单,刷全屏的效率可能会更快一些。
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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()  函数获取整个界面的图像。在循环中,我们不断地更新动画部分,并将局部缓冲区的内容复制到屏幕上。这样,只有下半部分图形会刷新,而上半部分保持不变。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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()
在这个示例代码中,我们将原始位图分成了两部分:上半部分和下半部分。上半部分不需要刷新,我们将它绘制到一个临时位图上,并在主绘图区域上绘制不需要刷新的部分。在循环中,我们先绘制需要刷新的部分,然后再绘制不需要刷新的部分。这样,下半部分就会随着位图的移动而刷新,而上半部分则始终保持不变。
想知道小甲鱼最近在做啥?请访问 -> 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;}
想实现这些需求要怎么编函数
想知道小甲鱼最近在做啥?请访问 -> 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'
这是怎么回事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

代码报错,显示'getimage' : function does not take 4 parameters
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

解决了就不要问了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 21:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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