源代码下载地址:

网盘:http://pan.baidu.com/s/1eQ33c7w

CSDN:http://download.csdn.net/detail/u011418173/9080501

最近,看了下毛星云的书:《逐梦旅程 windows游戏编程之从零开始》,对其十分的感兴趣,这本书的内容浅显易懂,很适合像我们这些编程的入门者阅读。目前只看了该书的前半部分,也就是2D游戏的编程,自己便尝试着在浅墨大神的基础框架上做一些别的东西。

在一些大型游戏的游戏资源载入的过程中,都是会有专门的载入界面,让玩家在等待的过程中不至于太无聊和焦虑。一般,载入界面运行是要有动态效果的,这一般可以说明该游戏没有崩溃,让玩家不要慌:别急,游戏正在加载呢,等等吧。之前玩文明5时的载入界面令我印象深刻,由于自己的电脑不好,一次载入都要好几分钟,有时候游戏死了都不知道ORZ。

1、材料的准备

首先要准备一些图片资源,一些简单的资源我都是自己制作的,这里我准备了一个旋转的loading效果图片,如下所示:

当然了,想通过C++载入gif图片是有些困难的,于是我将这些图片分解为8帧,使用透明遮罩法来显示,具体的制作方法这里就不详述。下面是制成的图片,:

载入时的背景图片:

还有正式游戏时的背景图片:

2、建立loading线程

在浅墨的框架中,有三个关键的函数,分别是:

 123
BOOL Game_Init(HWND hwnd); //在此函数中进行资源的初始化
VOID Game_Paint( HWND hwnd); //在此函数中进行绘图代码的书写
BOOL Game_CleanUp(HWND hwnd ); //在此函数中进行资源的清理

那么载入界面的代码当然是要写在初始化中了,为了不影响其他资源的载入,我考虑创建一个线程,在这里实现loading界面的绘制。同时主程序实现加载游戏资源的任务。

  123456789101112131415161718192021222324252627282930
BOOL Game_Init( HWND hwnd )
{
HBITMAP bmp;
g_hdc = GetDC(hwnd);
g_mdc = CreateCompatibleDC(g_hdc); //创建一个和hdc兼容的内存DC
g_bufdc = CreateCompatibleDC(g_hdc);//再创建一个和hdc兼容的缓冲DC
bmp = CreateCompatibleBitmap(g_hdc,WINDOW_WIDTH,WINDOW_HEIGHT);
SelectObject(g_mdc,bmp);
//预先加载Loading界面
g_hLoading = (HBITMAP)LoadImage(NULL,L"loading.bmp",IMAGE_BITMAP,2400,600,LR_LOADFROMFILE);
g_hlLoading_bk = (HBITMAP)LoadImage(NULL,L"loading_bk.bmp",IMAGE_BITMAP,1500,1000,LR_LOADFROMFILE);
//设置字体
HFONT hFont;
hFont = CreateFont(80,0,0,0,700,0,0,0,GB2312_CHARSET,0,0,0,0,TEXT("钟齐段宁行书"));
SelectObject(g_mdc,hFont);
SetBkMode(g_mdc,TRANSPARENT);
_beginthread(ThreadFunc,0,NULL);
//加载其他各种正式的游戏资源的地方
g_hBackGround = (HBITMAP)LoadImage(NULL,L"场景1.bmp",IMAGE_BITMAP,WINDOW_WIDTH,WINDOW_HEIGHT,LR_LOADFROMFILE);
//为了测试效果,强行增加Loading时间,正常运行时,只要资源加载完后,就可以退出线程
Sleep(3000);
g_bFinishThread = 1;
Game_Paint(hwnd);
return TRUE;
}

前面的g_hdc,g_mdc,g_bufdc三个设备上下文句柄,是用于实现三缓冲绘图用的,这里就不再详述了。后面是设置字体,这里选用的是“ 钟齐段宁行书”字体,个人比较喜欢这种风格。载入完成这些资源后,就可以进入线程函数ThreadFunc了。当所有的游戏资源全部完成之后,将bool类型的g_bFinishTread置为1,从而让线程退出。

