[转]http://www.cnblogs.com/BlueWoods/p/4684557.html

  这一节说说视窗,这个视窗,也就是游戏的视角。现在的网页游戏分为2D游戏,2.5D游戏和3D游戏,2D游戏基本是一些横板的,2.5D基本都是arpg的,可以说游戏画面投影的角度略有不同,3D网页游戏,现在也有不少,效果做的不错的,都是带微端的,不带微端同屏人数过多就会出现卡顿的情况。个人感觉网页还不太适合做3D的,一是效率问题,二是表现效果不如端游炫。端游开发周期较长,世界观比较宏大,玩家呢,要适应游戏世界,并在里面找到自己的定位,这样玩家的忠诚度比较高;而网页游戏的目的不恰恰相反,它主要是迎合玩家的口味,并利用玩家的心理诱导其充值,游戏周期一年左右,玩家玩一个月基本就没什么新东西了。

说的有点跑题了。这个视窗主要是根据玩家的坐标来控制人物层和地图层移动的,它包含四个属性:人物坐标FocusPoint,最大视窗:MaxRect,移动视窗:moveRect,屏幕视窗viewRect

  • 人物坐标fp:你玩网页游戏的时候,你会发现玩家的移动范围。当他移动到地图边界的时候,他才会真正的移向边界;当他远离边界的时候,他基本保持在屏幕的中央。虽然人物位置是按照格子坐标表示的,但是人物移动的时候,还是按照像素移动。
  • 最大范围MaxRect:就是当前地图的宽和高
  • 移动范围moveRect:玩家在此范围内移动,不会改变地图层的坐标,在游戏中我设置的可移动范围是100*100。其实你可以想象下:在屏幕的最中央,有100*100的矩形中,玩家在此移动是不会推图的,有助于提高玩家的体验,提升效率。
  • 屏幕视窗ScreenRect:就是舞台的宽高

算法代码如下:

public function setFocusPoint(p:Point) : void
{
_orx = _viewRect.x;
_ory = _viewRect.y; // 记录原始视窗坐标(记录的作用?)
_focusPoint.x = p.x >> 0;
_focusPoint.y = p.y >> 0;
focusPointChanged(); //触发视角变化事件
}

 

 

private function focusPointChanged() : void
{<br>    // 检测时否改变屏幕视窗的坐标
if (_focusPoint.x < _movableRect.x)
{
_viewRect.x = _focusPoint.x - _viewRect.width / 2 + _movableRect.width / 2;
}
if (_focusPoint.x > _movableRect.right)
{
_viewRect.x = _focusPoint.x - _viewRect.width / 2 - _movableRect.width / 2;
}
if (_focusPoint.y < _movableRect.y)
{
_viewRect.y = _focusPoint.y - _viewRect.height / 2 + _movableRect.height / 2;
}
if (_focusPoint.y > _movableRect.bottom)
{
_viewRect.y = _focusPoint.y - _viewRect.height / 2 - _movableRect.height / 2;
} ===========================================================================
checkViewRectOffset();//检测边界<br><br>    setMovableOffset(); // 屏幕视窗XY改变了,需要变化移动视窗的坐标
<em id="__mceDel">  moveMap();//加载地图
}
</em>
// 因为移动处于屏幕视窗的中央,屏幕视窗变化了,移动视窗也要重新计算其xy坐标<br>private function setMovableOffset() : void
{
_movableRect.x = _viewRect.x + (_viewRect.width - _movableRect.width) * 0.5;
_movableRect.y = _viewRect.y + (_viewRect.height - _movableRect.height) * 0.5;
}
//检测屏幕视窗的边界<br>private function checkViewRectOffset() : void
{
if (_viewRect.x < 0)
{
_viewRect.x = 0;
}
if (_viewRect.y < 0)
{
_viewRect.y = 0;
}
if (_viewRect.x + _viewRect.width > _maxRect.width)
{
_viewRect.x = _maxRect.width - _viewRect.width;
}
if (_viewRect.y + _viewRect.height > _maxRect.height)
{
_viewRect.y = _maxRect.height - _viewRect.height;
}
}

这是游戏视窗Manager,根据人物移动坐标变化而变化的代码,地图层是根据屏幕的坐标去判断加载哪块地图的。

