用EasyX图形库在控制台上"放视频"、VC的字符集

请看以下代码:

#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

  • 6
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值