坦克大战复刻版整体逻辑
2018-04-09 20:28:44 15 举报
battle-city
作者其他创作
大纲/内容
syncFrom()
try
AIWorkerSaga(ctx)
hitHandler
tick: tickEmitter
灰色背景的几个 saga 是游戏的后台服务,分别管理游戏事件循环、玩家一、电脑玩家、掉落道具和子弹。蓝色背景部分包括关卡流程和玩家离开游戏页面事件。当蓝色部分中的事件发生时,后台服务会自动被取消。
addAIHandler
fork
gameSaga()
移除该 AI 玩家的坦克(如果坦克还存在的话)如果该 saga 不是被取消的话,则发起 add-AI-request
takeEvery(hitPredicate)
beforeEndStage
图例
yield all([...[)
将自定义关卡数据保存到localStorage 中
tickEmitter 像是一个「死循环」,每隔一段时间(一般约为 16.7ms)会 put 一个 TICK 和 一个 AFTER_TICK。这就是游戏的事件循环了。
Blocking
每一个 TICK 过后,判断玩家坦克是否可以拾取道具,如果拾取某个道具的话,则 dispatch PICK_POWER_UP
设置玩家的保留坦克,并移除在场上的坦克
tickEmitter(options)
take('add-AI-request')
result= yield race({...})
flow: stageFlow
delay(1000 / FPS)
bullets: bulletsSaga
这里的两个控制器和 HumanController 中的是一样的
yield race([...])
saga-function-definition
humanController
finally
call
当前关卡是否还有剩余敌人
等待上一个 gameSaga 实例的 cancellation 执行完毕
takeEvery('BEFORE_END_STAGE')
yield take('START_STAGE')
human: humanPlayerSaga
yield spawnTank(tank)
while-true loop
takeEvery('SYNC_CUSTOM_STAGES')
no
take(killedPredicated)
takeEvery('AFTER_TICK')
rootSaga()
humanPlayerSaga
Non-Blocking
fireController
文件名:坦克大战复刻版整体逻辑
if (reuslt.flow) { yield put(replace('/gameover'))}
根据关卡配置生成 AI 坦克
gameSaga(action)
yes
resetFirePressedEveryTick
Remove tank if neccessaryRemove player
灰色背景为 AI 坦克的相关逻辑(随机游走、自动寻路、开火判断等)。蓝色部分为坦克被击毁事件以及游戏结束事件。当蓝色部分中的事件发生时,灰色部分会被自动取消。
该 hitHandler 被调用的时候说明 AI 的坦克被子弹击中。如果当前坦克的 HP 大于 1,则 put 一个 HURT(减少一点 HP);否则 put 一个 KILL,然后移除坦克,并生成坦克爆炸、击杀得分的效果。
初始化局部变量,用来记录用户的输入添加键盘事件监听函数firePressing 记录了当前玩家是否按下了fire键firePressed 记录了上一个tick内玩家是否按下过fire键pressed 记录了上一个tick内玩家按下过的方向键列表
ctx = new AITankCtx(playerName)
action is RESET_GAME?
每当 START_GAME / RESET_GAME 被 dispatch 时,启动一个新的 gameSaga 实例。上一个 gameSaga 实例会被自动取消
syncTo()
https://github.com/shinima/battle-city
每个关卡开始时发送两个「add-AI-request」
创建坦克的方向控制器以及开火控制器。resetFirePressedEveryTick 的作用为「每个 TICK 时重置firePressed」
put { type: 'END_GAME' }
注释
AIMasterSaga
leave: take('LEAVE_GAME_SCENE')
如果是游戏正常结束了,那么跳转到游戏结束场景
take('END_GAME')
powerUp: powerUpManager
游戏结束
directionController
浅红色背景表示该saga函数在另外一张图片中定义
该 hitHandler 被调用的时候说明玩家的坦克被子弹击中。如果子弹来自队友,则设置坦克的冷冻时间;如果子弹来自对手,则玩家坦克会发生爆炸并被移除。最后尝试添加新的玩家坦克。
handlePickPowerUps
载入localStorage中保存的自定义关卡数据
当收到「添加新的玩家坦克」请求时,判断该玩家是否还有剩余生命,如果还有的话,则生成新的玩家坦克
takeEvery('START_STAGE')
ai: AIMasterSaga
startStage
newTankHelper
AIPalyer
delay(0)
收藏
收藏
0 条评论
下一页