游戏制作技巧

游戏制作技巧

1. 添加图片

void startup()
{
	initgraph(1000,500);//设置exe显示框大小
	loadimage(&img_bk,L"C:\\Users\\hp\\Desktop\\x.jpg",1000, 500,true);
	//加载图片
	putimage(0,0,&img_bk);//显示图片
	_getch();//按任意键退出
	closegraph();//关闭画面
}//游戏开始画面

2. 添加音乐

使用PlaySound函数播放小尺寸WAVE音频的过程<转自百度文库>
第一步:将wav的音频文件放到与exe文件同一目录
第二步:导入声音头文件库
#include "mmsystem.h"				//导入声音头文件
#pragma comment(lib,"winmm.lib")	//导入声音头文件库
第三步:编写播放停止的按钮
播放:
PlaySound((LPCTSTR)IDR_WAVE_DIAL_TEL,AfxGetInstanceHandle(),SND_RESOURCE | SND_ASYNC |SND_LOOP);

停止:
PlaySound(NULL,AfxGetInstanceHandle(),SND_RESOURCE | SND_ASYNC |SND_LOOP);

可实际当中,怎么也不能停止播放。真正可以停止播放的是以下调用方式。
PlaySound(NULL,  
AfxGetInstanceHandle(), 
SND_MEMORY | SND_ASYNC |SND_LOOP);
	个中原因我也没有深入下去,我想可能有这么一个解释。播放小尺寸WAVE文件,PlaySound会将音频资源存入一个放音缓冲中去。如果想停止的话,就先要清空放音缓冲才行。

播放声音文件
(1)用途:游戏里播放音乐;自己动手给女友做音乐贺卡(图片、滚动的字母、温馨的音乐)
(2)可以使用PlaySound()函数播放声音文件,该函数原型位于#include <mmsystem.h>中, 因此要使用PlaySound,首先需要添加对这个头文件的引用。
提示:mm就是MultiMedia的简写,多媒体
(3)函数原型为: BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound); 
返回值表示是否播放成功。
参数pszSound是要播放声音的文件名,只支持WAV等格式的文件;去mp3.baidu.com用“wav”为关键词可以搜到很多wav音乐,也可以用工具将其他格式的转换为wav格式的。
参数hmod是应用程序的实例句柄,一般传递NULL就可以;
参数fdwSound是标志的组合掩码,可选值有SND_FILENAME、SND_ASYNC、SND_SYNC等。SND_FILENAME表示pszSound参数指定的是文件名(pszSound还可以指定资源、内存音乐、系统音乐等等);SND_ASYNC:用异步方式播放声音,PlaySound函数在开始播放后立即返回;SND_SYNC:同步播放声音,在播放完后PlaySound函数才返回;SND_LOOP一遍遍的重复播放声音,必须与SND_ASYNC标志一块使用。

注意的问题:文件名中的反斜线要用“\\”,因为C语言中“\”默认是转义符,如果要表示“\”则需要使用“\\”,对这点不明白的请回去翻一下C语言的书;对中文字符串要使用TEXT宏。
(5)为啥构建不通过?
#include <mmsystem.h>只是保证编译通过,还要设定link。
解决方案:工程上点击右键,选“工程设置”,连接,添加“winmm”库。
解决此问题时参考的文章:http://hi.baidu.com/big_foot/blog/item/4822fcd11a7f7cd6562c84e7.html。它虽然描述的是VC中解决此问题的方式,但是记住“一通百通”这个道理,C-Free中添加Link库的方式和VC非常相似,只是操作步骤不同而已。
 
附录:VC中添加Link库的方式:
project->setting->Link 下的 Object/library modules 里加入winmm.lib即可”,他这里用的是英文版,中文版应该是主菜单的【工程】→【设置】→【连接】,将“winmm.lib”加入到“对象/库模块”中。
(6)接上面的问题:关于link库
一个程序由源代码变成exe文件有两步:编译Compile;连接Link。编译是把c文件编译成.o、.obj文件,而连接则是把这些.o、.obj、.lib等文件连接到一起成为exe文件。这点不清楚的请回去查看C语言的教材。
那什么是*.lib文件呢?大家以前用TC开发程序的时候用的都是C语言内置的函数,所以不存在使用非内置函数的情况。但是在开发大程序的时候要大量用到非内置的函数,比如PlaySound、MessageBox等等。在使用这些函数的时候需要使用两部分,一部分是*.h头文件,它定义了函数的参数和返回值,另一部分是*.lib文件,是用来进行程序链接用的。C程序的构建分为编译(Compile)和连接(Link)两个过程,Compile是把源代码编译成*.obj文件,每个源码文件都对应一个*.obj文件,而连接则是把这些*.obj文件以及使用到的非内置函数的*.lib文件连接成一个*.exe文件。所以无论是忘了include *.h文件,还是丢了*.lib文件,都会构建出错。从上面的报错信息可以看出来是Compile成功,但是Link失败。一定要记得C程序编译的这两个过程,面试、笔试的时候常考。
(7)同步播放音乐
PlaySound("C:\\WINDOWS\\Media\\Windows XP 关机.wav",NULL,SND_FILENAME|SND_SYNC);
(8)体会同步播放和异步播放的差异:
 
