背景
前面游戏的基础版本基本已经开发,接下来主要是一些优化和内容的拓展。其本质是留住用户,让用户玩得爽。本节主要是做一个简单激励,使用户在第一次失败后,获得一次重生的机会。
目标
玩家在出手次数用尽,第一次闯关失败的情况下,给与弹窗提示。用户观看完视频后,给与重生并获得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)
}
})
}