【C/C++积累技巧】实现 连续播放文件图片+逐帧文本显示, 同时 可以按任意键退出(基于easyx小游戏编程)

技巧一、使用 IMAGE数组+循环:实现【连续播放图片】

(1)一张图片如何放映在 图形化窗口上:借用两个函数

#include<graphics.h> // 函数的头文件


IMAGE imgMy; // 图形变量
loadimage(&imgMy, "写入你想显示的图片路径"); // 加载目标图片进入图形变量imgMy
putimage(x, y, &imgMy);  // (x, y) 指图片放映的左上角坐标(就是你想要图片在什么位置,自己调就好)




总结功能
loadimage函数  加载目标图片进入图形变量imgMy
putimage函数 将图片展示出来

(3)如何连续播放一个文件内的很多张图片??

难点攻破:

难点1:如何存储这么多图片

        使用 IMAGE 数组:

/*
举例:我想要连续播放的图片 一共 78 张
*/

IMAGE imgWelcome[78];
难点2:根据loadimage函数,需要写入图片的路径,而每张图片路径不同,怎么处理?

可以将  不同路径  变成字符串,  存入字符串数组,然后再输入  loadimage函数,接着直接 使用 putimage函数 播放图片

注释比较清楚了,看注释就行

char name[64];
for (int i = 0; i < 78; ++i) {

    // 通过这个 sprintf_s 将 路径 "welcome/(%d).png" 写入 字符数组name
    // 同时路径中的 %d 也在变化,这个是我图片文件中,每一张图片的编号
    // 通过循环,使得每一张图片都可以被播放
	sprintf_s(name, sizeof(name), "welcome/(%d).png", i + 1); 


	loadimage(&imgWelcome[i], name);  // 路径 就是name了
	putimage(0, 0, &imgWelcome[i]);

	Sleep(40); // 这个是休眠 40ms 以控制图片播放的速度
}

通过循环,就是实现了 图片的连续播放

注意:由于循环改变的是 i ,因此你那些图片的命名格式应该一样,只可以有 编号 %d 不同,如下图


效果演示

难点3:文字如何打印显示到 窗口上?

通过一套模板:你只需要修改你想要的参数就好

// 输出文字的模板
// for循环里面就是逐帧播放图片,我们也要逐帧显示文字

char Text[64] = "按任意键进入游戏";   // 你想要写的文本

// 设置输出效果为:Text
setcolor(RGB(180, 180, 180)); // 设置颜色(非必要):设置 RGB参数
LOGFONT f;
gettextstyle(&f);							// 获取当前字体设置
f.lfHeight = 100;						// 设置字体高度为 100, 宽度不用设置:会自适应
_tcscpy(f.lfFaceName, _T("黑体"));		// 设置字体为“黑体”(推荐使用 _tcscpy_s 函数)
f.lfQuality = ANTIALIASED_QUALITY;		// 设置输出效果为抗锯齿  
settextstyle(&f);							// 设置字体样式
outtextxy(50, 50, Text);                // (50, 50) 是你想要文字显示的位置左上角坐标(x, y)
                                        // 单位:像素


效果

注意:由于你需要每一张图片都有文字,即为 逐帧播放,因此,你的文字显示 的相关函数要写在 前面讲过的 连续播放图片的 for循环中

for (int i = 0; i < 78; ++i) {

	sprintf_s(name, sizeof(name), "welcome/(%d).png", i + 1);
	loadimage(&imgWelcome[i], name);
	putimage(0, 0, &imgWelcome[i]);


	// 输出文字的模板
	// for循环里面就是逐帧播放图片,我们也要逐帧显示文字

	char Text[64] = "按任意键进入游戏";   // 你想要写的文本

	// 设置输出效果为:Text
	setcolor(RGB(180, 180, 180)); // 设置颜色(非必要):设置 RGB参数
	LOGFONT f;
	gettextstyle(&f);							// 获取当前字体设置
	f.lfHeight = 100;						// 设置字体高度为 100, 宽度不用设置:会自适应
	_tcscpy(f.lfFaceName, _T("黑体"));		// 设置字体为“黑体”(推荐使用 _tcscpy_s 函数)
	f.lfQuality = ANTIALIASED_QUALITY;		// 设置输出效果为抗锯齿  
	settextstyle(&f);							// 设置字体样式
	outtextxy(50, 50, Text);                // (50, 50) 是你想要文字显示的位置左上角坐标(x, y)


	Sleep(40);
}

