赞
踩
请看以下代码:
#include <graphics.h> #include <Windows.h> #include <iostream> #include <MMSystem.h>//播放音乐的头文件 #pragma comment(lib,"winmm.lib")//加载库文件 #define ALLIMAGE 148 using namespace std; int main(void){ char file_name[128]; IMAGE image[ALLIMAGE]; cout << "loading ..." <<endl; for(int i=1;i<=148;i++){//预加载 sprintf(file_name,"d:\\Documents\\Visual Studio 2010\\Projects\\测试\\测试\\images2\\_%04d_图层-%d.jpg",148-i,i); loadimage(&image[i-1],file_name); } initgraph(800,450); mciSendString(_T("play 极乐净土.mp3 repeat"),0,0,0); while(1){ for(int i=0;i<148;i++){ putimage(0,0,&image[i]); Sleep(75); } } system("pause"); closegraph(); return 0; }*
这是一个在控制台上"放视频"的程序,之所以打引号是因为并不是真正的打开一个视频,这段代码用了EasyX图形库.支持VC、VS编译器.
EasyX 是针对 C++ 的图形库,可以帮助 C++语言初学者快速上手图形和游戏编程。
比如,可以用 VC + EasyX 很快的用几何图形画一个房子,或者一辆移动的小车,可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏,可以练习图形学的各种算法,等等
这段代码使用循环播放图片,同时播放音乐的方式完成类似于视频的效果.
首先是包含文件,包含了EasyX图形库的头文件:graphics.h.播放音乐的头文件:MMSysyem.h,里面包含了windows中与多媒体有关的大多数接口.然后用pragma加载库文件,pragma的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。
然后用宏定义定义所有的图片数量为148张.
#include <graphics.h>
#include <Windows.h>
#include <iostream>
#include <MMSystem.h>//播放音乐的头文件
#pragma comment(lib,"winmm.lib")//加载库文件
#define ALLIMAGE 148
开始时先预加载,输出loading …提示正在加载,在for循环里预加载148张图片,因为读取图片是是从磁盘里读的,速度会比较慢,所以预加载会好很多,这和玩页游是一样的,提前加载等一段时间玩游戏的时候就可以愉快的玩啦!
sprintf,sprintf指的是字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。类比于printf,一个是把数据输出到控制台,一个是把数据输出到一个字符串(字符数组)里.在这里将图片名存入字符数组file_name中,因为这里图片名是_0147_图层-1.jpg
_0146_图层-2.jpg
这种规律,所以处理起来要麻烦些.同样类比于printf用占位符%d输入不同数字.%04d表示在输出整数x的时候,按照4个位子的空间左对齐,多余的位子用0代替.
char file_name[128];
IMAGE image[ALLIMAGE];
cout << "loading ..." <<endl;
for(int i=1;i<=148;i++){//预加载
sprintf(file_name,"d:\\Documents\\Visual Studio 2010\\Projects\\测试\\测试\\images2\\_%04d_图层-%d.jpg",148-i,i);
loadimage(&image[i-1],file_name);
}
loadimage是EasyX中提供的图像处理函数,下面的图片可以看出它的用法image[]就是定义的IMAGE对象,关于IMAGE对象请看下面代码.
(看不太懂,会用就行了…)
// 定义图像对象 class IMAGE { public: int getwidth() const; // 获取对象的宽度 int getheight() const; // 获取对象的高度 private: int width, height; // 对象的宽高 HBITMAP m_hBmp; HDC m_hMemDC; int m_MemCurX; // 当前点X坐标 int m_MemCurY; // 当前点Y坐标 float m_data[6]; COLORREF m_LineColor; // 当前线条颜色 COLORREF m_FillColor; // 当前填充颜色 COLORREF m_TextColor; // 当前文字颜色 COLORREF m_BkColor; // 当前背景颜色 DWORD* m_pBuffer; // 绘图区的内存 LINESTYLE m_LineStyle; // 画线样式 FILLSTYLE m_FillStyle; // 填充样式 virtual void SetDefault(); // 设置为默认状态 public: IMAGE(int _width = 0, int _height = 0); // 创建图像 IMAGE(const IMAGE &img); // 拷贝构造函数 IMAGE& operator = (const IMAGE &img); // 赋值运算符重载函数 virtual ~IMAGE(); virtual void Resize(int _width, int _height); // 调整尺寸 };
初始化控制台大小,与图片大小一致,mciSendString播放音乐,注意的的是这里文件名加了个_T是因为VC++中有一个字符集,作用是通知编译器使用指定的字符集,帮助解决本地化问题,将其改为使用多字节字符集就可以不用加_T了.
在循环里用putimage函数放图片,sleep函数休眠75ms.
initgraph(800,450);
mciSendString(_T("play 极乐净土.mp3 repeat"),0,0,0);
while(1){
for(int i=0;i<148;i++){
putimage(0,0,&image[i]);
Sleep(75);
}
}
system("pause");
closegraph();
return 0;
代码全部讲解完毕,希望看了这篇文章的你们也能做出自己的"视频".
最后说下c++的输入输出(cin cout),为什么他们能连写呢?
cout << 请输入: << endl;
cin >> num1 >> num2;
在用它输入输出的时候你是否有疑问,为什么写一个cout就可以输出多个数据呢?这涉及到了运算符重载和对象的知识,以后会深入讲解,目前只需建立一个认知:和函数返回值类似,cout << string
也会返回值,只不过返回的是cout自己,于是就可以继续<< string2
<< string3
了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。