由于这个例子的资源极少,载入极快,故几乎看不到载入时的效果,所以添加了一句:Sleep(3000)。这样我们能够看到3秒的loading界面,从而判断效果的好坏。

下面是线程函数的具体内容:

  12345678910111213141516171819202122232425262728293031323334
void ThreadFunc (PVOID pvoid)
{
srand((int)time(NULL));//设置随机种子
int i = 0;//用于帧数的循环
DWORD tNow,tPre;//保存当前时间和上一帧的时间
tPre = GetTickCount();//获得当前的时间
//若游戏资源未加载完,则g_bFinishThread一直为0,将一直循环下去
while(!g_bFinishThread)
{
//载入loading时的背景图片
SelectObject(g_bufdc,g_hlLoading_bk);
BitBlt(g_mdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_bufdc,0,0,SRCCOPY);
//载入loading时的旋转图片,使用透明遮罩法
SelectObject(g_bufdc,g_hLoading);
BitBlt(g_mdc,600,300,300,300,g_bufdc,i*300,300,SRCAND);
BitBlt(g_mdc,600,300,300,300,g_bufdc,i*300,0,SRCPAINT);
//绘制提示文字
WCHAR str[50];
swprintf_s(str,L"游戏资源正在拼命加载中,请稍后...");
SetTextColor(g_mdc,RGB(rand()%255,rand()%255,rand()%255));//使用随机数,呈现随机的颜色
TextOut(g_mdc,150,700,str,wcslen(str));
//将最后的画面显示在窗口中
BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY);
i++;
if(i == 8)//每8张一个循环
i = 0;
do{
tNow = GetTickCount();
}while(tNow-tPre<100);//当前后时间超过0.1s后,绘制下一帧
tPre = tNow;
}
return;
}

为了防止在绘制loading界面的同时进行正常游戏的绘制,我在winmain函数的循环体中加入了一条判断:

  12345678910111213141516
while( msg.message != WM_QUIT ) //使用while循环,如果消息不是WM_QUIT消息,就继续循环
{
if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //查看应用程序消息队列,有消息时将队列中的消息派发出去。
{
TranslateMessage( &msg ); //将虚拟键消息转换为字符消息
DispatchMessage( &msg ); //分发一个消息给窗口程序。
}
else
{
g_tNow = GetTickCount(); //获取当前系统时间
if(g_tNow-g_tPre >= 100) //当此次循环运行与上次绘图时间相差0.1秒时再进行重绘操作
if(g_bFinishThread) //如果loading线程结束,则进行正常的游戏绘制
Game_Paint(hwnd);
}
}

3、实现效果

最后我们看到效果图为:

加载完成后为:

4、补充内容

浅墨大神在游戏中添加的音乐资源都是wav格式的,而PlaySound函数只能支持wav格式的文件,同时该格式的文件不能够进行其他的更多的操作如声音的暂停、停止、音量的控制等。所以我在程序中选择了使用mp3格式的文件,并使用MCI媒体控制接口来实现音乐的播放,今后的游戏也尽量都使用这种方法。

但是这种方法的话,在编译器中调试时是发不出声音的!一开始还以为是代码的问题,后来尝试直接运行Debug文件夹下的.exe文件,发现代码原来没有问题。。。

注:需要链接winmm.lib库

