前言

在很多2D游戏中,都会涉及到角色移动,跳跃等操作,最典型的就是横板闯关游戏。例如经典的魂斗罗、三国战纪等。这两款游戏在地图移动和角色行走的方式中唯一的不同就是魂斗罗是没有纵深的那种。

看似简单,其实涉及了地图,摄像机移动,数学和物理的一些内容。

本片内容先介绍一下移动组件的定义,稍后的文章会一点点讲解地图、自定义摄像机等,最终应用到游戏中,做成一个完整的demo。

坐标系

首先不得不说的一点,所有的移动都是依托坐标系的。我们这里的坐标系是以左下角为原点,横向向右为x正方向,纵向向上为y正方向,朝向屏幕的方向为z正方向,也就是unity使用的左手坐标系。而cocoscreator使用的是右手坐标系,但是这个转换是比较简单的。

移动组件的定义

首先列举一下移动中都需要支持哪些功能

  1. 上下移动: 对于不可以上下移动的游戏来说,z方向的速度始终为0即可。
  2. 左右移动:x坐标的变化。
  3. 支持两个方向同时移动:当同时按下前上键时应该可以向左前方移动。
  4. 移动速度定义:当某个方向有速度时,才会向某个方向移动,站立状态下,所有方向速度均为0.
  5. 弹力:这个是为了模拟球的落地弹起,实现并不要求那么严格的。
  6. 摩擦力: 这个是为了模拟逐渐停止的效果。实现并不要求那么严格。
  7. 是否受重力影响: 对于一些不受重力影响的物理,可以不做重力计算
  8. 是否启用: 只有启用以后才会进行移动计算。
  9. 在游戏地图中的坐标:记录角色当前在地图中的位置。
import { DIR } from "../../cfw/tools/Define";
import PhysicalManager from "./PhysicalManager";
const { ccclass, property } = cc._decorator;@ccclass
export default class MoveSystem extends cc.Component {@property({ displayName: '是否受重力' })g: Boolean = true;@property({ displayName: '是否启用' })enable: Boolean = true;@property({ displayName: '速度' })speed: cc.Vec3 = cc.v3(0, 0, 0)// 弹力@property({ type: cc.Float, displayName: '弹力' })elasticity: number = 0;//摩擦力@property({ type: cc.Float, displayName: '摩擦力' })frictional: number = 1;@property({ type: cc.Float, displayName: '跳跃高度' })jumpHigh: number = 350;//左右移动方向protected moveXDir: DIR = DIR.RIGHT;//上下移动方向protected moveZDir: DIR = DIR.UP;//角色在地图中的位置protected position: cc.Vec3 = cc.v3(0, 0, 0)start() {if (this.enable) {this.setEnable(true)}}onDestroy() {if (this.enable) {this.setEnable(false)}}setEnable(f: boolean) {this.enable = f;cc.log('MoveSystem setEnable f ', f)if (this.enable) {PhysicalManager.instance().add(this)} else {PhysicalManager.instance().remove(this)}}isEnable() {return this.enable;}setMoveXDir(d: DIR) {this.moveXDir = d;}getMoveXDir() {return this.moveXDir;}setMoveZDir(d: DIR) {this.moveZDir = d;}getMoveZDir() {return this.moveZDir;}getFrictional() {return this.frictional;}setGrictional(n: number) {this.frictional = n;}setElasticity(n: number) {this.elasticity = n;}getElasticity() {return this.elasticity;}isG() {return this.g}setG(f: boolean) {this.g = f;}getJumpHigh() {return this.jumpHigh;}setJumpHight(h: number) {this.jumpHigh = h;}addJumpHigh(h: number) {this.jumpHigh += h;}isJumping() {return this.speed.y != 0;}setX(x: number) {this.position.x = x;}setY(y: number) {this.position.y = y;}getZ() {return this.position.z;}setZ(z: number) {this.position.z = z;this.node.zIndex = -z}getX() {return this.position.x;}getY() {return this.position.y;}getSpeedX() {return this.speed.x;}setSpeedX(s: number) {this.speed.x = s;}setSpeedY(spy: number) {this.speed.y = spy;}getSpeedY() {return this.speed.y}setSpeedZ(z: number) {this.speed.z = z;}getSpeedZ() {return this.speed.z;}
}

结语

对于移动的需求可能不止如此,但是在我以往的开发过程中,有这些已经可以应付大多数游戏的需求了。代码仅供参考,欢迎留言探讨。

欢迎关注我的个人GZH<微笑游戏>

