// 接受密聊对方名称,将焦点设置到聊天输入框中,并且将光标设置为第一个位置
// 参数1:密聊用户名,参数2:频道信息
static bool ChangeChannelAndSetFocus(char* username,Channel channel);
这段代码看起来是没有事情的,但是在接口设置上面存在不好的做法,如果是私密频道的话,是有用username做私聊对象的,如果是非私聊频道的话,就没有这个私聊对象了.但是如果要调用这个接口的话,还得给个这样的值.
比如这样的用法:->ChangeChannelAndSetFocus("",public_channel),
其实如果稍微改变一下接口设置的话,就好了.
static bool ChangeChannelAndSetFocus(Channel channelchar* username = "");
这样使用默认参数就好了.
之前的调用就可以这样使用了.
:->ChangeChannelAndSetFocus(public_channel),看起来舒服多了.哎感觉编程功底还有待加强,这么简单的问题,拿出来想想,还有这么多学问呢.
这几天写了一段函数代码,后来被一个家伙调用了,他直接在我的函数里面修改,这样造成了原来我函数里面的逻辑出现错误,现在想来,如果以后是这样的情况,就不能允许他在我的函数里面修改我的逻辑和相关调用,但是要留出接口给它调用,至于具体的操作,要我自己允许才能添加,当然我可以帮他看看原来他添加的代码,但是这样也就没有什么意义了.这种合作性的工作尤其要讲究这些,不然很麻烦的.
突然想起来要记录点什么,调试引擎的时候,可以采用这样的方式,打开上层逻辑的工程,然后将引擎相关的代码拖拽到上层逻辑所在的工程里面去,然后在这个代码里面可以设置相关断点,以前总不知道怎么找上层逻辑与底层引擎的入口,最近终于知道了.呵呵.通过这样的方法,就可以在上层逻辑做某些操作,然后关联这些逻辑相关的引擎代码.
今天一直在被单态困扰着,事情是这样的:大厅和战斗场景里面都有两个类似的chatroom,并且他们各自使用的协议是不一样的.现在想把他合并起来做成类似singleton的东西. 之前就遇到一个问题,大厅和战斗场景不能在相互之间发送信息,后来我的处理方法是将战斗场景里面添加大厅里面的响应事件,这样的话,在大厅里面发送私聊信息到战斗场景里面,就可以接受到了,但是后来发现在战斗场景里面发送信息到大厅里面,却接受不到,并且这个时候,在大厅和战斗场景里面已经存在很多冗余代码了,这样的处理让我感觉很不爽,我在想有没有其它办法,后来请教了老大,老大帮忙解释了一下,后来,在协议处理方式上面修改了一下,才可以的。chatroom在不同的时候发送不同的协议就好了,并且在接受的时候分开大厅和战斗场景处理就好了,这样还是用了接受、和发送这两段废代码。对于singleton的了解还是不够好。
之前遇到的问题,是聊天发送消息并不立即显示在本地,而要先将信息转到服务端,服务端进行查询,如果能够找到这个私聊对象,那么就返回给信息,否则就显示说该用户不存在,在战斗场景里面向大厅的某个玩家发送私聊信息以后,退出战斗场景以后,发现大厅里面还显示着在战斗场景里面发送的聊天信息。这样即使我按照常规思路去把网络接受端的相关代码注释掉也不能达到消除大厅里面的聊天信息的目的,感觉很郁闷。后来查看私聊信息方面的代码,发现没有将信息有效地拦截,私聊信息在本地上面还可以被显示,没有经过网络方面的验证就直接发送过来了。在私聊信息方面做一些处理并且在退出战斗场景的时候做一些信息删除处理,这样就可以达到目的了。
因为玩家对象位置数据是从服务器那边发送过来的,玩家从服务器获得数据需要一段时间,所以需要加入一个插值,来将现在的位置过渡到下一个的位置.这里可以采用多种插值方法.
今天写了代码去改写强制动作的处理,结果发现很多处是有问题的,其中原因是没有将原来的代码作用看仔细造成了,感到羞愧呢,
另外在编写交互性比较强的代码时,一定要考虑自己的代码可能带来的影响。
更新某个文件比较麻烦的话,那么可以先采用原始文件删除,并且重新全部更新的做法去做,而不是用更新某个字段的方法去做.
如果没有初始化声音设备成功的话,那么应该可以弹出提示信息框,并且将原始声音音量设置为0.
之前在修改一个bug(在人物控制面板打开以后,一直克隆object,造成了在引擎底层无法锁定vertexBuffer的问题),开始以为是内存泄露了,在打开控制面板10分钟以后,游戏就突然出错了,还一度想用一些辅助工具来查找内存的信息是否出错,后来发现在人物控制面板里面克隆了过多的人物object,而这些object却没有及时地删除,造成占用过多的资源,到最后连锁住vertex buffer也不行了.在分析这个问题上面的时候,我还是一个劲地挖底层而没有考虑太多的逻辑层面的东西,实在有点南辕北辙的味道.值得反省.
在输入的使用上面,一般的游戏都采用directInput,即使是U2,上次遇到的问题是,在一同事机器上面运行输入的时候就进入不了,但是在别人的机器上面却可以运行好好的,后来经常查访发现:1)用配置文件写入的,之后再绑定到某个特定键的快捷键都不能用,因为这些是读入内存以后,然后用add_binding来绑定到directInput设备上面的,2) 在游戏里面使用windows message的却可以正常使用.进入游戏的时候,你不能输入,而只能回车,按tab键以后,就可以在登陆界面输入,如果不能按tab键,则不能输入,进入游戏以后却可以按不是从配置文件里面读取的信息,比如技能,人物面板,仓库,以及地图等.
其中我个人建议是,尽量不要用directInput.1)首先是directInput依赖于机器,如果机器好的话,那么没事情,如果有事情的话,那么也很难解决,2)directInput里面采用了hook,来拦截消息,这样,还不如直接用windows message来的快?
http://www.gamedev.net/community/forums/topic.asp?topic_id=520366详细的讨论见上面.
在调试逻辑没有发现什么错误提示的时候,试着去调试引擎,可能问题发生得更加深,不在逻辑层面上,而在引擎内部,这样就要直接调试引擎了.
在涉及到渲染方面的bug,尽量借用d3ddebugging来辅助查错.这样可以方便解决问题.
连接错误:IID_IDirectSound3DBuffer,其实加上dxguid.lib就好了。
纹理寻址模式包括:
wrap, border color, clamp,和mirror以及mirror once.
pDrawPrimInternal->SetTexture(hTex);
之前遇到的一个问题是,显示玩家在小地图上面到地图边界了,还能重复绘制地图,给人的感觉好像是走不到边界,走地图好像是在卷轴里面一样。
后来才知道一般默认的纹理寻址模式是wrap方式。
get_device()->SetSamplerState(0,D3DSAMP_BORDERCOLOR,0x00ffffff);
get_device()->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER);
get_device()->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);
解决bug有时候不如重写
尽量让策划去管理逻辑,逻辑程序员尽量将重心放在具体技术问题上面,不懂的地方应该主动跟策划沟通,而不是自己想。
代码可以先模拟出来,然后再放到具体的环境里面测试,独立写个demo之后再去测试,这样往往会比较快捷和省事情。
学会模拟机器执行代码的次序,并且提高阅读代码的问题,之前的时候,我使劲去调试,每次调试只为了解决一个问题,但是事实上,如果从阅读代码开始的话,那么我可以省掉1天的时间。
学会调节编写代码时候的心情和心态,这样有助于进行高效编程,当心情不好的时候,一定要集中全部的注意力,并且将思路和流程作出图记载在纸上面,这样可以强迫自己全神贯注。
今天遇到的文件打开问题是文件名路径有空格造成的,值得指出的是对于文件打开报错,一般很难获得返回值信息,但是可以通过GetLastError或者@Err,以及hr等来获得一些错误返回值信息。
对字符串操作,尽量要检查是否有空格,如果字符串长度前面有空格的话,那么将被认为所提供的字符串是空的。要避免这种情况的发生。对于字符串匹配要注意部分匹配的情况,比如"Tex", "Text",这里如果只匹配前面三个字符的话,那么两者是相等的,之前就遇到一个这样的问题,就是texture的信息被text信息所覆盖了,导致控件找不到正确的texture而不能显示出来。
今天遇到的问题是这样的,之前遇到的状态切换问题,是与状态切换无关,而与插值有关,在切换状态以后,收到一个插值位置,这样又给角色一个新的位置,给别人看的效果就是角色先落地了,之后又上升了,像坐电梯一样。不过从这里说明了一个问题:我在思考问题的时候,有欠周全的因素。
今天跟踪一个bug,在战斗的时候,出现卡死的情况,后来发现状态切换出现了问题,后来一直去查看战斗方面的状态,但是还没有发现什么结果,现在在想在战斗中的标志或者状态的时候应该设立一些标志集合,这样便于在某个时候检查一些状态的信息。现在很多的标志在游戏里面,局部的,全局的,标志在角色上面的,标志在物体上面的,这些都需要好好地管理。
全方面,多角度地思考问题,而不能将思维局限在某处.学会从大局或者小处去分析问题,大处不行的话,就小处,将相关的信息串起来.所有的信息应该是个串型或者链型的.之前在处理问题的时候,把思路限制在太小的范围内了.以至于花了很多时间才找到问题所在.
根据正常情况和非正常情况来获得数据比较,以确定正确的流程和结构。如果遇到错误的乱值,那么就看看正常的数值,然后根据这个比较来获得一些提示信息。
今天犯了错误,自己有最新版本,但是没有上传,结果vss上面的版本把自己的最新版本给覆盖了。
在发送消息的时候,有时候为了防止频繁发送消息,要加入一个cd时间,防止因为网络问题,服务端收到玩家连续的信息。
物理系统, v = v0 - gt. 玩家上跳的速度表示,而在下降,则是v = gt,按照自由落体运动来进行.并且速度是个向量,这样如果在X,Z轴上面有初速度的话,那么就可能出现抛物线的情况.