999合1超级简易文字菜单组件

news2025/2/25 13:41:25

贪吃蛇掌机经典小游戏录屏

引言

超级简易文字菜单组件

大家好,相信大家都玩过那个999合1的游戏,特别是那个菜单

在游戏开发中,往往会有形式各异游戏菜单游戏菜单菜单一样主要是给玩家选择开始游戏、设置、排行榜等功能的。

本文将分享一下笔者在游戏开发中用到的超级简易文字菜单组件

本文源工程可在文末阅读原文获取,小伙伴们自行前往。

1.需求分析

一般游戏菜单组件会包含以下的一些功能:

  • 菜单的展示效果。
  • 菜单的选择效果。
  • 菜单的跳转效果。
  • 菜单的自定义。

下面一起来实现超级简易文字菜单组件

2.超级简易文字菜单组件

1.环境

引擎版本:Cocos Creator 3.8.1

编程语言:TypeScript

2.资源准备

由于是非常简易的文字菜单,本次节目只需要简单的摆一下盘即可,不需要额外的资源

  • UI布局

  • 添加Layout组件以及挂载我们的SuperEasyMenuImpl组件。

  • 设置Label左对齐。

下面一起来写代码。

3.编写代码

首先我们创建一个SuperEasyMenu组件。它的组成如下:

  • 初始化,在start方法中监听键盘事件,控制菜单的选择。
@ccclass('SuperEasyMenu')
export class SuperEasyMenu extends Component {

    private curMenu: MenuItem[] = [];
    private lastMenu: MenuItem[] = [];
    private menuLabels: Label[] = [];
    private curSelect: number;

    start() {
        this.menuLabels.push(...this.node.getComponentsInChildren(Label));

        input.on(Input.EventType.KEY_DOWN, event => {
            if (event.keyCode == KeyCode.ENTER || event.keyCode == KeyCode.SPACE) {
                this.selectMenu();
            }
            else if (event.keyCode == KeyCode.ARROW_UP || event.keyCode == KeyCode.KEY_W) {
                this.CurSelect = this.CurSelect - 1;
            }
            else if (event.keyCode == KeyCode.ARROW_DOWN || event.keyCode == KeyCode.KEY_S) {
                this.CurSelect = this.CurSelect + 1;
            }
        })
    }
}
  • 设置当前菜单,更新菜单显示,默认选择第一个菜单项,lastMenu保存上一个菜单用于返回。
public setCurMenu(menu) {
    this.lastMenu = this.curMenu;
    this.curMenu = menu;
    for (var i = 0; i < this.curMenu.length; i++) {
        this.menuLabels[i].string = this.curMenu[i].name;
    }
    for (var i = this.curMenu.length; i < this.menuLabels.length; i++) {
        this.menuLabels[i].string = "";
    }
    this.CurSelect = 0;
}

public toLastMenu() {
    this.setCurMenu(this.lastMenu);
}
  • 菜单的选择,菜单的选择主要用属性curSelect驱动,并实现一下选择效果。
public set CurSelect(select: number) {
    if (select >= 0 && select < this.curMenu.length) {
        this.curSelect = select;
        for (let i = 0; i < this.curMenu.length; i++) {
            this.menuLabels[i].string = (select == i ? "★ " : "    ") + this.curMenu[i].name;
        }
    }
}

public get CurSelect(): number {
    return this.curSelect;
}
  • 确认选择,具体生效的我们的选择。
public selectMenu() {
    if (this.curMenu.length > 0 && this.curMenu[this.CurSelect].func) {
        this.curMenu[this.CurSelect].func.call(this);
    }
}
  • 自定义菜单,创建SuperEasyMenuImpl组件继承SuperEasyMenu组件,用于定制菜单以及跳转。
import { _decorator } from 'cc';
import { MenuItem, SuperEasyMenu } from './SuperEasyMenu';
const { ccclass } = _decorator;

@ccclass('SuperEasyMenuImpl')
export class SuperEasyMenuImpl extends SuperEasyMenu {

    private toGameMenu: MenuItem[] = [
        new MenuItem("填色之旅", () => { }),
        new MenuItem("重力迷宫球", () => { }),
        new MenuItem("贪吃蛇掌机", () => { }),
        new MenuItem("返回", () => { this.toLastMenu() })
    ];

    private mainMenu: MenuItem[] = [
        new MenuItem("开始游戏", () => { this.setCurMenu(this.gameMenu) }),
        new MenuItem("排行榜", () => { this.setCurMenu(this.rankMenu) }),
        new MenuItem("分享快乐", () => { }),
        new MenuItem("更多游戏", () => { this.setCurMenu(this.toGameMenu) })
    ];

    private gameMenu: MenuItem[] = [
        new MenuItem("游戏暂停", () => { this.setCurMenu(this.pauseMenu) }),
        new MenuItem("游戏结束", () => { this.setCurMenu(this.gameoverMenu) }),
        new MenuItem("返回", () => { this.toLastMenu() })
    ];

