游戏编程入门学习笔记20——网络篇——理清框架、获取字符串输入

有件事必须先搞明白,就是网络部分的代码究竟应该塞进整个程序的哪一部分?我重新撸了遍MyWindows.cpp,发现对windows程序的框架理解还很模糊。

有些迟早都会用到的知识还是早点弄清更好,基础未牢就急着去实现各种功能可能得不偿失。

于是干脆翻了遍《Windows游戏编程大师技巧》,很有收获。

别的先不说,首先它启发了我做一个游戏开始前的菜单选项。学会使用状态机switch case这玩意让结构变得清晰很重要。

发现书中貌似存在一个错误:

while(game_state != gameover)

{

	Switch(game_state)

	{

	case ...

	case...

	case(gameover)

	}

}


既然前面用while判断了,那game_state就不可能等于gameover了吧?大师也会犯这种低级错误。。。

另外书中的define 宏名后没写数字,貌似寄希望于编译器自动编号,但是vs2008中实际操作发现这行不通。

 

编写进入菜单的过程中,编译出好多错误,最后发现自己三个宏名都拼写错误,⊙﹏⊙b汗。后来检测键盘输入时又没注意大小写结果找半天bug,粗心大意要不得啊。

注意键盘检测程序在处理Esc键时和其他键不太一样,用的是KEY_DOWN(),一般键是用Key_Down(),这个很奇怪,以后有空细究。

总之成功给游戏添加了初始选择画面并理清了结构,这样网络代码就自然而然应该写在多人游戏部分的函数里了。

 

玩家加入另个玩家的主机建立的游戏时显然要输入ip地址的。所以现在面临如何输入字符串这个基本问题。

我先是在《大师》上抄来一个Get_line()函数,主要是用getch()实现。但是反复试验根本行不通,搞了半天才顿悟getch()仅能在控制台程序中使用,就像不可能用printf()在我的游戏窗口打出字来一样。


很难搜到解决方案,只得自己想办法实现。 

过程很是曲折,遇到几个奇怪的bug

第一个是“堆破坏”错误,“heap corruption detected”,我不知道这样译准不准确。重现出来大概是这样:

char *p = new char;

p[0]=1;

p[1]=1;

delete p;

这样编译通过,运行就会报错。

一开始我和这哥们一样http://bbs.csdn.net/topics/370153346,以为加了delete报错所以就是遇到传说中的内存泄露了。其实,内存泄露≠程序崩溃。只要new了,delete是一定要加的,不然程序不会报错但是可用内存会悄无声息的减少。

这里把指针名拿来当数组名一样加下标操作也没问题。

delete后报错的根源,在于我只分配了一个字符的空间,然后却写入了两个字符,越界了。换成new char[2];就没问题了。

(2013.8.12注:这里只能怪《21天学通C++》这本书在讲new、delete时压根没提加中括号new出多字节的事,略坑)

值得注意的是在release模式下也是不报错的,仅在debug模式报错,这个在之前那篇讲述debugrelease模式的文章中也提到过,具体技术细节暂不是很清楚。

(2013.8.12注:debug模式的执行代码会插入更多调试代码及信息,release出的则是纯净版)

 

第二个问题和第一个其实一样,但是产生的原因却不同,所以一度被这个烟雾弹搞得晕头转向。具体是这样:

我发现getch()没用后,决定用

While(keydown != 13)

{

    DirectInput_Update();

    If(Key_DownDIK_1

    {

        Hostip[index] = ‘1’;

        Keydown = ‘1’;

        Index++;

    }

...

}

hostip[inex] = 0;

这样的笨办法来解决获取字符输入问题。

结果又不断的出现内存写入错误。

一开始一直怀疑是变量名做数组下标或者“指针下标”导致的错误。后来才终于发现,是按键检测机制出问题了,因为只检测了Key_Down,所以只要键按下去不放,不断循环中index就会飞快的++,最终导致数组又越界。这也提醒我,有必要在程序中对下标进行一些限制,主动防止越界。

加入按键松开检测函数,问题就解决了。

(2013.8.12注:依赖directinput检测输入,并记录转换成字符串输出的方法有点笨,可能改用输入输出流+文本显示函数更好)

 

由于基本经验的欠缺和对一些底层函数比如按键检测的理解不透彻,导致在获取字符串输入的问题上又卡了两天。多谢逼铁同学的帮助,最终好歹是把这问题给解决了,虽然方法看起来有些狗血,而且还无法实时显示输入的字符。界面最终肯定是要重做的,有没有更好的办法以后再研究。

我不得不又一次说一句,现在终于可以开始继续思考winsock方面的事情了…

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值