1. <pre name="code" class="plain">

  1.  

基于视口的地图设计

DionysosLai 2014-06-14

第三人称游戏,玩家是处在“上帝视角”掌控着整个游戏。因此,游戏设计中,我们要让游戏主角处于整个屏幕中央或者屏幕的大部分区域内,像《超级玛丽》、《天天酷跑》等一些游戏,细心点玩家就会发现主角在移动过程中,基本处于在同一个位置、或者在一定范围内,主角移动时,背景不会移动,可是当超出整个范围内,那么背景就会跟着移动了。统统这些设计,基本上就是基于视口的地图设计了。比較经典样例能够算是《愤慨的小鸟》了,注意这里的游戏主角是发射出来的那一仅仅小鸟。

对于这样的地图的设计,首先先了解视口概念。视口,即设定主角在普通情况下,能够移动的范围,超出这个范围,那么地图也要跟着移动了。假设不是普通情况,比方说地图已经移动到屏幕边缘了,这是角色超出视口时,地图是不能跟着角色移动的,不能就看到黑边了。对于视口,例如以下图所看到的:

图1

黑色区域就是黑色范围了。可是,这样设计的视口存在一个问题,就是当角色因为某种原因时(或许仅仅有上帝才知道这个原因吧),进入到了4个边角区域时,那么角色移动了,地图却不会移动(比方从A向B移动),而实际情况是地图也要跟着移动。这个问题,解决方法之中的一个,就是推断地图是否到了屏幕边缘,否则做一些处理;解决方法之二,就是又一次设定视口的概念。

另外一种的视口设计例如以下:

图2

视口这样设计,就能够避免上面存在的问题,可是有一个问题就是假设C朝箭头方向移动时,相同不会跨过视口,地图也不会移动了。为了解决问题,添加一条规定,就是假设角色在视口外了,且不向视口方向移动,那么相同地图也要跟着角色移动了。

Ok,到此,基于视口的地图设计基本就是这样了。

那么,以下就是问题,就是总体设计了。

因为,游戏中,要主角常常常常要处理一些碰撞,因此建议将主角放在地图同一层。因为这样设计,保存角色位置的不变动,在地图移动时,角色要朝着反方向移动了。

以下就是一些设计的一些重点了。

设计1 地图和角色的移动设计:

移动,归根究竟,就三种移动方式:

1. 角色和屏幕一起移动;

2. 角色移动、屏幕不移动;

3. 角色和地图均不移动------例如说,角色碰到障碍物了,要停止下来。

代码例如以下:

  1. enum /// 移动状态
  2. {
  3. MAP_E_MOVE_ALL, ///< 地图和角色均移动
  4. MAP_E_MOVE_ROLE, ///< 角色移动
  5. MAP_E_MOVE_STOP, ///< 地图和角色均不能移动
  6. };

设计2 怎样设置更改移动状态:

时时检測三种情况,1. 角色是否在视口内;2. 角色在视口外了,可是否有朝着视口移动的趋势;3. 角色是否碰到障碍物了。

代码例如以下:

  1. do
  2. {
  3. /// 首先预推断主角是否将会超出视口外而且当前在视口内
  4. if (isRoleInView(ccp(0,0)))
  5. {
  6. m_iMoveState = MAP_E_MOVE_ALL; ///< 地图和主角一起移动
  7. }
  8. else
  9. {
  10. /// 已经在视口外面了,就推断是否有想视口移动趋势
  11. if (roleToView(pointBy))
  12. {
  13. m_iMoveState = MAP_E_MOVE_ROLE; ///< 主角移动
  14. }
  15. else
  16. {
  17. m_iMoveState = MAP_E_MOVE_ALL; ///< 地图和主角一起移动
  18. }
  19. }
  20.  
  21. if (isCollision(ccpMult(pointBy, 2.f)))
  22. {
  23. m_iMoveState = MAP_E_MOVE_STOP;
  24. }
  25.  
  26. } while (0);

设计3 地图调整

依据移动状态,每时每刻都要移动地图,那么须要记录每一帧移动的大小,再推断         是否超出屏幕了,依据上下左右四个方向调整位置。

设计4 怎样移动

不建议使用引擎自带的moveBy函数,这是因为我们要时刻检測原因。因此,须要记录我们要移动的位置,依据角色位置(相信在平板上,玩家点击的位置,就是希望角色到达的位置),换算出相对向量。然后每一帧要移动距离乘于相对向量的单位向量了。

代码例如以下:

  1. float m_fMoveDistance; ///< 记录每次移动的距离
  2. cocos2d::CCPoint m_moveVector; ///< 移动向量
  3. float m_fMoveSpeed; ///< 移动速度

设计5 地图显示设计问题

屏幕大小就这么大,一张地图,就有一个屏幕大小,一个屏幕最多仅仅能显示四张地         图,因此,我们能够让不在屏幕内的地图临时消失起来,这样能够大大提高游戏效率。     ---在演示样例Demo中,我们设计了100*100的地图,执行起来很流畅。相同,假设有相

同的地图,能够使用CCSpriteBatchNode。

代码例如以下:在函数void setMapVisible(void);中

事实上,对于一些不在地图中显示道具、物品也能够採用这种方法。眼下代码中,没有这一    优化,后期要加上。