    private pauseMenu: MenuItem[] = [
        new MenuItem("继续游戏", () => { this.toLastMenu() }),
        new MenuItem("重新开始", () => { this.setCurMenu(this.gameMenu) }),
        new MenuItem("返回主页", () => { this.setCurMenu(this.mainMenu) }),
    ];

    private gameoverMenu: MenuItem[] = [
        new MenuItem("视频复活", () => { }),
        new MenuItem("重新开始", () => { this.setCurMenu(this.gameMenu) }),
        new MenuItem("排行榜", () => { this.setCurMenu(this.rankMenu) }),
        new MenuItem("晒一晒", () => { }),
        new MenuItem("返回主页", () => { this.setCurMenu(this.mainMenu) }),
    ];

    private rankMenu: MenuItem[] = [
        new MenuItem("好友排行", () => { }),
        new MenuItem("世界排行", () => { }),
        new MenuItem("返回", () => { this.toLastMenu() })
    ];

    start() {
        super.start();
        this.setCurMenu(this.mainMenu);
    }
}

就这样我们的代码编写完毕,下面看看效果。

4.效果演示

结语

本文源工程可通过私信SuperEasyMenu获取。

在哪里可以看到如此清晰的思路,快跟上我的节奏!关注我,和我一起了解游戏行业最新动态,学习游戏开发技巧。

我是"亿元程序员",一位有着8年游戏行业经验的主程。在游戏开发中,希望能给到您帮助, 也希望通过您能帮助到大家。

AD:笔者线上的小游戏《贪吃蛇掌机经典》《重力迷宫球》《填色之旅》大家可以自行点击搜索体验。

实不相瞒,想要个在看!请把该文章分享给你觉得有需要的其他小伙伴。谢谢!

推荐专栏:

100个Cocos实例

8年主程手把手打造Cocos独立游戏开发框架

和8年游戏主程一起学习设计模式

从零开始开发贪吃蛇小游戏到上线系列

知识付费专栏

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

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

相关文章

【MMC子系统】四、MMC控制器驱动层

我的圈子&#xff1a; 高级工程师聚集地 我是董哥&#xff0c;高级嵌入式软件开发工程师&#xff0c;从事嵌入式Linux驱动开发和系统开发&#xff0c;曾就职于世界500强企业&#xff01; 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; …

网络服务DHCP与DNS

一 DHCP的工作原理&#xff08;租约过程&#xff09; 分类 1&#xff09;自动分配&#xff1a;分配到一个IP地址后永久使用 &#xff08;2&#xff09;手动分配&#xff1a;由DHCP服务器管理员指定IP&#xff08;打印机、报销系统&#xff09;把mac地址和ip地址做一个一一对…

猫粮对比:性价比高的主食冻干猫粮推荐

虽然很多铲屎官可能认为给猫咪喂猫粮就足够了&#xff0c;但实际上猫咪对蛋白质的需求很高&#xff0c;并且作为肉食动物&#xff0c;它们更喜欢肉的味道。而冻干猫粮是采用低温和真空干燥处理技术将鲜肉制成&#xff0c;去除水分并保持蛋白质等营养物质不变性&#xff0c;同时…

办公自动应用,HR大屏可视化模板

大家可以进行资料下载。 完整的案例。 AIGC ChatGPT 职场案例 AI 绘画 与 短视频制作 PowerBI 商业智能 68集 数据库Mysql 8.0 54集 数据库Oracle 21C 142集 Office 2021实战应用 Python 数据分析实战&#xff0c; ETL Informatica 数据仓库案例实战 Excel 2021实操 100集&a…

premiere简约大气3D动画logo片头Pr模板Mogrt免费下载

Premiere简约大气3D动画logo片头pr模板mogrt下载&#xff0c;无需插件&#xff0c;高清分辨率&#xff0c;易于自定义&#xff0c;包括教程&#xff0c;不包括音频和图像。免费下载&#xff1a;https://prmuban.com/37065.html

路由黑洞和黑洞路由的区别

路由黑洞&#xff1a; 路由黑洞是一种现象&#xff0c;一般是在网络边界做汇总回程路由的时候产生的一种不太愿意出现的现象&#xff0c;就是汇总的时候有时会有一些不在内网中存在的网段&#xff0c;但是又包含在汇总后的网段中&#xff0c;如果在这个汇总的边界设备上同时还配…

【JVM】本地方法接口 Native Interface

一、JNI简介 JVM本地方法接口&#xff08;Java Native Interface&#xff0c;JNI&#xff09;是一种允许Java代码调用本地方法&#xff08;如C或C编写的方法&#xff09;的机制。这种技术通常用于实现高性能的计算密集型任务&#xff0c;或者与底层系统库进行交互。 二、JNI组…

西门子S7-1200与S7-300PLC的九大不同点

S7-1200作为新推出的紧凑型控制器&#xff0c;其产品定位在原有的SIMATIC S7-200和S7-300之间&#xff0c;它与S7-300的区别主要体现在硬件、通信、工程、存储器、功能块、计数器、定时器、工艺功能等方面。 一、硬件的区别 在硬件扩展方面&#xff0c;S7-300的主机架多支持八…