动图效果演示:

难点4:有没有发现,上面动图有 闪烁现象,如何消除闪烁?

使用这两个函数可以消除闪烁:将一次显示的所有图片的相关程序,写在这两个函数中间

BeginBatchDraw();
// ........相关程序
EndBatchDraw();
for (int i = 0; i < 78; ++i) {

    BeginBatchDraw();///

	sprintf_s(name, sizeof(name), "welcome/(%d).png", i + 1);
	loadimage(&imgWelcome[i], name);
	putimage(0, 0, &imgWelcome[i]);


	// 输出文字的模板
	// for循环里面就是逐帧播放图片,我们也要逐帧显示文字

	char Text[64] = "按任意键进入游戏";   // 你想要写的文本

	// 设置输出效果为:Text
	setcolor(RGB(180, 180, 180)); // 设置颜色(非必要):设置 RGB参数
	LOGFONT f;
	gettextstyle(&f);							// 获取当前字体设置
	f.lfHeight = 100;						// 设置字体高度为 100, 宽度不用设置:会自适应
	_tcscpy(f.lfFaceName, _T("黑体"));		// 设置字体为“黑体”(推荐使用 _tcscpy_s 函数)
	f.lfQuality = ANTIALIASED_QUALITY;		// 设置输出效果为抗锯齿  
	settextstyle(&f);							// 设置字体样式
	outtextxy(50, 50, Text);             // (50, 50) 是你想要文字显示的位置左上角坐标(x, y)

    
    EndBatchDraw();///
	Sleep(40);
}


 技巧二、使用 _kbhit() 函数:实现 【按任意键退出】

这篇文章讲得比较细了:http://t.csdnimg.cn/S3qW9

原理:

程序执行到_kbhit()时,等待输入,但是不会停止而是继续运行,有输入时kbhit()才就返回一个非零值,否则返回0。(这个不会停下等你输入,而是你任意时间输入,它才响应,不会打断你图片的播放!)

使用:_kbhit() 在有输入时返回 1,即你输入任意键 while 循环退出实现按任意键退出

// _kbhit()函数的头文件
#include<conio.h>


#include <iostream> 
using std::cout;

// 使用样例
int main()
{
	// _kbhit() 在有输入时返回 1,即你输入任意键 while 循环退出:实现按任意键退出
    // 否则会一直打印:"Now input now!\n"

	while (!_kbhit())
	{
		cout << "Now input now!\n";
	}

	return 0;
}

对于 上面讲解的连续播放图片,只有一个 for循环 只能播放一轮,播放完 78张图片就会结束(我举的例子是78张图片)

要想不停的播放,可以多加一个 “死循环” while(1)

	while (1)
	{
		for (int i = 0; i < 78; ++i) {

			BeginBatchDraw();///

			sprintf_s(name, sizeof(name), "welcome/(%d).png", i + 1);
			loadimage(&imgWelcome[i], name);
			putimage(0, 0, &imgWelcome[i]);


			// 输出文字的模板

			char Text[64] = "按任意键进入游戏";   // 你想要写的文本

			// 设置输出效果为:Text
			setcolor(RGB(180, 180, 180)); // 设置颜色(非必要):设置 RGB参数
			LOGFONT f;
			gettextstyle(&f);							// 获取当前字体设置
			f.lfHeight = 100;						// 设置字体高度为 100, 宽度不用设置:会自适应
			_tcscpy(f.lfFaceName, _T("黑体"));		// 设置字体为“黑体”(推荐使用 _tcscpy_s 函数)
			f.lfQuality = ANTIALIASED_QUALITY;		// 设置输出效果为抗锯齿  
			settextstyle(&f);							// 设置字体样式
			outtextxy(50, 50, Text);             // (50, 50) 是你想要文字显示的位置左上角坐标(x, y)


			EndBatchDraw();///
			Sleep(40);
		}
	}

