政安晨【示例演绎虚拟世界开发】(六):从制作一个对战小游戏开始(Cocos Creator 《击败老大》)(第三段)

news2024/11/15 19:59:13

在上一篇文章中,我们已经将游戏的场景基本搭建完毕,接下来我们就可以为游戏编写代码并实现相关的核心逻辑了。

政安晨的个人主页:政安晨

欢迎 👍点赞✍评论⭐收藏

收录专栏: AI虚拟世界大讲堂

希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正!


使用计时器

在游戏开始后,敌人的招式图片会随机变化

为了实现这一效果,我们可以每隔一段时间随机地显示三个招式的任意一个,并隐藏其余两个,从而实现招式不停变化的效果。

在Cocos Creator中,如果想要每隔一段时间触发一些行为,则可以使用计时器函数来实现

我们可以通过计时器在固定的时间间隔重复执行某个行为,只需要在计时器的回调中将enemy_skill子节点进行随机显示与隐藏即可。

在资源管理器的scripts文件夹下创建Game脚本,然后将脚本挂载到Canvas节点上:

接着对Game脚本进行编写,代码如下:

import { _decorator, Component, Node } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('Game')
export class Game extends Component {

    @property({ type: Node})
    private enemySkillNode: Node = null; // 绑定 enemy_skill 节点

    // 声明属性 children 的 cc 类型为 Node 数组
    @property({ type: [Node] })
    private children: Node[] = [];

    private enemyAttackType = 0; // 敌人招式 0: 弓箭, 1: 流星锤, 2:盾牌
    private timer = null; // 计时器
    
    
    start() {
        // 启动计时器, 每 0.1s 执行一次
        this.timer = setInterval(() => {
            this.randEnemyAttack();
        }, 100);
    }

    // 敌人的随机招式
    randEnemyAttack() {
        this.enemyAttackType = Math.floor(Math.random() * 3); // 给敌人随机招式0~2

        let allchildren = this.node.children; // 获取enemySkillNode下的所有子节点

        allchildren.forEach(childNode => {

            // 如果节点名字与随机招式的编号一致则显示, 否则将节点进行隐藏
            if (childNode.name == this.enemyAttackType.toString()) 
            {
                childNode.active = true;
            }
            else
            {
                childNode.active = false;
            }
        });
    }

    update(deltaTime: number) {
        
    }
}

脚本编写完成后,在属性检查器中将enemy_skill节点绑定到脚本上:

之后预览运行,此时敌人的招式图标已经可以随机变化了:

为了理解上面的代码,咱们这里再补充一下箭头函数的说明:

TypeScript是一种JavaScript的超集,在JavaScript的基础上添加了静态类型、类、模块等特性。箭头函数是TypeScript中的一种函数定义方式,它使用了箭头“=>”来表示函数的定义。

箭头函数的语法格式为:(参数列表) => 表达式或语句

其中,参数列表可以为空也可以包含一个或多个参数,多个参数之间使用逗号分隔。

表达式或语句可以是单个表达式或多个语句,如果是单个表达式,可以省略大括号{}和return关键字,直接返回表达式的结果。如果是多个语句,需要使用大括号{}将语句块包裹起来,并使用return关键字返回结果。

箭头函数的特点是可以继承当前上下文的this关键字,而不会创建一个新的this。这意味着在箭头函数中,this的值与包含它的函数相同。

以下是几个箭头函数的示例:

  1. 空参数的箭头函数: () => console.log("Hello, world!");

  2. 单个参数的箭头函数: (name) => console.log("Hello, " + name);

  3. 多个参数的箭头函数: (name, age) => console.log("Hello, " + name + ". You are " + age + " years old.");

  4. 箭头函数返回单个表达式的结果: (a, b) => a + b;

  5. 箭头函数返回多个语句的结果: (a, b) => { let sum = a + b; console.log(sum); return sum; }

箭头函数的使用使得函数的定义更加简洁和清晰,并且在处理this关键字的问题上更加方便。因此,在TypeScript中,箭头函数被广泛应用于编写可读性更高的代码。

好,现在咱们接着上面的例子:

在上面的代码中我们使用了计时器setInterval的方法,该方法会按照固定的周期(单位为毫秒)不停地调用randEnemyAttack函数,直到clearInterval被调用。同时,由setInterval返回的id值可以作为clearInterval的参数,因此我们事先定义了timer变量对其进行存储,以便后续进行相关处理。

使用Button组件

现在敌人已经可以进行随机出招了,接下来就需要为游戏添加相应的点击交互效果了。