现代密码学 考点复盘

现代密码学 考点汇总&#xff08;上&#xff09; 写在最前面考试范围一、给一个简单的方案&#xff0c;判断是否cca安全二、随机预言机模型之下的简单应用 考试题目1.证明CBC方案是CPA安全的2. 证明哈希函数的抗碰撞性3. CBC-MAC安全&#xff1a;证明CPA安全的对称密钥加密方案…

Digital Audio (HDMI)未插入 用Hdmi连接电脑 显示高清数字音频未插入 win10电脑没声音,喇叭上一个叉❌

先说结论&#xff0c;出现这些问题的原因&#xff1a; 未插入音频设备或者硬件问题&#xff08;10%&#xff09;设置错误&#xff0c;未使用显示器音频 &#xff08;30%&#xff09;音频驱动不兼容或者没有驱动&#xff08;50%&#xff09;其他驱动有问题 &#xff08;10%&…

YOLOv8改进 | 二次创新篇 | 结合iRMB和EMA形成全新的iEMA机制(全网独家创新)

一、本文介绍 本文给大家带来的改进机制是二次创新的机制,二次创新是我们发表论文中关键的一环,为什么这么说,从去年的三月份开始对于图像领域的论文发表其实是变难的了,在那之前大家可能搭搭积木的情况下就可以简单的发表一篇论文,但是从去年开始单纯的搭积木其实发表论…

自动化测试框架pytest系列之基础概念介绍(一)

如果你要打算学习自动化测试 &#xff0c;无论是web自动化、app自动化还是接口自动化 &#xff0c;在学习的道路上&#xff0c;你几乎会遇到pytest这个测试框架&#xff0c;因为自动化编写没有测试框架&#xff0c;根本玩不了 。 如果你已经是一位自动化测试人员 &#xff0c;…

效率交响曲:AIOps 协调卓越运营

作者&#xff1a;来自 Elastic Priscilla_Parodi ​ 在我们探索 AIOps 之前&#xff0c;让我们先澄清一些与不同 Ops 的一些单并非全部相关的关键概念&#xff1a; 1&#xff09;DevOps&#xff1a;开发运维 你可能已经听说过 DevOps。 它是一种通过协作和自动化促进交付来集…

Apollo计算几何算法(一)

Planning模块&#xff0c;路径和速度曲线抽象成折线&#xff08;Polyline&#xff09;&#xff0c;障碍物抽象成多边形&#xff08;Polygon&#xff09;。在碰撞检测、投影计算距离、平滑曲线等方面应用广泛。 1 几何算法 1.1 线段 moudles/common/math/line_segment2d.h n…

怎么投稿各大媒体网站?

怎么投稿各大媒体网站&#xff1f;这是很多写作者及自媒体从业者经常面临的问题。在信息爆炸的时代&#xff0c;如何将自己的文章推送到广大读者面前&#xff0c;成为了一个不可避免的挑战。本文将为大家介绍一种简单有效的投稿方法——媒介库发稿平台发稿&#xff0c;帮助大家…

rke2 Online Deploy Rancher v2.8.0 latest (helm 在线部署 rancher v2.8.0)

文章目录 1. 简介2. 预备条件3. 安装 helm4. 安装 cert-manager4.1 yaml 安装4.2 helm 安装 5. 安装 rancher6. 验证7. 界面预览 1. 简介 Rancher 是一个 Kubernetes 管理工具&#xff0c;让你能在任何地方和任何提供商上部署和运行集群。 Rancher 可以创建来自 Kubernetes 托…

常用的网站

PIXEL MOTION 注册-YesPMP平台 模型下载 - Ourblender - 专业的三维素材库 Vega AI 创作平台 夏沫的AI小站 Tripo AI B站视频下载工具 | 极简纯净

如何通过 Prompt 优化大模型 Text2SQL 的效果

前言 在上篇文章中「大模型LLM在Text2SQL上的应用实践」介绍了基于SQLDatabaseChain的Text2SQL实践&#xff0c;但对于逻辑复杂的查询在稳定性、可靠性、安全性方面可能无法达到预期&#xff0c;比如输出幻觉、数据安全、用户输入错误等问题。 本文将从以下4个方面探讨通过Pr…

gem5学习(11):将缓存添加到配置脚本中——Adding cache to the configuration script

目录 一、Creating cache objects 1、Classic caches and Ruby 二、Cache 1、导入SimObject(s) 2、创建L1Cache 3、创建L1Cache子类 4、创建L2Cache 5、L1Cache添加连接函数 6、为L1ICache和L1DCache添加连接函数 7、为L2Cache添加内存侧和CPU侧的连接函数 完整代码…

大模型学习之书生·浦语大模型4——基于Xtuner大模型微调实战

基于Xtuner大模型微调实战 Fintune简介 海量数据训练的base model指令微调Instructed LLM 增量预训练微调 增量数据不需要问题&#xff0c;只需要答案&#xff0c;只需要陈述类的数据 指令跟随微调 指定角色指定问题给对应的user指定答案给assistant LIaMa2InternLM 不同的模…