“灵剑出鞘”小游戏开发日志(11)---- 激励广告后的额外奖励

背景

前面游戏的基础版本基本已经开发,接下来主要是一些优化和内容的拓展。其本质是留住用户,让用户玩得爽。本节主要是做一个简单激励,使用户在第一次失败后,获得一次重生的机会。

目标

玩家在出手次数用尽,第一次闯关失败的情况下,给与弹窗提示。用户观看完视频后,给与重生并获得3次“出鞘”机会。

开发过程

玩家失败时,先来个提示是否需要复活的弹窗,如果选择否再向服务端发起结算请求。

PS: 后期优化后,改用了 view不用comp(具体看后面的补充)

            let _BattleOverLoseComp = ooxh.game.battleEntity.attachComponent(BattleOverLoseComp);
            _BattleOverLoseComp.conditionItems = battleInfo.loseCondition
            _BattleOverLoseComp.callback = () => {
                // 第一次失败,给一次复活机会
                if (!ooxh.game.battleEntity.getComponent(BattleStateComp).isRevive) {
                    ooxh.game.battleEntity.attachComponent(BattleGetReviveViewComp).doOtherCallback = (isOk) => {
                        if (!isOk) {
                            ooxh.game.battleEntity.attachComponent(BattleLoseViewComp) // 显示失败结算页面
                        }else {
                            ooxh.game.battleEntity.getComponent(BattleStateComp).isRevive = true
                        }
                    }
                } else {
                    ooxh.game.battleEntity.attachComponent(BattleLoseViewComp) // 显示失败结算页面
                }
            }

如果是需要复活,则检测一下当前是什么环境

export class BattleGetReviveViewSystem {

    apply(entity: Entity) {

    }

    static listenClick(comp: BattleGetReviveViewComp) {
        comp.node.getChildByName('nothinks').on(Node.EventType.TOUCH_END, BattleGetReviveViewSystem.nothinks, comp);
        comp.node.getChildByName('ok').on(Node.EventType.TOUCH_END, BattleGetReviveViewSystem.okPlay, comp);
    }
    static unListenClick(comp: BattleGetReviveViewComp) {
        comp.node.getChildByName('nothinks').off(Node.EventType.TOUCH_END, BattleGetReviveViewSystem.nothinks, comp);
        comp.node.getChildByName('ok').off(Node.EventType.TOUCH_END, BattleGetReviveViewSystem.okPlay, comp);
    }

    static nothinks(event: EventTouch) {
        let comp: BattleGetReviveViewComp = (this as unknown as BattleGetReviveViewComp)
        BattleGetReviveViewSystem.notRevive(comp)
    }

    static okPlay(event: EventTouch) {
        let comp: BattleGetReviveViewComp = (this as unknown as BattleGetReviveViewComp)
        if (BYTEDANCE) {
            DyUtil.showVideo({
                successCallback: () => {
                    BattleGetReviveViewSystem.doRevive(comp)
                },
                failCallback: () => {
                    BattleGetReviveViewSystem.notRevive(comp)
                }
            })
        } else {
            BattleGetReviveViewSystem.doRevive(comp)
        }
    }

    static doRevive(comp: BattleGetReviveViewComp) {
        // 修改复活的数据
        ooxh.game.battleEntity.getComponent(BattleStateComp).isGameOver = false
        ooxh.game.battleEntity.getComponent(BattleOverLoseComp).conditionItems.forEach((_item) => {
            if (_item.event == EventBusType.ChuQiao) {
                _item.value += 3
            }
        })
        // 其他非本组件内的逻辑回调
        comp.doOtherCallback && comp.doOtherCallback(true)
        ooxh.game.battleEntity.detachComponent(BattleGetReviveViewComp)
    }

    static notRevive(comp: BattleGetReviveViewComp) {
        // 其他非本组件内的逻辑回调
        comp.doOtherCallback && comp.doOtherCallback(false)
        ooxh.game.battleEntity.detachComponent(BattleGetReviveViewComp)
    }

}

export class BattleGetReviveViewComp extends PooledComponent {

    node: Node = null
    callback: Function = null
    doOtherCallback: Function = null

