浏览 5777 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-03
www.eb163.com
首发在EB163 Flash RPG Webgame Demo V1.06源码中,经过观察和分析,明白了地图移动公式的原理,仅是个人看法,或有偏颇,欢迎大家拍砖共同探讨,下面一起看看。先是代码: 人物类 HeptaFishCharacter.as 第180行 protected function onMove(evet:Event):void{ var __xspeed:Number = 10*Math.cos(_angle); var __yspeed:Number = 10*Math.sin(_angle); var __dx:Number = _aimx-x; var __dy:Number = _aimy-y; var __newDistance:Number = __dx*__dx+__dy*__dy; x += __xspeed/2; y += __yspeed/2; var mapXSpeed:Number = _mapScene.x - __xspeed/2; var mapYSpeed:Number = _mapScene.y - __yspeed/2; var __scX:Number = Capabilities.screenResolutionX; var __scY:Number = Capabilities.screenResolutionY; if(mapXSpeed < 0 && mapXSpeed > -(_mapScene.mapWidth - __scX) && x >= __scX/2 && x <= _mapScene.mapWidth - __scX/2){ _mapScene.x -= __xspeed/2; } if(mapYSpeed < 0 && mapYSpeed > -(_mapScene.mapHeight - __scY) && y >= __scY/2 && y <= _mapScene.mapHeight - __scY/2){ _mapScene.y -= __yspeed/2; } if(__yspeed>0){ _faceToScreen = true; }else if(__yspeed<0){ _faceToScreen = false; } if(__newDistance<_speed*_speed || _distance<__newDistance){ x = _aimx; y = _aimy; stopCharacter(); dispatch(WalkEvent,WalkEvent.WALK_END); }else{ _distance = __newDistance; dispatch(WalkEvent,WalkEvent.ON_WALK); } _mapScene.mapLayer.checkLoad(new Point(this.x, this.y)); } 首先,公式重点在这个判断: if(mapXSpeed < 0 && mapXSpeed > -(_mapScene.mapWidth - __scX) && x >= __scX/2 && x <= _mapScene.mapWidth - __scX/2){ _mapScene.x -= __xspeed/2; } 这里提出一个理解的办法,因为公式中用到了一系列的比较,包括移动速度、地图宽高、屏幕宽高等数字量的关系,所以就涉及到地图宽高、屏幕宽高的比较。只要把“人物的移动”看成是“地图的移动”就好了,即“人物在动=地图在动”。 因为人物动等同于地图动,所以可以把人物行走的问题(人物在屏幕中行走)等价看成是地图在屏幕中行走的问题。 下面是公式解释: var __xspeed:Number = 10*Math.cos(_angle); var __yspeed:Number = 10*Math.sin(_angle); var __dx:Number = _aimx-x; var __dy:Number = _aimy-y; var __newDistance:Number = __dx*__dx+__dy*__dy; x += __xspeed/2; y += __yspeed/2; var mapXSpeed:Number = _mapScene.x - __xspeed/2; var mapYSpeed:Number = _mapScene.y - __yspeed/2; var __scX:Number = Capabilities.screenResolutionX; var __scY:Number = Capabilities.screenResolutionY; 以上声明是为公式用到的量做初始化和赋值操作,依次是: __xspeed、__yspeed:定义的水平速度、定义的垂直速度 __dx、__dy:水平方向矢量距离、垂直方向矢量距离 __newDistance:新的绝对距离 x += __xspeed/2:计算人物x坐标移动量 y += __yspeed/2:计算人物y坐标移动量 mapXSpeed、mapYSpeed:地图水平移动量(真实的水平移动量)、地图垂直移动量(真实的垂直移动量) __scX、__scY:屏幕宽度、屏幕高度 if(mapXSpeed < 0 && mapXSpeed > -(_mapScene.mapWidth - __scX) && x >= __scX/2 && x <= _mapScene.mapWidth - __scX/2){ _mapScene.x -= __xspeed/2; } 然后到移动公式,这里面做了4个比较,4个条件都成立的时候就让地图往做反向运动,这里单纯的做了两个方向上的判断,减少了判断代码量和判断的复杂程度。以第一个条件语句为例(水平方向的判断),这4个条件可以理解为: 1、mapXSpeed < 0:地图水平移动量小于0,数值表示的是地图的位移量,负号用来为地图的反向运动做铺垫。 2、mapXSpeed > -(_mapScene.mapWidth - __scX):地图水平移动量大于地图宽度与屏幕宽度的差,意味着地图还能向左移动。括号外的负号相当于把界线平移到原点左边。 3、x >= __scX/2:人物x坐标大于等于屏幕宽度的一半,意味着人物在屏幕的右半屏,地图可以往左移动。 4、x <= _mapScene.mapWidth - __scX/2:人物x坐标小于等于地图宽度与屏幕宽度一半的差,意味着人物尚未移动到地图的左边缘,人物可以继续往左移动。 以上就是4个条件的意思,由于地图的移动范围是限定在原点以左,不会超过原点,和原点重合的时候就是移动到了地图的左边缘,满足以上条件时就是地图允许被移动的时候。第二个判断(垂直方向)同理。 条件成立后地图之所以要做反向运动,是因为地图的移动方向和人物相反,计算的偏移量是以人物的角度为参照的,故作反向运动。也正因为人物的移动和地图移动方向相反,所以就可以看到人物始终在地图中央了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |