水果机抽奖(CocosCreator)

简介: 水果机抽奖(CocosCreator)
推荐阅读:

一。前言

      在前面给大家分享了大转盘的抽奖方式,这是现在游戏使用较多的一种抽奖方式,今天给大家介绍另一抽奖方式——水果机,这是以前街机游戏使用较多的抽奖方式。该方式使用选中奖品的方式来进行抽奖。

二。算法讲解

先声明几个变量来控制选项依次选中的转动效果,可在properties里面声明,以方便调试时修改数值:

        //最大速度
        maxSpeed: {      
            default: 20,
            type: cc.Float,
            max: 30,
            min: 1,
        },
        //减速时间==加速时间
        duration: {      
            default: 2,
            type: cc.Float,
            max: 10,
            min: 1,
        },
        //加速度
        acc: {           
            default: 8,
            type: cc.Float,
            max: 10,
            min: 1,
        },
        gearNum: {
            default: 10,
            type: cc.Integer,
            max: 10,
            min: 1,
        },

不需要经常修改的变量,声明在onLoad中:

this.wheelState = 0;      //转盘状态  1--加速  2--减速   0--静止
this.curSpeed = 0;        //当前速度
this.spinTime = 0;        //减速前旋转时间
this.firstAngle = 30;    //每个奖品的中间角度
this.gearAngle = 60;    //每个奖品的角度
this.finalAngle = 0;    //最终结果指定的角度
this.decAngle = 3 * 360;//减速旋转三周

抽奖转动状态设置为3个阶段,0(未转动),1(加速阶段),2(减速状态)。在加速状态时,通过判断转动速度是否达到最大速度来判断下一阶段是继续加速还是开始减速。在减速阶段,通过判断减速阶段需要转动的角度是否等于减速阶段已经转过的角度,从而判断转动是否结束。

三。功能实现

1.加速阶段

        if (self.wheelState == 1) 
        {
            self.spinTime += dt;//加速阶段的时间累计
            self.uiRoot.startAward.rotation += self.curSpeed;//每帧后旋转的角度
            this.showIndexLight(self.uiRoot.startAward.rotation);//显示指针到达区域的奖品的外发光

            if (self.curSpeed <= self.maxSpeed) {
                self.curSpeed += self.acc;//修改下一帧速度
            } else {
                if (self.spinTime < self.duration) {//判断时间是否到
                    return;
                }
                //设置目标值
                self.finalAngle = self.targetID * self.gearAngle + self.firstAngle;//指针最后停留的位置
                self.maxSpeed = self.curSpeed;//当前速度未转动过程中的最大速度
                self.wheelState = 2;
            }
        }

