前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Creator3D 打砖块子弹发射,以及摄像机平滑移动控制!

Creator3D 打砖块子弹发射,以及摄像机平滑移动控制!

作者头像
张晓衡
发布2019-10-14 18:01:37
9410
发布2019-10-14 18:01:37
举报
文章被收录于专栏:Creator星球游戏开发社区

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

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

1

子弹的发射

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

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

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

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

代码语言:javascript
复制
import { _decorator, Component, Node, CCObject, Prefab, instantiate, RigidBodyComponent, Vec3 } from "cc";
const { ccclass, property } = _decorator;

@ccclass("shoot")
export class shoot extends Component {

    @property(Prefab)
    bullet: Prefab;

    @property(cc.Float)
    speed = 0;

    start () {
        //注册全局触摸点击事件
        cc.systemEvent.on(Node.EventType.TOUCH_END, () => {
            this.shoot();
        });
    }

    shoot() {
        //实例化 bullet 预制体
        let node = instantiate(this.bullet);
        node.parent = this.node.parent;
        node.position = this.node.position;
        //为刚体施加冲量
        let bullet:RigidBodyComponent = node.getComponent(RigidBodyComponent);
        bullet.applyImpulse(new Vec3(0, 2.29, -1 * this.speed));
    }

这里需要注意两点:

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

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

2

摄像机移动

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

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

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

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

代码语言:javascript
复制
//使用 cc.systemEvent.on 注册全局键盘事件
start() {
    cc.systemEvent.on(Node.EventType.KEY_DOWN, this.onKeyDown, this);
    cc.systemEvent.on(Node.EventType.KEY_UP, this.onKeyUp, this);
        ...
}

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

代码语言:javascript
复制
onKeyDown(event) {
    cc.log(event);
    let rotation = this.node.eulerAngles;
    let position = this.node.getPosition();
    switch(event.keyCode) {
        case cc.macro.KEY.w:
            this.offset.y = 1;
            break;
        case cc.macro.KEY.s:
            this.offset.y = -1;
            break;
        case cc.macro.KEY.a:
            this.offset.x = -1;
            break;
        case cc.macro.KEY.d:
            this.offset.x = 1;
            break;
    }
}

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

代码语言:javascript
复制
onKeyUp() {
    this.offset.x = 0;
    this.offset.y = 0;
    this.offset.z = 0;
}

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

代码语言:javascript
复制
update (deltaTime: number) {
    //计算要移动的目标位置
    Vec3.add(this.point, this.node.position, this.offset);
    //插值计算
    Vec3.lerp(this.point, this.node.position, this.point, deltaTime * this.speed);
    //移动节点
    this.node.setPosition(this.point);
}

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

3

小结

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

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

源码下载地址:https://pan.baidu.com/s/1KadJBNUngg7pAYEFTwTj9g 密码:zjf4

原创不易,特别是一个新的东西,如果教程对你有用,也感谢你点个赞或分享给更多的人,你的鼓励是我创作的巨大动力,愿我们在前进的道路上砥砺前行,共同成长!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Creator星球游戏开发社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档