经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
Cocos Creator 3D 打砖块教程(二) | 子弹发射与摄像机平滑移动
来源:cnblogs  作者:张晓衡  时间:2019/10/14 11:59:02  对本文有异议

在线体验链接:
http://example.creator-star.cn/block3d/

file

前面一篇文章,我们讲了【打砖块】游戏中的3D物体的场景布局、材质资源、物理刚体与碰撞组件,接下来本篇文章重点介绍“子弹的发射”与“摄像机移动”,有了这两部分我们的【打砖块】游戏就可以初步玩起来了。

子弹的发射

子弹是由 3D 物体 Sphere 球体创建,并将节点改名为 bullet,看下图:
file

在层级管理器中将 bullet 节点拖动到资源管理器中,将它创建成一个 Prefab 预制体。同时在 bullet 子弹节点上挂载球体碰撞组件(cc.SphereColliderComponent)和刚体组件 (cc.RigidBodyComponent),如下图所示:
file

有了 bullet 预制体,我们就可以用代码去实例化它,并将他发射出去,创建一个 shoot 的TypeScript 脚本并将它挂载到 Camera 摄像机节点上:
file

将shoot组件的子弹预制体拖动过去,子弹的移动速度设置为 50,我们通过点击屏幕来进行发射,下面是具体的代码:

  1. import { _decorator, Component, Node, CCObject, Prefab, instantiate, RigidBodyComponent, Vec3 } from "cc";
  2. const { ccclass, property } = _decorator;
  3. @ccclass("shoot")
  4. export class shoot extends Component {
  5. @property(Prefab)
  6. bullet: Prefab;
  7. @property(cc.Float)
  8. speed = 0;
  9. start () {
  10. //注册全局触摸点击事件
  11. cc.systemEvent.on(Node.EventType.TOUCH_END, () => {
  12. this.shoot();
  13. });
  14. }
  15. shoot() {
  16. //实例化 bullet 预制体
  17. let node = instantiate(this.bullet);
  18. node.parent = this.node.parent;
  19. node.position = this.node.position;
  20. //为刚体施加冲量
  21. let bullet:RigidBodyComponent = node.getComponent(RigidBodyComponent);
  22. bullet.applyImpulse(new Vec3(0, 2.29, -1 * this.speed));
  23. }

这里需要注意两点:

  1. 触摸事件是使用cc.systemEvent进行注册的;
  2. 工程中没有代码提示,需要从引擎安装目录中复制cc.d.ts文件到工程中,我是在Mac系统上,可以用下面命令复制:
  1. cp /Applications/CocosCreator3D.app/Contents/Resources/resources/3d/engine/bin/.declarations/cc.d.ts ./

预制体的实例化使用instantiate 与我们在Creator 2D中使用的API完全相同,就不在赘述。这时我们就可以运行预览,通过点击鼠标或触摸屏幕发射子弹了。

摄像机移动

在3D游戏中,通常的做法是使用WSAD四个键进行上下左右的移动,其核心是控制摄像机节点的位置。在我们这个游戏中为了简化游戏操作,我们只控制摄像的 x 和 y 方向的移动:

  • w:y方向增加
  • s:y方向减小
  • a:x方向减小
  • d:x方向增加

创建一个 movement 的脚本用于控制摄像机的移动,下面是组件的设置:
file

下面重点分析使用键盘控制摄像机移动的相关代码:

  1. //使用 cc.systemEvent.on 注册全局键盘事件
  2. start() {
  3. cc.systemEvent.on(Node.EventType.KEY_DOWN, this.onKeyDown, this);
  4. cc.systemEvent.on(Node.EventType.KEY_UP, this.onKeyUp, this);
  5. ...
  6. }

在按钮下键盘事件 onKeyDown 中标记移动的方向:

  1. onKeyDown(event) {
  2. cc.log(event);
  3. let rotation = this.node.eulerAngles;
  4. let position = this.node.getPosition();
  5. switch(event.keyCode) {
  6. case cc.macro.KEY.w:
  7. this.offset.y = 1;
  8. break;
  9. case cc.macro.KEY.s:
  10. this.offset.y = -1;
  11. break;
  12. case cc.macro.KEY.a:
  13. this.offset.x = -1;
  14. break;
  15. case cc.macro.KEY.d:
  16. this.offset.x = 1;
  17. break;
  18. }
  19. }

当按键松开时,将 offset 变量归 0:

  1. onKeyUp() {
  2. this.offset.x = 0;
  3. this.offset.y = 0;
  4. this.offset.z = 0;
  5. }

重点是在组件的每帧事件 update 中真正控制摄像机节点的移动:

  1. update (deltaTime: number) {
  2. //计算要移动的目标位置
  3. Vec3.add(this.point, this.node.position, this.offset);
  4. //插值计算
  5. Vec3.lerp(this.point, this.node.position, this.point, deltaTime * this.speed);
  6. //移动节点
  7. this.node.setPosition(this.point);
  8. }

为了平滑移动,Shawn这里参考了官方Demo案例中的做法,使用 Vec3.lerp 对当前坐标到要移动的坐标进行插值计算。

小结

Creator3D 打砖块是 Shawn 制作的第一个 3D 游戏,也是公众号上第一次写的 3D 相关的教程,目前他只能算是一个 DEMO,还有很多不足的地方,如有不正之处还请大家多多指正。

原创不易,特别是一个新的东西,如果文章对你有用,也感谢你点个在再看或分享给朋友,你的鼓励是我创作的动力,愿我们在前进的道路上砥砺前行,共同成长!

file

本文由博客一文多发平台 OpenWrite 发布!

原文链接:http://www.cnblogs.com/creator-star/p/11670019.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号