好了,基本上问题的攻克了。源码下载,请登入我的GitHup网址:https://github.com/DionysosLai/MapLayer。欢迎大家下载。

对于,眼下的设计,经过了游戏《超级挖地机》的检測,不存在问题。但存在一个设计bug,全然无法避免,就是在如图的情况下:

A朝着箭头的发现移动,假设A比較偏向屏幕右边,那么移动感觉好差啊。

coco2d-x 基于视口的地图设计的更多相关文章

  1. 解决CSS垂直居中的几种方法(基于绝对定位,基于视口单位,Flexbox方法)

    在CSS中对元素进行水平居中是非常简单的:如果它是一个行内元素,就对它的父元素应用 text-align: center ;如果它是一个块级元素,就对它自身应用 margin: auto.然而如果要对 ...

  2. CSS之基于不同场景的垂直居中解决方案

    元素的水平居中,如果是一个行内元素,就对它的父元素应用 “text-align:center”: 如果是一个块级元素,就对它自身应用“margin:auto”. 垂直居中的几种场景以及实现方法: 一. ...

  3. bootstrap学习笔记--bootstrap布局方式

    Bootstrap 3 是移动设备优先的,在这个意义上,Bootstrap 代码从小屏幕设备(比如移动设备.平板电脑)开始,然后扩展到大屏幕设备(比如笔记本电脑.台式电脑)上的组件和网格. 移动设备优 ...

  4. 前端知识杂烩(HTML[5]?+CSS篇)

    1. CSS 优先级算法如何计算?2.如何居中div?如何居中一个浮动元素?如何让绝对定位的div居中?3.用纯CSS创建一个三角形的原理是什么?4. 如何解决inline-block元素的空白间距( ...

  5. CSS实现元素水平垂直居中—喜欢对称美,这病没得治

    [TOC] 在CSS中对元素进行水平居中是非常简单的:如果它是一个行内元素,就对它的父元素应用text-align:center;如果它是一个块级元素,就对它自身应用margin:auto.然而要对一 ...

  6. Bootstrap CSS 栅格、代码和表格

    一.bootstrap栅格 Bootstrap 提供了一套响应式.移动设备优先的流式网格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列. Bootstrap 网格系统(G ...

  7. Bootstrap<基础二> 网格系统

    Bootstrap 提供了一套响应式.移动设备优先的流式网格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列. 什么是网格(Grid)? 摘自维基百科: 在平面设计中,网格 ...

  8. Bootstrap CSS概览代码文字标注篇

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  9. 浅淡HTML5移动Web开发

    说实话,我们这次开发移动端的项目,整个项目组的人都是第一次,最初立项的时候为是选择native app和web app还争论了一番,最后综合考虑,我们选择了web(我们选择了h5)开发.但从这两种开发 ...

随机推荐

  1. mysql iot 主键自增列问题

    mysql 如何避免热点块? 主键按sn自增列 Oracle 可以通过翻转索引 比如 插入101 102 103 104 变成101 201 301 401 分散数据 反转索引坏处,无法index r ...

  2. 【Demo 0008】标签控制器

    本章学习要点:       1.  了解标签控制器基础知识;       2.  掌握标签控制器层次结构;       3.  掌握标签控制器基本用法;       4.  掌握自定义标签控制器:   ...

  3. QSqlDatabase::addDatabase第一次运行的时候,生成SQLite文件的同时会产生一个默认连接

    QSqlDatabase::addDatabase第一次运行的时候,生成SQLite文件的同时会产生一个默认连接: QSqlDatabase database = QSqlDatabase::addD ...

  4. 设计模式(4)-对象创建型模式-Prototype模式

    1.对象创建型模式 1.4          Protoype模式 1.4.1需求 通过拷贝原形对象创建新的对象. 1.4.2结构 •P r o t o t y p e(Gr a p h i c) - ...

  5. iOS:点击button卡死

    场景:      在tableView的Cell中有一个button,我须要点击这个button然后使得其视图控制器上的一个视图改变frame,可是我点击这个button后,导致卡死,也不崩溃.所有事 ...

  6. MVC应用程序与多选列表(checkbox list)

    原文:MVC应用程序与多选列表(checkbox list) 程序中,经常会使用checkbox lsit来呈现数.能让用户有多选项目.此博文Insus.NET练习的checkbox list相关各个 ...

  7. Socket简介 (转)

    Socket小白篇-附加TCP/UDP简介 Socket 网络通信的要素 TCP和UDP Socket的通信流程图 1.Socket 什么是Socket Socket:又称作是套接字,网络上的两个程序 ...

  8. 怎样用Google APIs和Google的应用系统进行集成(1)----Google APIs简介

    Google的应用系统提供了非常多的应用,比方 Google广告.Google 任务,Google 日历.Google blogger,Google Plus,Google 地图等等非常的多的应用,请 ...

  9. SVN与TortoiseSVN实战:补丁详解(转)

    硬广:<SVN与TortoiseSVN实战>系列已经写了五篇,第二篇<SVN与TortoiseSVN实战:标签与分支>和第三篇<SVN与TortoiseSVN实战:Tor ...

  10. HYSBZ 1036(树链剖分)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28982#problem/E 题意:给定一棵树及树上的点权,要求三种操作: 1) ...