在游戏中,我们希望在玩家点击三个技能中的任意一个后,由系统选定该招式为我方出招,同时使用选定的招式与敌人当前的招式进行比拼。

为了实现这一效果,我们需要在玩家点击任意一个招式时,触发事先编写的逻辑代码。在通常情况下,我们可以通过Button组件来实现这种交互效果

同时,为了给Button添加相应的响应函数事件,我们还需要在Game脚本中添加如下代码

(在Game脚本中增加如下代码,在类里添加,小伙伴们自己做一下)

    @property({ type: Label})
    private hintLabel: Label = null; // 绑定 hint 节点


    // 出招按钮响应函数
    attack (event, customEventData)
    {
    
    if (! this.timer)
    {
        return;
    }

    clearInterval(this.timer);
    this.timer = null;

    let pkRes = 0; //0: 平, 1:赢, -1:输
    let attackType = event.target.name; // 获取目标节点的name

    if (attackType == 0)
    {
        if (this.enemyAttackType == 0) 
        {
            pkRes = 0;
        }
        else if (this.enemyAttackType == 1) 
        {
            pkRes = 1;
        } 
        else if (this.enemyAttackType == 2) 
        {
            pkRes = -1;
        }
    } 
    else if (attackType == 1) 
    {
        if (this.enemyAttackType == 0)
        {
            pkRes = -1;
        }
        else if (this.enemyAttackType == 1) 
        {
            pkRes = 0;
        }
        else if (this.enemyAttackType == 2) 
        {
            pkRes = 1;
        }
    }
    else if (attackType == 2) 
    {
        if (this.enemyAttackType == 0)
        {
            pkRes = 1;
        }
        else if (this.enemyAttackType == 1) 
        {
            pkRes = -1;
        }
        else if (this.enemyAttackType == 2) 
        {
            pkRes = 0;
        }
    }

    if (pkRes == -1) 
    {
        this.hintLabel.string = '失败';
    }
    else if (pkRes == 1) 
    {
        this.hintLabel.string = '胜利';
    }
    else
    {
        this.hintLabel.string = '平局';
    }


}

代码添加完成后,在属性检查器中将hint节点绑定到脚本上。

之后需要依次为技能图标添加Button组件。

此处以弓箭图标为例,在层级管理器中选中弓箭图标节点,选择【添加组件】→【UI】→【Button】命令,即可为节点添加Button组件,如下图所示。

Button组件的相关属性如下表所示。

ClickEvents添加参数1后可以在展开项中看到下表所示的属性:

接着将组件的【Transition】属性修改为【SCALE】,同时为【ClickEvents】绑定【Game】脚本中的【attack】函数,并将【CustomEventData】的值修改为代表弓箭图标的编号【0】,如下图所示。

添加“重新开始”功能

现在我们的游戏已经可以玩起来了,不过每次结束比拼后就不可以继续进行游戏了,因此需要为游戏的【重新开始】按钮实现对应的逻辑功能。可以直接使用loadScene函数对Game场景进行加载,实现“重新开局”的效果。

为Game脚本添加如下代码:

    // 重新加载场景
    restart()
    {
         director.loadScene('Game');
    }

为场景右上角的【重新开始】按钮绑定restart函数,即可实现重新开始的功能了。这里需要注意的是,使用loadScene加载的场景名是区分大小写的,如果加载的场景名不一致或者不存在,则无法进行加载。


咱们这个游戏先告一段落,简单讲解了一下思路,接下来咱们用真正可以使用的例子继续学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1486632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多层感知机 + 代码实现 - 动手学深度学习v2 | 李沐动手学深度学习课程笔记

感知机 感知机≈二分类问题 感知机和其他问题的对比 训练感知机 如果小于等于零,说明预测错啦 ,其实就是同号为正,异号为负 举个分类的例子 增加样本,改变分类线 继续分类 感知机的收敛定理 XOR问题 XOR问题其实就是第1、3象限数…

前端学习第七天-css常用样式设置

达标要求 掌握元素的显示与隐藏 熟练应用溢出的文字隐藏 熟练掌握版心和布局流程 1. 元素的显示与隐藏 在CSS中有三个显示和隐藏的单词比较常见,我们要区分开,他们分别是 display visibility 和 overflow。 他们的主要目的是让一个元素在页面中消失…

外包干了6个月,技术退步明显

先说一下自己的情况,本科生,19年通过校招进入广州某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