可是这样子就停不下来了,怎么办?

此时就可以配合使用 _kbhit() 函数:实现 【按任意键退出】

修改 while循环条件(同时也要稍微修改 for循环(至于这个为什么,这里不讨论))

while (!_kbhit()) {
	for (int i = 0; i < 78 && !_kbhit(); ++i) {
		// ..... 
	}
}

至此,就实现了 连续播放图片,同时可以 按任意键 随意退出

这个是本人平时制作小游戏时,收集积累的技巧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/798076.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件开发面试题(C#语言,.NET框架)

1. 解释什么是委托&#xff08;Delegate&#xff09;&#xff0c;并举例说明它在C#中的用法。 委托是一种引用类型&#xff0c;它可以用于封装一个或多个方法。委托对象可以像方法一样调用&#xff0c;甚至可以用于创建事件处理程序。委托是C#中实现事件和回调函数的重要机制。…

Hive表【汇总】

提前必备 1、内部表和外部表的区别 概念讲解&#xff1a; 外部表&#xff1a;1、存放他人给予自己的数据2、当我们删除表操作时&#xff0c;会将表的元数据删除&#xff0c;保留数据文件 内部表&#xff1a;1、存放已有的数据2、当我们删除表操作时&#xff0c;会将表的元数据…

Unity 优化合集

1️⃣ 贴图优化 1. Read/Write Enable 这个属性勾选后允许你在运行时读取和写入纹理数据&#xff0c;这对于需要实时生成内容或者需要动态修改纹理的场合非常有用但在大部分情况下这是不必要的。如果打开这个属性&#xff0c;会使运行时贴图大小翻倍&#xff0c;内存中会额外…

缓存与分布式锁

一、缓存 1、缓存使用 为了系统性能的提升&#xff0c;我们一般都会将部分数据放入缓存中&#xff0c;加速访问。 适合放入缓存的数据有&#xff1a; 即时性、数据一致性要求不高的&#xff1b;访问量大且更新频率不高的数据。 在开发中&#xff0c;凡是放入缓存中的数据我们都…

Git 命令行快速入门

前言 &#xff08;1&#xff09;新手个人建议使用TortoiseGit这类图形化界面来上手学习。 &#xff08;2&#xff09;如果一定需要用命令行进行操作&#xff0c;可以按照B站&#xff1a;程式与网页开发者必备技能&#xff01;Git 和 GitHub 零基础快速上手&#xff0c;轻松掌握…

构造与操作链栈

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝心态决定高度,细节决定成败! 链栈是数据结构中栈的一种实现方式,它利用链表(通常是单链表)来存储栈中的元…

【触摸屏】【红十字会学习系统】功能模块:视频 + AI拍照合成

项目背景 提升公众急救能力&#xff1a;确保每个人都能在紧急情况下采取正确的急救措施&#xff0c;减少伤害&#xff0c;挽救生命。培养人道主义价值观&#xff1a;通过教育和培训&#xff0c;传播红十字精神&#xff0c;促进社会对弱势群体的关注与支持。建立社区响应网络&a…

1. InternLM - 入门岛

第1关 Linux 基础知识 1. 完成SSH连接与端口映射并运行hello_world.py SSH连接配置 # wsl2中生成密钥对&#xff08;~/.ssh/id_rsa, ~/.ssh/id_rsa.pub&#xff09; ssh-keygen -t rsa# 将id_rsa.pub在internStudio作为公钥导入SSH登录 $ ssh -p 38871 rootssh.intern-ai.o…

5.SpringBoot核心源码-启动类源码分析

目录 概述技巧spring boot 如何启动应用程序run方法里面核心逻辑 SpringApplicaiton.run(xxx.class,args)结束 概述 SpringBoot核心源码-启动类源码分析 技巧 如何给外部源码加注释&#xff0c;想要在源码中添加自己的注释&#xff0c;会弹出 file is read only&#xff0c;代…

Java核心技术【二十二】Java的I/O流处理:深入文件读写操作、缓冲流、序列化与NIO

Java的I/O流处理&#xff1a;深入文件读写操作、缓冲流、序列化 在Java编程中&#xff0c;I/O流是处理输入输出操作的基础&#xff0c;特别是在文件读写、网络通信等领域。本文将在前文的基础上&#xff0c;进一步探讨缓冲流、序列化以及NIO&#xff08;New I/O&#xff09;在…

从0开始的STM32HAL库学习2

外部中断(HAL库GPIO讲解) 今天我们会详细地学习STM32CubeMX配置外部中断&#xff0c;并且讲解HAL库的GPIO的各种函数。 准备工作&#xff1a; 1、STM32开发板&#xff08;我的是STM32F103C8T6&#xff09; 2、STM32CubeMx软件、 IDE&#xff1a; Keil软件 3、STM32F1xx/ST…

01- 收入数据集【Pytorch入门实战】

目录 一、机器学习基础 二、实战例子 1.数据集分析 2.实战训练 3.总结 三、参考资料 一、机器学习基础 为了解决这个问题&#xff0c;人们想到数据驱动方法&#xff0c;也就是让计算机从现有的大量的带标签图片电学习规律&#xff0c;一旦计算机学习到了其中的规律&…

sip协议栈简介

SIP协议栈简介 SIP协议栈流程 数据链路层&#xff1a;当SIP消息从网络中传输到达TCP/IP协议栈时&#xff0c;首先被接收到的是数据链路层的数据帧。数据链路层会对数据帧进行解封装&#xff0c;得到网络层的IP数据报。 网络层&#xff1a;网络层会对IP数据报进行解析&#xf…

1.27、基于径向基神经网络的曲线拟合(matlab)

1、基于径向基神经网络的曲线拟合简介及原理 1)原理简介 基于径向基神经网络(Radial Basis Function Neural Network, RBFNN)的曲线拟合是一种常用的非线性拟合方法,通过在输入空间中使用径向基函数对数据进行处理,实现对非线性关系的拟合。 RBFNN的基本原理是将输入空…

Java基础(十九):集合框架

目录 一、Java集合框架体系二、Collection接口及方法1、添加2、判断3、删除4、其它 三、Iterator(迭代器)接口1、Iterator接口2、迭代器的执行原理3、foreach循环 四、Collection子接口1&#xff1a;List1、List接口特点2、List接口方法3、List接口主要实现类&#xff1a;Array…

【Hive SQL 每日一题】在线峰值人数计算

文章目录 测试数据需求说明需求实现 测试数据 -- 创建 user_activity 表 DROP TABLE IF EXISTS user_activity ; CREATE TABLE user_activity (user_id STRING,activity_start TIMESTAMP,activity_end TIMESTAMP );-- 插入数据 INSERT INTO user_activity VALUES (user1, 2024…

算效最高的智算中心上线,天府智算为AI产业带来哪些启示?

四川简阳&#xff0c;地处川中、控扼巴峡&#xff0c;自古乃成渝、川鄂之间的交通重镇&#xff0c;素有“天府雄州”之美誉。 步入数字经济时代&#xff0c;“天府雄州”得天独厚的地理位置再次彰显出巨大的战略价值。简阳市成为成渝算力枢纽的天府数据中心集群关键布局点&…

element ui ts table重置排序

#日常# 今天带的实习生&#xff0c;在遇到开发过程中&#xff0c;遇到了element ui table 每次查询的时候都需要重置排序方式&#xff0c;而且多个排序是由前端排序。 <el-table :data"tableData" ref"restTable"> </<el-table> <script…

bi项目笔记

1.bi是什么 bi项目就是商业智能系统&#xff0c;也就是数据可视画、报表可视化系统&#xff0c;如下图的就是bi项目了 2.技术栈

深入了解 MySQL 的 EXPLAIN 命令

一、什么是 EXPLAIN 命令&#xff1f; EXPLAIN 命令用于显示 MySQL 如何执行某个 SQL 语句&#xff0c;尤其是 SELECT 语句。通过 EXPLAIN 命令&#xff0c;可以看到查询在实际执行前的执行计划&#xff0c;这对于优化查询性能至关重要。 二、EXPLAIN 的基本用法 要使用 EXP…