经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
横板闯关游戏中的角色移动
来源:cnblogs  作者:游子陈  时间:2021/1/11 9:10:03  对本文有异议

前言

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

u=2765856917,2407716076&fm=26&gp=0.jpg

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

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

坐标系

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

移动组件的定义

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

  1. 上下移动: 对于不可以上下移动的游戏来说,z方向的速度始终为0即可。
  2. 左右移动:x坐标的变化。
  3. 支持两个方向同时移动:当同时按下前上键时应该可以向左前方移动。
  4. 移动速度定义:当某个方向有速度时,才会向某个方向移动,站立状态下,所有方向速度均为0.
  5. 弹力:这个是为了模拟球的落地弹起,实现并不要求那么严格的。
  6. 摩擦力: 这个是为了模拟逐渐停止的效果。实现并不要求那么严格。
  7. 是否受重力影响: 对于一些不受重力影响的物理,可以不做重力计算
  8. 是否启用: 只有启用以后才会进行移动计算。
  9. 在游戏地图中的坐标:记录角色当前在地图中的位置。
  1. import { DIR } from "../../cfw/tools/Define";
  2. import PhysicalManager from "./PhysicalManager";
  3. const { ccclass, property } = cc._decorator;
  4. @ccclass
  5. export default class MoveSystem extends cc.Component {
  6. @property({ displayName: '是否受重力' })
  7. g: Boolean = true;
  8. @property({ displayName: '是否启用' })
  9. enable: Boolean = true;
  10. @property({ displayName: '速度' })
  11. speed: cc.Vec3 = cc.v3(0, 0, 0)
  12. // 弹力
  13. @property({ type: cc.Float, displayName: '弹力' })
  14. elasticity: number = 0;
  15. //摩擦力
  16. @property({ type: cc.Float, displayName: '摩擦力' })
  17. frictional: number = 1;
  18. @property({ type: cc.Float, displayName: '跳跃高度' })
  19. jumpHigh: number = 350;
  20. //左右移动方向
  21. protected moveXDir: DIR = DIR.RIGHT;
  22. //上下移动方向
  23. protected moveZDir: DIR = DIR.UP;
  24. //角色在地图中的位置
  25. protected position: cc.Vec3 = cc.v3(0, 0, 0)
  26. start() {
  27. if (this.enable) {
  28. this.setEnable(true)
  29. }
  30. }
  31. onDestroy() {
  32. if (this.enable) {
  33. this.setEnable(false)
  34. }
  35. }
  36. setEnable(f: boolean) {
  37. this.enable = f;
  38. cc.log('MoveSystem setEnable f ', f)
  39. if (this.enable) {
  40. PhysicalManager.instance().add(this)
  41. } else {
  42. PhysicalManager.instance().remove(this)
  43. }
  44. }
  45. isEnable() {
  46. return this.enable;
  47. }
  48. setMoveXDir(d: DIR) {
  49. this.moveXDir = d;
  50. }
  51. getMoveXDir() {
  52. return this.moveXDir;
  53. }
  54. setMoveZDir(d: DIR) {
  55. this.moveZDir = d;
  56. }
  57. getMoveZDir() {
  58. return this.moveZDir;
  59. }
  60. getFrictional() {
  61. return this.frictional;
  62. }
  63. setGrictional(n: number) {
  64. this.frictional = n;
  65. }
  66. setElasticity(n: number) {
  67. this.elasticity = n;
  68. }
  69. getElasticity() {
  70. return this.elasticity;
  71. }
  72. isG() {
  73. return this.g
  74. }
  75. setG(f: boolean) {
  76. this.g = f;
  77. }
  78. getJumpHigh() {
  79. return this.jumpHigh;
  80. }
  81. setJumpHight(h: number) {
  82. this.jumpHigh = h;
  83. }
  84. addJumpHigh(h: number) {
  85. this.jumpHigh += h;
  86. }
  87. isJumping() {
  88. return this.speed.y != 0;
  89. }
  90. setX(x: number) {
  91. this.position.x = x;
  92. }
  93. setY(y: number) {
  94. this.position.y = y;
  95. }
  96. getZ() {
  97. return this.position.z;
  98. }
  99. setZ(z: number) {
  100. this.position.z = z;
  101. this.node.zIndex = -z
  102. }
  103. getX() {
  104. return this.position.x;
  105. }
  106. getY() {
  107. return this.position.y;
  108. }
  109. getSpeedX() {
  110. return this.speed.x;
  111. }
  112. setSpeedX(s: number) {
  113. this.speed.x = s;
  114. }
  115. setSpeedY(spy: number) {
  116. this.speed.y = spy;
  117. }
  118. getSpeedY() {
  119. return this.speed.y
  120. }
  121. setSpeedZ(z: number) {
  122. this.speed.z = z;
  123. }
  124. getSpeedZ() {
  125. return this.speed.z;
  126. }
  127. }

结语

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

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

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

原文链接:http://www.cnblogs.com/cgw0827/p/14249751.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号