(学习日记)2024.03.01:UCOSIII第三节 + 函数指针 (持续更新文件结构)

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

java-ssm-jsp-宠物护理预定系统

java-ssm-jsp-宠物护理预定系统 获取源码——》公主号:计算机专业毕设大全

勇敢尝鲜之Springboot3大坑-集成Mybatisplus报错:ddlApplicationRunner

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 往期热门专栏回顾 专栏…

【LeetCode-1143】最长公共子序列(动归)

目录 题目描述 解法1:动态规划 代码实现 题目链接 题目描述 给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除…

python识别并控制操作已打开的浏览器进行自动化测试

前提:已安装python和selenium 一、将浏览器以debugger模式打开 打开方法: 1.右击浏览器,选择属性: 2.在目标中加上 --remote-debugging-port9222 --user-data-dir"C:\selenum\AutomationProfile" 二、识别代码 from…

java面试题(spring框架篇)(黑马 )

树形图: 一、Spring框架种的单例bean是线程安全吗? Service Scope("singleton") public class UserServiceImpl implements UserService{ } singleton:bean在每个Spring IOC容器中只有一个实例 protype:一个bean的定义可以有多个…

加密与安全_探索签名算法

文章目录 概述应用常用数字签名算法CodeDSA签名ECDSA签名小结 概述 在非对称加密中,使用私钥加密、公钥解密确实是可行的,而且有着特定的应用场景,即数字签名。 数字签名的主要目的是确保消息的完整性、真实性和不可否认性。通过使用私钥加…

从零开始手写RPC框架(3)——ZooKeeper入门

目录 ZooKeeper简介ZooKeeper中的一些概念 ZooKeeper安装与常用命令常用命令 ZooKeeper Java客户端 Curator入门 ZooKeeper简介 是什么? ZooKeeper 是一个开源的分布式协调服务,本身就是一个分布式程序(只要半数以上节点存活,Zo…

Vue+SpringBoot打造海南旅游景点推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统&#xff…

酷开科技,让酷开系统成为现代生活的变革者

电视,从问世就一直受到人们的追捧。还记得小时候一家人围坐在电视机前的场景,小小的黑白屏幕,牢牢的吸引着大家的目光。随着科技的不断进步,我们的生活也发生了翻天覆地的变化。而电视,也从笨重的黑白电视变成了轻薄的…

8.WEB渗透测试-Linux基础知识-Linux基础操作(二)

内容参考于: 易锦网校会员专享课 上一个内容:7.WEB渗透测试-Linux基础知识-Linux基础操作(一)-CSDN博客 Tab键是补全命令,双击两下Tab键,会告诉你能补全的所有命令 文本编辑器指令:vi 输入vi 1…

React富文本编辑器开发(六)

现在,相关的基础知识我们应该有个大概的了解了,但离我们真正的开发出一个实用型的组件还有一段距离,不过不用担心,我们离目标已经越来越近。 以现在我们所了解的内容而言,或许你发现了一个问题,就是我们的编…

用Java语言创建的Spring Boot项目中,如何传递数组呢??

问题: 用Java语言创建的Spring Boot项目中,如何传递数组呢?? 在这个思路中,其实,Java作为一个后端开发的语言,没必要着重于如何传入,我们主要做的便是对传入的数组数据进行处理即可…

力扣hot6---双指针

题目: TLE做法(哈希两重for循环) 标签虽然说是用双指针,但是第一个想法真就不是双指针呀。。。就感觉这道题很像: 力扣hot1--哈希-CSDN博客 于是就用了类似的想法: 首先要排个序,至于为什么要…

MySQL 如何从 Binlog 找出变更记录并回滚

文章目录 前言1. 案例模拟1.1 确认信息1.2 下载 Binlog1.3 准备环境1.4 注册 Binlog1.5 准备结构信息1.6 Python 订阅1.7 输出结果展示 2. 原理解析2.1 程序设计2.2 模块版本 总结 前言 最近有研发同学问我:有一个问题,想查一个 ID 为 xxxx 的 sku 什么…

Linux(CentOS为例)环境下 Git提交代码加速,使用FastGithub,运行报错解决

当你的在服务器上使用Git进行推送时,时常会出现超时错误。这里使用FastGithub 首先下载FastGithub 这个软件作者不是为什么删除了GithUb的仓库,这个链接还有。下载Linux版本的 FastGithub Linux,Windows版本 下载完毕后解压 ./fastgithu…

Linux课程四课---Linux开发环境的使用(gcc/g++编译器的相关)

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…