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

首发[url]www.eb163.com[/url]

  在[url=http://www.eb163.com/club/thread-14194-1-1.html]EB163 Flash RPG Webgame Demo V1.06[/url]源码中,经过观察和分析,明白了地图移动公式的原理,仅是个人看法,或有偏颇,欢迎大家拍砖共同探讨,下面一起看看。先是代码:

  人物类 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个条件的意思,由于地图的移动范围是限定在原点以左,不会超过原点,和原点重合的时候就是移动到了地图的左边缘,满足以上条件时就是地图允许被移动的时候。第二个判断(垂直方向)同理。
  条件成立后地图之所以要做反向运动,是因为地图的移动方向和人物相反,计算的偏移量是以人物的角度为参照的,故作反向运动。也正因为人物的移动和地图移动方向相反,所以就可以看到人物始终在地图中央了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值