    reset() {
        this.node = null
        this.callback = null
        this.doOtherCallback = null
    }

    onAttach(entity: Entity) {
        this.entity = entity
        console.log('实体', entity, '挂载了 BattleGetReviveViewComp')
        resources.load('gui/get_revive', Prefab, (err, prefab) => {
            if (err) {
                console.error('Failed to load prefab:', err);
                return;
            }
            this.node = instantiate(prefab);
            ooxh.gui.root.addChild(this.node);
            // 玩家-监听按钮和触控
            BattleGetReviveViewSystem.listenClick(this)
            this.callback && this.callback()
        });
    }

    onDetach(entity: Entity) {
        this.entity = null
        console.log('实体', entity, '移除了 BattleGetReviveViewComp')
        this.node.destroy()
        BattleGetReviveViewSystem.unListenClick(this)
    }
}

这里面做了一个字节的工具 DyUtil

如果环境是非字节小游戏或者微信,就直接给与奖励

测试

 

 

完成了观看激励广告后的奖励

下一个开发计划

 完善关卡信息,上线前的关卡测试及优化

PS:2023年6月8日补充:

因采用view 这里补充优化后的

checkWinLose() {
        // 胜利与失败条件
        const battleInfo = ooxh.game.battleEntity.getComponent(BattleStateComp).battleInfo
        let _BattleOverWinComp = ooxh.game.battleEntity.attachComponent(BattleOverWinComp);
        _BattleOverWinComp.conditionItems = battleInfo.winCondition
        _BattleOverWinComp.callback = () => {
            this.openDialogWhenChuQiaoOver(() => {
                this._postAndShowDialog(OverType.Win)
            })
        }
        let _BattleOverLoseComp = ooxh.game.battleEntity.attachComponent(BattleOverLoseComp);
        _BattleOverLoseComp.conditionItems = battleInfo.loseCondition
        _BattleOverLoseComp.callback = () => {
            this.openDialogWhenChuQiaoOver(() => {
                // 第一次失败,给一次复活机会
                if (!ooxh.game.battleEntity.getComponent(BattleStateComp).isRevive) {
                    ooxh.gui.attachUICallback(UIID.Get_Revive, (uiView) => {
                        uiView.getComponent(GetReviveView).callback = (isOk) => {
                            if (!isOk) {
                                this._postAndShowDialog(OverType.Lose)
                            } else {
                                ooxh.game.battleEntity.getComponent(BattleOverLoseComp).conditionItems.forEach((_item) => {
                                    if (_item.event == EventBusType.ChuQiao) {
                                        this.vm.remain_chuqiao = _item.value - _item.finished
                                    }
                                })
                                ooxh.game.battleEntity.getComponent(BattleStateComp).isRevive = true
                            }
                        }
                    })
                } else {
                    this._postAndShowDialog(OverType.Lose)
                }
            })
        }
    }


    private _postAndShowDialog(overType: OverType) {
        // 记录
        HttpUtil.Post('/appletapi/jianchuqiao/overBattle',
            {
                battleLogId: ooxh.game.playerEntity.getComponent(PlayerStateComp).battleLogId,
                overType: overType
            },
            (res) => {
                if (res.code == 200) {
                    if (overType == OverType.Lose) {
                        // 显示失败结算页面
                        ooxh.gui.attachUICallback(UIID.Battle_Lose, (uiView) => {
                            uiView.getComponent(BattleLoseView).goods = res.data.goods
                        })
                    }
                    if (overType == OverType.Win) {
                        // 显示胜利结算页面
                        ooxh.gui.attachUICallback(UIID.Battle_Win, (uiView) => {
                            uiView.getComponent(BattleWinView).goods = res.data.goods
                        })
                    }
                    // 
                    const playerInfo = ooxh.game.getPlayerInfo()
                    playerInfo.ps = res.data.ps
                    playerInfo.gold = res.data.gold
                    playerInfo.diamond = res.data.diamond
                    playerInfo.last_battle_id = res.data.last_battle_id
                } else {
                    ooxh.gui.toast(res.msg)
                }
            })
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值