`
Fis
  • 浏览: 88349 次
  • 性别: Icon_minigender_1
  • 来自: 龙城
社区版块
存档分类
最新评论

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

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

相关推荐

    EB163 45度地图编辑器

    《EB163 45度地图编辑器》是一款专为45度角游戏设计的专业地图编辑工具,它集成了源代码,使得用户不仅可以直接使用编辑器进行地图创作,还能根据自身需求对软件进行扩展和定制。这款编辑器的出现,极大地提升了游戏...

    Eb163MapEditor

    《EB163 MapEditor:开源游戏地图编辑器的创新与实践》 EB163 MapEditor是由eb163.com的研发团队精心打造的一款专为Flash游戏设计的45度视角地图编辑器。这款编辑器是在原有的HeptaFish MapEditor基础上进行升级...

    flex游戏 rpg game

    "eb163.com上的地图编辑器"可能是一个在线工具,帮助开发者快速设计和布局游戏地图。这样的工具通常允许用户放置各种对象、地形和路径,然后导出为可以在游戏引擎中使用的格式。使用第三方地图编辑器可以显著提高...

    flash MMO RPG地图编辑器喝DOME

    压缩包内的" Eb163MapEditor_code_1_6_2.rar"很可能包含了地图编辑器的源代码,版本号1.6.2,开发者可以通过查看源码了解其工作原理,进行定制或改进。而"MapDemo.rar"可能是一个示例地图或演示项目,展示了编辑器的...

    flash actionscript3游戏开发之斜45度游戏地图编辑器.zip

    `Eb163RpgGameDemo_1_6.rar` 和 `EB163 Flash RPG Webgame Demo V1.06开源网页游戏发布,源代码下载.txt` 提供了基于AS3的RPG游戏的示例,这不仅可以展示AS3在游戏开发中的应用,还展示了如何将编辑器创建的地图实际...

    EB.zip_ABAQUS_abaqus邓肯张eb_eb子程序_邓肯EB_邓肯张EB

    在"EB.zip_ABAQUS_abaqus邓肯张eb_eb子程序_邓肯EB_邓肯张EB"这个压缩包中,包含了一个名为"EB.for"的FORTRAN源代码文件,这就是用于实现邓肯张模型的ABAQUS子程序。该子程序通常会包含以下几个核心部分: 1. 初始...

    45度开源游戏地图编辑器

    使用说明: 1、菜单中的“新增”按钮可以增加一个新的地图工程,地图选择本地图片,可以设置宽度和高度以及每...用EB163 MapEditor 45度开源游戏地图编辑器创建新地图 http://www.eb163.com/club/thread-14363-1-1.html

    威纶通触摸屏EB8000编写的程序如何转换到EB PRO中?.docx

    EB8000和EB PRO是威纶通推出的不同系列的产品,它们各自拥有独特的特性和功能。有时,用户可能需要将使用EB8000设计的程序转换到EB PRO系列上,以利用更高级的功能或者适应新的设备需求。以下是一份详细步骤,指导...

    cmp.rar_EB8000_EB8000触摸屏_eb8000proje_eb8000软件实例_site:www.pudn.co

    "cmp.rar_EB8000_EB8000触摸屏_eb8000proje_eb8000软件实例"这个压缩包文件,包含了一个基于EB8000 Project Manager开发的触摸屏应用示例,对于学习和掌握EB8000触摸屏的编程与应用具有重要的参考价值。 EB8000触摸...

    EB-Propsim-C8_2.3.rar_EB propsim_eb信道

    首先,EB Propsim C8是一款功能强大的硬件平台,它可以模拟各种复杂的无线通信信道条件,包括室内、室外、移动环境以及多种多径传播效应。在2.3版本中,可能包含了一些更新和改进,如增强的处理能力、新增的信道模型...

    威纶通EB8000图库

    【威纶通EB8000图库】是专为威纶通EB8000系列触摸屏设计的一套全面的图形资源集合。这个图库包含了大量的预设图形、符号和图片,旨在帮助用户在创建和编辑触摸屏界面时提供便利,提升工作效率。通过加载这些图库,...

    EB8000 中文版教程

    《EB8000中文版教程》是一份专注于教授如何使用EB8000软件创建和设计人机界面(HMI)的专业教程。EB8000是一款强大的工控软件,广泛应用于工业自动化领域,它提供了直观的用户界面设计工具,帮助工程师们构建与设备...

    EB8000常用图库

    在IT行业中,尤其是在工业自动化和人机交互领域,威伦屏(Weinview)的EB8000系列是一款广泛使用的触摸屏编程软件。这款软件提供了丰富的功能,帮助工程师们设计出直观、易于操作的界面,以实现设备监控和控制。"EB...

    威纶EB500 使用手冊

    【威纶EB500使用手册】是一份详尽的指南,旨在帮助用户熟悉和有效操作威纶EB500系列触摸屏显示器。这个设备广泛应用于工业自动化领域,作为人机交互界面,允许用户直观地监控和控制各种工业设备。 在手册的00《目录...

    smartRF04EB驱动(含win7 64bit).zip

    标题中的"smartRF04EB驱动(含win7 64bit).zip"指的是一个针对smartRF04EB开发板的驱动程序包,这个包特别包含了适用于Windows 7 64位操作系统的驱动。smartRF04EB是德州仪器(TI)推出的一款无线射频(RF)开发工具,...

    EB工具快速上手指南.pdf

    本文介绍了使用 EB tresos Studio 23.0.0(以下如有用到均简称为“EB” )和 MCAL 软件的获取、安装、安装后的 MCAL 文件所包含文件内容的介绍、 EB 工具新建配置工程的详细步骤、 EB 工具的校验 及配置代码的生成等...

    接收机灵敏度计算公式word版本

    在公式 F = (Sin / Nin) / (Sout / Nout) 中,Sin 和 Nin 分别代表输入信号功率和输入噪声功率,而 Sout 和 Nout 是输出的对应值。 在扩频通信系统中,例如CDMA或WCDMA,射频信号功率与Eb/No的关系可以通过噪声系数...

    3_EB_Tresos导入System desk中新增Task(runnable).pdf

    这份文档是一份指导手册,介绍了如何在EB_Tresos环境中将System desk中生成的ARXML文件导入并添加新的Task(可运行体)至 Autosar 配置中。Autosar (AUTomotive Open System ARchitecture) 是汽车行业的一个标准化...

    文华公式指标公式源码文华财经指标压力支撑画线指标.doc

    文华公式指标公式源码文华财经指标压力支撑画线指标 文华公式指标是基于技术分析的指标,旨在帮助投资者和交易者进行股票市场分析和预测。该指标结合了多种技术指标,包括移动平均线、指数平滑移动平均线、相对强弱...

Global site tag (gtag.js) - Google Analytics