|
|
一直想学写游戏,但始终找不到入门的方法,近日看到一篇文章,大受启发,决定写我的第一个游戏(以前也写过方块,挖雷等,但感觉实现的很混乱,离真正的游戏编程差距很远),希望能够借此入门,也希望有相同爱好和想法的人一起学习、讨论。遇到问题的时候也希望高手和版主们能给予指点迷经。
这里是按照下面的一篇文章写一个坦克大战。(开发文档-游戏入门编程里的一篇文章)http://dev.gameres.com/Program/Abstract/Thinking/GameMakeSpeed/GameMakeSpeed.doc
这篇文章提供了一个不错的架构,并介绍了游戏编程的一些基础的东西,可惜的是这并不是一个完整版,谁找到了完整版,请把地址贴出来,谢谢。我的目标就是,学习现有的部分,并尽可能的对未完成的部分进行补充,最终做出一个完整的游戏。
今天就来读第一章
作者使用的是vs2003,我这里只有vs6.0,经试验是可行的。
第一章比较简短,就是建立了一个windows程序。如果你看不懂的话建议先学习《windows程序设计》。
唯一值得讨论的地方是这个消息循环
int AppMsgLoop()
{
MSG msg;
ZeroMemory( &msg, sizeof(MSG) );
_AppLoop:
// 检测是否有消息要处理
if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
{
// 如果接收不到消息表示要退出程序
if( !GetMessage( &msg, NULL, 0, 0 ) )
{
// 转向结束程序
goto _ExitApp;
}
// 执行消息处理
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
// 如果没有任何消息要处理就调用主循环
Sleep(1);
}
goto _AppLoop;
_ExitApp:
AppTerm();
return (int)msg.wParam;
}
一个是使用了goto,这里的goto结构比较清晰,不影响可读性,这么用没什么问题。可能是作者认为goto比while的汇编码的效率高。实际上很多时候是while比goto的效率高。
另一个是
if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
{
// 如果接收不到消息表示要退出程序
if( !GetMessage( &msg, NULL, 0, 0 ) )
不知道为什么这么写[em5],取两次消息的效率很低,而且感觉也没什么必要,我觉的可以改成这样
if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
{
// 如果接收不到消息表示要退出程序
if (msg.message == WM_QUIT)
经测试没有问题,而且效率提高了。
欢迎讨论 [em2] |
|