PlaySound("C:\\WINDOWS\\Media\\Windows XP 关机.wav",NULL,SND_FILENAME|SND_SYNC);
 
MessageBox(NULL,"同步播放完毕","信息",MB_OK);
 
PlaySound("C:\\WINDOWS\\Media\\Windows XP 关机.wav",NULL,SND_FILENAME|SND_ASYNC);
 
MessageBox(NULL,"异步播放立即返回","信息",MB_OK);
      同步模式:音乐播放过程中函数不返回,播放完成才返回
      异步播放在做游戏等需要播放时间较长的音乐时使用,因为程序不会在音乐播放过程中有假死的情况。
有没有同学注意到第二个对话框如果快速关闭的话音乐会中途停止?这是因为程序退出音乐就中断播放了。用户关了游戏,音乐也不能继续播放,应该停止,所以很合理
(9)我可以做一个小程序,别人在我小程序运行的时候一直听播放的音乐,用异步方式可以保证音乐在后台播放。可以只能播放一遍,能不能音乐来回来去的不断播放呢?答案是使用SND_LOOP标志。
Loop:循环
PlaySound("C:\\WINDOWS\\Media\\Windows XP 关机.wav",NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);

(10)如果我做一个小游戏,那么希望向上边那样不断播放,可以到达一个关卡的时候希望停止原来的音乐怎么办?
PlaySound(TEXT("C:\\WINDOWS\\Media\\Windows XP 启动.wav"),NULL,SND_FILENAME|SND_ASYNC);
MessageBox(NULL,TEXT(""),TEXT(""),MB_OK);

PlaySound(TEXT("C:\\WINDOWS\\Media\\Windows XP 关机.wav"),NULL,SND_FILENAME|SND_ASYNC);
MessageBox(NULL,TEXT(""),TEXT(""),MB_OK);
只能同时播放一段音乐,启动新的、旧的就被停了
(11)如果只是想停止目前的播放而不播放新音乐呢?
      只要给PlaySound的第一参数传递NULL就可以停止目前的播放了。
PlaySound("C:\\WINDOWS\\Media\\Windows XP 关机.wav",NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);
MessageBox(NULL,"点确定终止音乐","信息",MB_OK);

PlaySound(NULL,NULL,SND_FILENAME);
MessageBox(NULL,"音乐被终止","信息",MB_OK)

3. 给文字添加颜色

先添加头文件Windows.h
1.改变整个控制台的颜色
  用 system("color 0A");
  其中color后面的0是背景色代号,A是前景色代号。各颜色代码如下:
  0=黑色
  1=蓝色
  2=绿色
  3=湖蓝色
  4=红色
  5=紫色
  6=黄色
  7=白色
  8=灰色
  9=淡蓝色
  A=淡绿色
  B=淡浅绿色
  C=淡红色
  D=淡紫色
  E=淡黄色
  F=亮白色
  2.改变下一个输出或者输入字体和背景的颜色
  采用SetConsoleTextAttribute函数,如
  Red on Black:
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED);

4. 光标隐藏函数

void HideCursor() // 用于隐藏光标
{
	CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };  // 第二个值为0表示隐藏光标
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
#请于主函数中调用

5. 游戏暂停函数

//xy为gotoxy函数//具体使用方法:将该函数在检测各种按键,即控制移动的函数中调用
//使用环境还请自己摸索,不一定适应所有程序
void Stop()    //暂停
{
	int main();
	int color=1,timing=0;
	while(1)
	{
		if(timing++%30==0)
		{
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);
			xy(100,13);       //副屏幕打印
			printf("游戏暂停");
			xy(88,17);
			printf("按回车键回到游戏");
			xy(88,18);
			printf("或按 Esc键退出游戏");
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);  
			if(++color==8)
				color=1;
		}
		if (GetAsyncKeyState( 0xD )& 0x8000)      //回车键
		{
			xy(100,13);       //副屏幕打印
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);
			printf("正在进行");   //覆盖掉原来的提示
			xy(88,17);
			printf("                     ");
			xy(88,18);
			printf("                     ");
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);  
			break;
		}
		else if(GetAsyncKeyState( 0x1B )& 0x8000) //Esc键退出	
			(system("cls"),main());
		
	}
}