论坛首页 编程语言技术论坛

[原创]EB163 RPG MapDemo地图移动公式

浏览 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个条件的意思,由于地图的移动范围是限定在原点以左,不会超过原点,和原点重合的时候就是移动到了地图的左边缘,满足以上条件时就是地图允许被移动的时候。第二个判断(垂直方向)同理。
  条件成立后地图之所以要做反向运动,是因为地图的移动方向和人物相反,计算的偏移量是以人物的角度为参照的,故作反向运动。也正因为人物的移动和地图移动方向相反,所以就可以看到人物始终在地图中央了。
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics