技巧一、使用 IMAGE数组+循环:实现【连续播放图片】
(1)一张图片如何放映在 图形化窗口上:借用两个函数
#include<graphics.h> // 函数的头文件
IMAGE imgMy; // 图形变量
loadimage(&imgMy, "写入你想显示的图片路径"); // 加载目标图片进入图形变量imgMy
putimage(x, y, &imgMy); // (x, y) 指图片放映的左上角坐标(就是你想要图片在什么位置,自己调就好)
总结功能
loadimage函数 加载目标图片进入图形变量imgMy
putimage函数 将图片展示出来
(2)如何连续播放一个文件内的很多张图片??
难点攻破:
难点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) {
// .....
}
}
至此,就实现了 连续播放图片,同时可以 按任意键 随意退出
这个是本人平时制作小游戏时,收集积累的技巧