arpg网页游戏之地图(二)的更多相关文章

  1. arpg网页游戏之地图(一)

    [转]http://www.cnblogs.com/BlueWoods/p/4681572.html?from=timeline&isappinstalled=1 开发arpg网页游戏一项比较 ...

  2. arpg网页游戏之地图(三)

    地图分块加载类MapEngine,主要包含以下属性: g 地图层graphics,地图将画在上面 buffPixelRange 地图加载范围矩形 viewPort 屏幕视窗 currZoneArr 已 ...

  3. arpg网页游戏之地图(四)

    这一节主要是针对上一节的补充,关于地图的优化策略上一节中已经涉及了一些,这一节具体说下. 地图块加载队列:就拿1280*800的屏幕分辨率来讲,大约需要加载的地图块为30~35块之间,如果这个时候一下 ...

  4. arpg网页游戏特效播放(一)

    网页游戏中的特效,主要包括:场景特效,攻击特效和UI特效三种.场景特效是在地图层上播放的特效,攻击特效主要是技能触发的一些特效,UI特效是面板上的一些特效,还有一些在人物身上播放的特效,例如脚底光圈特 ...

  5. 网页游戏开发秘笈 PDF扫描版

    精选10种常见的游戏类型,透过典型实例,深入剖析游戏引擎及工具的选用技巧,详细讲解每款游戏的制作过程,为快速掌握网页游戏开发提供系统而实用的指南. 网页游戏开发秘笈 目录: 译者序  前 言  导 言 ...

  6. 从零开始手把手教你使用javascript+canvas开发一个塔防游戏01地图创建

    项目演示 项目演示地址: 体验一下 项目源码: 项目源码 代码结构 本节做完效果 游戏主页面 index.html <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  7. [Mugeda HTML5技术教程之14]案例分析:制作网页游戏

    本文档要分析的案例是一个爱消除的网页小游戏,从中可以体会一些Mugeda API的用法和使用Mugeda动画制作网页游戏的方法. (一)游戏规则: 1.开始游戏时,手机出现在最上面一行的任意一格: 2 ...

  8. Phaser3 场景Scene之间的传值 -- HTML JAVASCRIPT 网页游戏开发

      PHASERJS3 一.首先当然得有至少有二个场景sceneA.js,sceneB.js 二.从场景A传值到场景B二种方法 1)通过事件this.events.emit('event key',{ ...

  9. qq开放平台可以应用到网页游戏的api整理

    创建角色界面api整理 一.需求描述 1.  创建角色名称可以用qq空间昵称代替 2.  如果玩家是在新区玩的话,赠送老玩家支持礼包 3.  可以看到,好友xxx也在玩,而且到了多少等级,如果加为好友 ...

随机推荐

  1. asp.net 发布后,遇到的导出excel报错的问题

    做的asp.net程序,最近要发布在外网上,发布过程不太难,网上都有现成的,只要按照相应的步骤基本都不会有什么问题,关键是发布成功后,程序中涉及到excel的导出或者导入问题,就会提示“检索COM 类 ...

  2. ibatis批量操作补充

    ibatis批量操作  这文章的补充吧. review代码的时候发现一个页面应用排序设置功能,原先代码中,进行了循环update实现.虽然应用较少,不过无谓浪费数据库链接实在不是一个好的想法. 所以, ...

  3. svn服务器迁移(生成dump)

    首先介绍一下dump文件 一定要进入VisualSVN服务端的安装目录里的bin目录下面,然后再执行svnadmin  相关命令. 不然会出现下图中的“svnadmin不是内部命令或外部命令,也不是可 ...

  4. Oracle、MySql、SQLServer 数据分页查询

    最近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴出来供大家学习..... (一). mysql的分页查询 mysql的分页查询是最简单的,借 ...

  5. javascript_data

    var now = new Date(); // Wed Jun 24 2015 19:49:22 GMT+0800 (CST) now; // 2015, 年份 now.getFullYear(); ...

  6. 基于Python的接口测试框架

    分析 接口是基于HTTP协议的,那么说白了,就是发起HTTP请求就行了,对于Python来说比较简单.直接使用requests就可以很轻松的完成任务. 架构 整个框架是比较小的,涉及的东西也比较少,只 ...

  7. knockout 学习实例7 foreach

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. eclipse 设置默认编码为Utf-8

    Window->Preferences->General ->Content Type->Text->JSP 最下面设置为UTF-8 Window->Prefere ...

  9. access数据库select查询top时无效的解决办法

    access数据库select查询top时有时无效,原因就是在使用Order by时,且排序的条件中数据有重复的. 比如:select top 10 * from table1 order by cd ...

  10. BizTalk 中使用 WCF-OracleDB adapter

    在使用BizTalk WCF-OracleDB adapter操作Oracle数据库时,遇到了一些问题,记录如下. 按照BizTalk的文档,目前BizTalk 2010支持的Oracle数据库版本如 ...