2.减速阶段

         else if (self.wheelState == 2) 
         {
            var curRo = self.uiRoot.startAward.rotation;
            var hadRo = curRo - self.finalAngle;//减速阶段已经转过的角度
            self.curSpeed = self.maxSpeed * ((self.decAngle - hadRo) / self.decAngle) + 0.2;//后面加一个数是使指针最后能停下来
            self.uiRoot.startAward.rotation +=  self.curSpeed;
            this.showIndexLight(self.uiRoot.startAward.rotation);

            if ((self.decAngle - hadRo) <= 0) {//判断是否转完
                self.wheelState = 0;
                self.uiRoot.startAward.rotation = self.finalAngle;
                this.showIndexLight(self.uiRoot.startAward.rotation);
                //大转盘结束后的一些列操作,根据实际情况需要增加删除
                self.ctrolWheelItem(true);
                self.uiRoot.close.active = true;
                self.uiRoot.startBtn.active = true;
                self.uiRoot.close.active = true;
                self.uiRoot.sign.interactable = true;
                self.uiRoot.wheel.interactable = true;
                for (let i = 0; i < self.uiRoot.wheelBg.childrenCount; i++) {
                    cc.find("item" + i, self.uiRoot.wheelBg).getComponent(cc.Button).interactable = true;
                }
                
                var data = cls.WheelLayer._srvData.SC_Wheel_Info;
                let info = gm.GameData.getBagDataById(data.award[this.targetID].id);
               
                self.showRewardBox(data.award[this.targetID].id, info.Icon, data.award[this.targetID].num);

                console.log("抽奖操作结束,需要同步奖励奖励数据,暂时不知道同步到哪里去");
            }

同步指针指到的奖品区域外发光

    //显示指针到达的区域发光
    showIndexLight(rot) {
        var index = parseInt(rot / 60) % 6;/60代表每个奖品格子的角度,6代表一共6个格式
        for (let i = 0; i < this.wheelLight.length; i++) {
            this.wheelLight[i].active = false;
        }
        this.wheelLight[index].active = true;
    },
相关文章
|
数据库 容器
Flutter笔记:滚动之-无限滚动与动态加载的实现
Flutter笔记:滚动之-无限滚动与动态加载的实现
752 0
|
存储
CocosCreator3.8研究笔记(十一)CocosCreator Prefab(预制件)理解
CocosCreator3.8研究笔记(十一)CocosCreator Prefab(预制件)理解
1141 0
|
前端开发 JavaScript
uniapp移动端悬浮按钮(吸附边缘)
uniapp移动端悬浮按钮(吸附边缘)
759 0
|
前端开发 资源调度 开发工具
AntD Admin — Ant Design 风格的中后台前端解决方案
AntD Admin  一套优秀的中后台前端解决方案。 特性 国际化,源码中抽离翻译字段,按需加载语言包 动态权限,不同权限对应不同菜单 优雅美观,Ant Design 设计体系 Mock 数据,本地数据调试 使用 1、下载项目代码。
14912 0
|
11月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
731 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
7月前
|
数据安全/隐私保护 Android开发 Windows
2025 年三款免费高清无水印视频录制工具推荐合集
本文介绍了三款免费高清录屏软件:EVCapture、Bandicam 和 屏幕录像机(oCam)。EVCapture 功能强大,支持视频录制与直播,提供分屏录制、实时按键显示等;Bandicam 适合游戏录屏,可自定义录制区域并添加Logo,还支持音频和摄像头设置;oCam 小巧灵活,支持多种视频格式(如GIF、MP4等)及音频、截图功能。三者均无水印,画质清晰,满足不同录屏需求。资源地址已提供,可供下载体验。
6300 0
|
JSON API 开发者
淘宝商品销量数据接口:获取与利用全攻略
淘宝商品销量数据接口让开发者获取平台上商品的销量信息。首先,需在开放平台注册并创建应用;随后获取API密钥(appkey与appsecret),用于身份验证。参考官方文档了解接口详情,通过HTTP请求调用接口并设置参数如商品ID。接口返回JSON格式数据,需用编程语言解析提取销量数据。示例代码展示了如何使用Python和requests库调用接口及打印结果。使用时应遵守规定,避免违规行为,并关注接口更新。若无开发能力,可选用第三方服务但需谨慎评估。
1061 0
|
JSON JavaScript 前端开发
【JavaScript】JavaScript中的深拷贝与浅拷贝详解:基础概念与区别
JavaScript 中,理解数据拷贝的深浅至关重要。浅拷贝(如扩展运算符`...`、`Object.assign()`)仅复制对象第一层,共享内部引用,导致修改时产生意外联动。深拷贝(如自定义递归函数、`_.cloneDeep`或`JSON.parse(JSON.stringify())`)创建独立副本,确保数据隔离。选择哪种取决于性能、数据独立性和资源需求。深拷贝虽慢,但确保安全;浅拷贝快,但需小心引用共享。在面试中,理解这些概念及其应用场景是关键。
787 4
【JavaScript】JavaScript中的深拷贝与浅拷贝详解:基础概念与区别
|
索引
|
Android开发
Cocos Creator 花了一个月入门经历
一个与人入门算是最笨的那种了吧 分享给大家入门视频教程
1218 0
Cocos Creator 花了一个月入门经历