简单的C++游戏载入界面设计相关推荐

  1. 游戏UI界面设计视频教程全套

    库(UI插画漫画开发建模美术教程大全) 2014-11-28 16:54:21 1.全面系统(从基础到进阶,涵盖所有细节,特别是没有受过特别专业培训的亲们,更加需要) 2.有序排列(按照教程属性与绘画 ...

  2. RPG游戏《黑暗之光》流程介绍与代码分析之(一):游戏载入界面的创建

    <黑暗之光>是一款中等大小的RPG游戏,在入门Unity后适合用来上手,了解一整套游戏开发流程以及游戏内的各种功能.借助几篇博客整理一下整体的开发步骤以及代码,方便自己回顾,也便于各位交流 ...

  3. matlab 版 数独小游戏 GUI界面设计

    近期,由于各种原因,接触到了matlab版的数独小游戏,需要做GUI界面.由于之前本科的时候自己也做过简单的界面涉及,就以为很简单,结果,piapia打脸.数独中的数字是在table中显示的,为了将题 ...

  4. 关于游戏交互界面设计的几点思考

    接口数据流 玩家所体验的游戏世界其实是在他们的脑海中的,而玩家融入进游戏所通过的界面,就是交互界面.交互界面的设计目标就是让玩家「感到」他能够自如地控制自己的体验. 上图是一个简单的映射图,我修改了一 ...

  5. c语言游戏菜单栏界面设计,C语言课程设计-精美游戏目录选择界面.doc

    计算机技术基础课程设计 C语言 设计报告 题目:精美游戏目录选择界面演示 学院:化学工程学院 专业:制药工程专业 班级:050607 姓名:徐成 指导教师:顾煜新 设计日期:2006年12月14日→2 ...

  6. 以“吃鸡”手游为例,讲解如何进行游戏交互界面设计

    http://gad.qq.com/article/detail/37659 1. 需求整理 1.1 界面层级拆解 游戏界面不同于应用,同屏的元素特别多,我之前的文章里介绍到,可以用"分组& ...

  7. Android项目猜纸牌游戏之一 界面设计和资源文件的设计

    视频课:[免费]安卓项目开发实战-张晨光的在线视频教程-CSDN程序员研修院 本游戏实现安卓手机下的猜纸牌游戏,由电脑和玩家一起玩,进行随机扑克的猜测,得分! 一:定义字符串的资源文件 <?xm ...

  8. c语言游戏菜单栏界面设计,俄罗斯方块——菜单和游戏界面.cpp

    short game_arr[HEI][WID]; short next_blockarr[4][4]; short cur_boxindex, next_boxindex; short cur_bl ...

  9. 五子棋游戏html5界面设计,HTML5制作黑白五子棋游戏教程

    今天分享一个只用css和js代码开发的黑白五子棋游戏,我们把代码进行解析,希望对大家可以有所帮助 先看看效果图: HTML5制作黑白五子棋游戏教程 js代码: 定义canvas及黑白棋变量 var c ...

最新文章

  1. HashSet中的add()方法( 二 )(详尽版)
  2. 【Math Time 】Mean, Median, Mode 之间的区别
  3. 实施Service Mesh前,你需要考虑这几个问题
  4. PHP关联数组和哈希表(hash table) 未指定
  5. bzoj1003 物流运输
  6. css3效果: animate实现点点点loading动画效果(一)
  7. python编程入门指南怎么样-如果想学python怎么入门?
  8. android 网易item广告,Android仿网易严选商品详情页
  9. 科目三要注意的失误点
  10. 点评锤子新机外观被前下属骂“厚颜无耻” 罗永浩道歉:希望还来得及补偿
  11. hdu 3657 最大点权独立集变形(方格取数的变形最小割,对于最小割建图很好的题)...
  12. 关于s19赛季服务器维修,王者荣耀S19赛季版本更新问题及解决办法一览
  13. qtcpsocket断开_QTcpSocket 对连接服务器中断的不同情况进行判定(六种情况,其中一种使用IsNetworkAlive API方法)...
  14. 学习笔记(1):FFmpeg打造Android万能音频播放器-实现变速变调功能(二)
  15. Windows下安装Tensorflow-Slim(待续)
  16. 金蝶KIS迷你版标准版年度结账
  17. 高数_什么叫做方程的特解以及通解(微分方程)
  18. Oracle数据库备份与恢复命令
  19. 去除数组中值为空的元素
  20. 一名准菜鸟程序员(bushi)的自我介绍

热门文章

  1. 数字式竞赛抢答器(基于Quartus的原理图设计)FPGA
  2. 水龙头CE认证EN817怎么办理?
  3. 【笔记整理】Activiti工作流的学习笔记
  4. 新ICT时代下,看华为OneAir行业无线专网如何引领工业物联新风尚
  5. 数据压缩第九周作业——码流分析仪
  6. VNCTF2023-misc方向wp
  7. java xstream_XStream 用法汇总
  8. Northwind中文版Access2000、MSSQL版也适用LinqPad学习
  9. mysql官方yum源_mysql 采用官方yum源的安装方法
  10. IPHONE 设置 铃声 方法