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

引言

超级简易文字菜单组件

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

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

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

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

1.需求分析

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

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

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

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

1.环境

引擎版本:Cocos Creator 3.8.1

编程语言:TypeScript

2.资源准备

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

  • UI布局。
  • 添加 Layout组件以及挂载我们的SuperEasyMenuImpl组件。
  • 设置 Label左对齐。

下面一起来写代码。

3.编写代码

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

  • 初始化 ,在start方法中监听键盘事件,控制菜单的选择。
typescript 复制代码
@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保存上一个菜单用于返回。
typescript 复制代码
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驱动,并实现一下选择效果。
typescript 复制代码
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;
}
  • 确认选择,具体生效的我们的选择。
typescript 复制代码
public selectMenu() {
    if (this.curMenu.length > 0 && this.curMenu[this.CurSelect].func) {
        this.curMenu[this.CurSelect].func.call(this);
    }
}
  • 自定义菜单 ,创建SuperEasyMenuImpl组件继承SuperEasyMenu组件,用于定制菜单以及跳转。
typescript 复制代码
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年游戏主程一起学习设计模式

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

知识付费专栏

相关推荐
孟健16 分钟前
Kimi K3.1 Pro 编程实测:3个月27万行代码,每年1.7万预算下如何9分钟修好顽固Bug
前端·开源·ai编程
inksci31 分钟前
在线编辑表格,功能强大,json互转
前端·javascript·html
咩咩啃树皮42 分钟前
JavaScript 中 this 指向为什么总在变?
开发语言·前端·javascript
彭亚川Allen1 小时前
从零手搓 RAG 之 Embedding 技术
前端·后端·面试
OpenTiny社区1 小时前
GenUI SDK v1.4.0 的 React 渲染器到底做对了什么?
前端·github·ai编程
jerrywus2 小时前
chrome-devtools-mcp 总弹授权、抢标签页?我是这样一步步配好的
前端·agent·mcp
橘猫走江湖2 小时前
Vue 3 虚拟 DOM:作用、触发机制,以及怎样变成页面上的真实节点
前端·vue.js·dom
郑州光合科技余经理2 小时前
同城小程序开发:同一笔单在用户端和商家端各显示到哪
android·java·开发语言·前端·后端·uni-app·php
zzppff1p3 小时前
用AI写了个小游戏
前端·javascript
陈随易3 小时前
终于 Token 自由了,AI 开支下降 10 倍
前端·后端·程序员