欢迎扫码关注公众号《微笑游戏》,浏览更多内容。

横板闯关游戏中的角色移动相关推荐

  1. 导图解文 从梦想到财富(32)说服,是个闯关游戏

    系列文章说明: 本系列文章 主要是 使用 思维导图 对知乎 上一个知乎上的专题系列文章<从梦想到财富>的 一个解读. 1 文章链接 本章节 对应 <从梦想到财富>专栏的 文章链 ...

  2. Android 端 2D 横屏动作冒险类闯关游戏【100010436】

    Android 端 2D 横屏动作冒险类闯关游戏 摘要 随着闯关类游戏的玩法与数目的不断增加,本文所设计的一款名为<Wander In Color>的动作冒险闯关类游戏,将从一个新的角度入 ...

  3. [Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo

    [Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo ​ 一个简单的单机闯关小游戏,主角到达终点即为胜利,关卡中有两种怪物能够对主角造成伤害,此外还有灯.陷阱.宝箱等场景互动要素,主角从宝箱 ...

  4. 网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点

    前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 本文讲描述, 如何在网页端实现一个仿微信 ...

  5. 程序猿光棍节闯关游戏

    好无聊好寂寞,来玩一下.... 因为我不是程序猿,所以应该闯不到头的.... 边闯边写就是了 第一关链接请戳 http://segmentfault.com/game/ 第一关查看源代码即可 于是得到 ...

  6. 闯关游戏android studio,闯关游戏方案

    社团节闭幕式闯关游戏方案 一.活动意义 本次活动有助于提高校园文化氛围,丰富大家的课外娱乐生活,让同学们走出宿舍,走下网络.不但提升同学们的生活品质,而且增强同学们的综合素质,激发大家积极向上的生命热 ...

  7. 网页闯关游戏(riddle webgame)--SQL注入的潘多拉魔盒

    前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. web开发初学者往往会忽视一些常见的漏洞 ...

  8. ZZULIOJ 2829: 闯关游戏

    题目描述 小i正在玩一个闯关游戏,游戏一共n关. 初始的时候小i有H点体力以及0个金币. 小i只能按从第1关到第n关按顺序完成.在第i关时,小i要在三种操作中选择一种: 1.当前体力不小于Ai可以选择 ...

  9. 《基于Unity的2D多人乱斗闯关游戏设计与开发》--小组博客综述

    文章目录 项目名称 项目背景 项目简介 项目架构 项目特色 大致功能需求 游戏模式/内容 项目技术选型 项目分工 项目具体计划 此次项目实训不完全按照项目计划书进行,因为游戏范围太广,可能随时调整游戏 ...

最新文章

  1. 【图论专题】有向图的强连通分量
  2. oracle rac服务供应商,【Oracle Database】Oracle RAC(八):服务资源管理
  3. 加快vs2010的启动速度
  4. 《机器学习实战》-线性回归
  5. java定时任务详解
  6. 区块链在数据流通中的应用
  7. 《Spring 3.0就这么简单》——1.5 业务层
  8. 关于如何解决特定场景下WPF4.0中“XamlWriter.Save序列化限制”问题的一种思路
  9. Matlab 数字滤波器设计大报告(数字信号处理课程设计)附代码
  10. pytorch迁移学习--模型建立的代码实现
  11. keras TimeDistributed 描述
  12. 小程序ios android差异,解决小程序textarea在安卓和ios上padding不一的问题
  13. linux拷贝文件夹下所有文件
  14. Dvr的工作原理及入门分析
  15. java语言算阴影梯形面积_例1.2 在梯形中阴影部分面积是150平方厘米,求梯形面积。(《信息学奥赛一本通》)...
  16. Bootstrap实战---footer处理
  17. 【bug修复】低版本工程导入Unity2018 Shader 报错
  18. 《创业,我们创什么》---- 读书笔记
  19. web前端培训开发,你必须知道的CSS盒模型
  20. “项目经理,程序员的中年危机

热门文章

  1. 【Linux集群教程】07 块存储之 iSCSI 服务
  2. intellij idea字体大小设置一秒完成
  3. STM32芯片的ADC引脚的识别与选择
  4. 计算机原理及应用自测题4,自测题-微计算机原理-电子发烧友网站
  5. python中的库有哪些餐厅_推荐一些实用的的 Python 库
  6. 【聚类之DBSCAN】DBSCAN实例
  7. 自控带宽频率等相关介绍
  8. 润物细无声之千分之一
  9. 银河麒麟专用服务器RPM软件包打包方式。
  10. Excel-计算数列元素间的和差