对manmove()和bianfw()的理解

manmove()实际上实现的作用是计算man[i](i的值由manmove()的入口参数i的当前值取得)的man[i].xix,man[i],yiy当前值,man[i].xix,man[i],yiy的变化过程是这样的:如果程序刚加载,此时人物的x0,y0,xix,yiy值都由程序赋于(具体赋于的初值在源程序中的位置不用我明说了吧?),人物初始动作为站,用户点击鼠标后程序意义上给man[i]目标位置分量x0,y0后,man[i].xix,man[i].yiy以一定的水平方向上和垂直方向上的偏移步长不断向x0,y0偏移靠拢,如果一开始人物正在走动的情况也是一样的,接着第一种情况来说,如果用户在这个不断变化的过程中(此时xix,yiy没有最终偏移到x0,y0或者说xix,yiy偏移到x0,y0前)点击了鼠标,新的x0,y0将重新形成,此时xix,yiy的值仍然是点击鼠标的那一瞬间的xix,yiy的值,也就是说,那时的xix,yiy将保留作为当前xix,yiy值,这没有什么不可理解的,因为xix,yiy都是变量,它们的值是可以动态变化的man[i].xix,man[i].yiy决定了在透明贴图函数中man[i]当前P值(P也是man[i]的一个分量,P值的不断递进会不断更新MemDC中的内容,贴到屏幕上就会导致人物动画了)对应的图片经过GetPic()后形成bit再关联到MemDC然后贴到dc.mdc的贴图位置,也就是man[i]的当前位置,可见这个当前位置(即man[i].xix,man[i].yiy这2个结构分量)是不断变化的(因为它们是变量,这没有什么不可理解的),从xix,yiy递进到x0,y0,递进形式可表达为:xix=xix+水平方向上的步长,yiy=yiy+垂直方向上的步长,xix<=x0,yiy<=y0,,说完了manmove(),再来说bianfw(),在谈完这二个函数后,你将会明白manmove()与bianfw()的真正含义了,而不再会被它们的函数名称(manmove:人物移动,bianfw:人物方位转换)迷惑了,你也将明白这二个函数在完成精灵(精灵是游戏开发术语之一,指一切活动对象,第5章的精灵专指主角人物,第6,7章开始引入了其它的精灵,即书中说的"对象",包括活动对象人和兽,静态对象石,树等)移动中各自完成的作用及作用上的区别,及它们在完成精灵移动中存在的必要,bianfw()实际上实现的作用是从对应的图片目录下取得特定相关的一组图以形成人物动画,这样图通过P由m0到m1的递变组合形成动画(静物不参与bianfw(),请自行在源程序中找到屏蔽静物P递进的语句),人物的取图操作需要三个方面的量才能完成:人物角色,人物动作,人物方位(动物也一样,动物的角色就是指不同的动物),只有这三个都确定了,取图操作才能进行,任何一个量少了,将取不得确定的一组图(取图即计算P的初值和终值),下面我们来分析一下bianfw()是如何具体进行取图操作的,人物取图的三个量,人物的角色实际上已经指定(自己去找man[i].js=0的位置吧),人物的姿式在bianfw()体内已指定为man[i].zs=0(走动),只有人物的方位未确定了,程序中用了检测点man[i].x0,man[i].y0与点man[i].xix,man[i].yiy之间的连线指向的方法来确定人物方位,上面说了取图即是确定动画图片组的初值m0和终值m1,得出的m0和m1将在下面的程序中用于P的递进,这样我们就讲完了这二个函数了,另外,作者在编程实现鼠标控制精灵移动时所用的算法不科学,(经过上面的分析,我们知道作者的算法是设置二个函数manmove()和bianfw(),前者用于计算man[i].xix,man[i].yiy形成贴图位置,后面从目录下取特定的一组图形成动画)实际执行"01.走四方.exe"时你会发现,具体表现请参照我以前写的一篇文档"Demo缺陷分析"(因为是以前刚看这本书时写的,可能不够科学,请参照一下这个地址http://articles.gameres.com/Program/Abstract/Thinking/CharacterMove.htm的一篇技术文档吧)..

为什么会形成这些现象呢?因为现象不止一种,对每一种现象的程序根源的分析都是要花很多文字的,我这里只针对人物到达目标后点还在走动的现象(或者人物到达目标点后当前动画还未播放到"走"的最后一帧而卡在那里的现象)谈谈自己新的理解,用意仅仅激发读者的思考,它的科学性我不能保证,说错了还望高手斧正,上面说到作者使用二个函数来构建精灵移动算法,二者作为二个独立的函数过程一前一后共处于对象显示函数SetObj()函数体内(SetObj()是后来出现的对象显示函数,拿它来分析"走四方"这一章的主角显示是可行的),但是它们的作用仅仅是进行概念级的计算,并不实际向暂存区贴图,虽然这样,最终的贴图效果显然还是由这二个函数直接影响着的,因为某一瞬间(这一瞬间P取了一个确定值)形成的MemDC的贴图位置是由这二个函数之一的manmove()得出的,MemDC的图形内容(由P当前的取值决定)是由这二个函数之一的bianfw()决定的,P再不断地由m0递进到m1反映到贴图函数中就形成了动画,这二个函数显然影响最终的在程序界面上的贴图效果,即鼠标控制精灵移动的最终显示效果(鼠标点击的实质是重新给man[i].x0,man[i].y0),我们要追寻这二个函数影响下的最终贴图过程(这个贴图过程在源程序中可能表现为一个贴图函数),就要在源程序中找到这个贴图函数,这个贴图函数显然就是TransparentBlt2(),我们知道函数是以它的CPU执行时间和参数压入堆栈所占空间来衡量对系统的资源消耗的,manmove()和bianfw()在SetObj()体内是串式执行的,是一前一后的,二者执行所花的时间上没有任何的联系,即一方的时间长短不会影响另一方,二者在系统时间消费上完全是互不相干的,可能manmove()多些,也可能bianfw()多些,当然也可能是相等的,反正就是不可预料的,那么,当manmove()与bianfw()在SetObj()体内得出它们各自的计算结果而被TransparentBlt2()调用时,它们执行所花的时间上的不相等会不会导致TransparentBlt2()效果的异样呢?举个例子,当人物移动到了man[0].x0和man[0].y0的那一瞬间(这是manmove()计算的作用,显然人物此时应立马由走转为站的状态,这就要求人物由走转为站之前的最后一帧恰好是人物"走"动画图片的最后一张,图片当前P的是函数bianfw()作用而来的),此时人物的图片播放(就是bianfw()计算出的当前的P值)是不是刚好就播放到了"走"动作动画的最后一张呢,如果还没有(manmove()完成时的当前系统时间比bianfw()小),那么最终的效果就是上面第二段开头说到的"人物到达目标点后当前动画还未播放到'走'的最后一帧而卡在那里的现象",如果超过了(manmove()完成时的当前系统时间比bianfw()多),那么最终的效果就是上面第二段开头说到的"人物到达目标后点还在走动的现象"..

学VC 编游戏 重点算法解疑系列文档 - 走四方相关推荐

  1. 《学VC 编游戏》重点算法解疑·走四方

    对manmove()和bianfw()的理解 manmove()实际上实现的作用是计算man[i](i的值由manmove()的入口参数i的当前值取得)的man[i].xix,man[i],yiy当前 ...

  2. 老猿学5G扫盲贴:3GPP规范文档命名规则及同系列文档阅读指南

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在学习5G规范过程中,有些内容把握不定的时候,有时 ...

  3. FLANN快速近似最邻近算法官方指导文档

    FLANN快速近似最邻近算法官方指导文档 Introduction Quick Start 快速学习 Downloading and compiling FLANN 下载和编译 Upgrading f ...

  4. java openoffice 打印_java调用openoffice将office系列文档转换为PDF的示例方法

    前导: 发过程中经常会使用java将office系列文档转换为PDF, 一般都使用微软提供的openoffice+jodconverter 实现转换文档. openoffice既有windows版本也 ...

  5. NLP之TM之LDA:利用LDA算法瞬时掌握文档的主题内容—利用希拉里邮件数据集训练LDA模型并对新文本进行主题分类

    NLP之TM之LDA:利用LDA算法瞬时掌握文档的主题内容-利用希拉里邮件数据集训练LDA模型并对新文本进行主题分类 目录 输出结果 设计思路 核心代码 训练数据集 LDA模型应用 输出结果 设计思路 ...

  6. vc编写供vb使用的dll文档

    vc编写供vb使用的dll文档 工具:vc6 工程类型: win32 dynamic_link library 要点: 1 导出函数的参数入栈 _stdcall 2 导出函数的定义 写在 .def文件 ...

  7. Echarts地图详细镇区的划分_echarts乡镇地图,echarts地图街道-算法与数据结构文档

    Echarts地图详细镇区的划分_echarts乡镇地图,echarts地图街道-算法与数据结构文档类资源-CSDN下载

  8. AIO系列文档(2)----TIO使用

    AIO系列文档(1)----图解ByteBuffer中介绍了ByteBuffer用法,下面通过介绍t-io介绍如何使用: hello world例子简介 本例子演示的是一个典型的TCP长连接应用,代码 ...

  9. cocos2dx+java部落战争全套游戏源码资源策划文档

    cocos2dx+java部落战争全套游戏源码资源策划文档,客户端cocos2dx 服务器java完整源码. 源码下载链接 cocos2dx+java部落战争全套游戏源码资源-cocos2D文档类资源 ...

最新文章

  1. spark大批量读取Hbase时出现java.lang.OutOfMemoryError: unable to create new native thread
  2. 从字符串中删除所有出现的char
  3. k8s之service服务(微服务)
  4. 王道考研 计算机网络6 OSI参考模型和各层作用
  5. Java面向对象和面向过程有什么区别?网友:傻傻分不清楚……
  6. 【Restful】你还不懂Restful API规范吗?
  7. c# npoi 公式不计算_玉米扣量因素:水分、杂质、不完善粒、生霉粒,检测方法及计算公式...
  8. Java三种嵌入jsp的方法
  9. 加密算法(二)——MD5,Base64,DES,RSA加密算法解析
  10. 软件测试之常见性能测试流程
  11. 本科论文房地产公司财务风险评价与控制研究
  12. FileNet 开发资料 官方红皮书
  13. thinkphp5 模板使用php,模板 · ThinkPHP5.1完全开发手册 · 看云
  14. 计算机应用基础都学什么,计算机应用基础学习计划
  15. 关于股票的经典书籍有哪些推荐?
  16. GGSN与SGSN简介
  17. J2ME移动开发平台搭建
  18. python 使用pip安装和更新包
  19. 希捷服务器硬盘15k有几代,硬盘巨头推最后一代15k机械硬盘:再见,机械硬盘
  20. 第十二届蓝桥杯省赛 C/C++大学B组 试题G:砝码称重

热门文章

  1. 内网穿透实现外网访问内网SQL数据库
  2. 查看电脑的usb使用记录
  3. 训练中文版chatgpt
  4. 100行代码让你的代码跳起舞(视频转字符画)
  5. python念数字的题目_Python挑战100题(31~33)
  6. 【python经典练习题100-试题6】打印字母C H
  7. 如何写出高质量的年终总结
  8. python模拟登录教程_Python淘宝模拟登录教程
  9. vue中冒号+属性名是什么意思?
  10. java中的方法重载和重写