坦克大战复刻版部分saga结构图
2018-04-11 13:54:57 11 举报
坦克大战复刻版部分saga结构图
作者其他创作
大纲/内容
stage = tryToGetNextStage()
播放幕布动画,并载入关卡地图
result = yield stageSaga(stage)
grenade
takeEvery(is('tank'))
{ delta } = yield take('TICK')
clearBullets
停止坦克的移动
handleAfterTick()
图例
call
处理 action:如果是 DESTROY_EAGLE,则说明游戏结束如果是 human 击杀 AI,则更新玩家的击杀统计并判断是否通关如果是 AI 击杀 human,则判断游戏是否已经结束
handleHelmetDuration
fireController
如果生成了新的红色坦克,则清空当前场上所有的 powerUp
takeLatest(is('timer'))
yes
shouldFire()
根据 delta 和bullets计算并更新子弹位置
directionController
saga-function-definition
input.type isforward
stageSaga(stage)
用来处理坦克的 helmet 的倒计时
no
stageFlow(startStageIndex)
{ bullets } = yield select()
put replace(`/stage/${stage.name}`)
result.pass?
star
takeEvery('END_STAGE')
helmet
更新坦克开火冷却时间
break
每次调用 getPlayerInput 函数都能获取最新的玩家输入。这里的玩家可能是 human 也可能是 AI。
spawnHitActions
try
子弹管理的代码很长,这里的图只给出了一个大概的代码情况。具体的处理还是得看源代码。
注释
生成 HIT action,用来通知其他 saga 「某发子弹击中了某架坦克」
https://github.com/shinima/battle-city
takeEvery(is('grenade'))
每当玩家拾取一个 powerUp 时,执行相应的处理函数。is 函数用来判断玩家是否拾取了指定类型的 powerUp。shovel 和 timer 有持续时间,所以使用了 takeLastest,这样拾取一个新的 powerUp 时会自动把旧的效果清除掉。raceEndStage 的作用是使得 powerUp 仅在本当前关卡内有效。
state = yield select()stat = new Stat
坦克为空or 坦克处于冰冻状态
handleAfterTick
Blocking
clearAllPowerUps
takeEvery('HIT')
spawnPowerUpIfNeccessary
raceEndStage(shovel)
raceEndStage(timer)
获取当前状态;新建一个统计对象(stat),用来记录这一个 tick 中的子弹与其他元素碰撞的统计信息
在关卡结束的时候清空子弹
animateCurtainAndLoadMap(stage)
finally
scoreFromPickPowerUp
发送关卡开始的信号
更新网页 URL
无效 input,抛出异常
destroyBricks
handleTick
玩家拾取 powerUp 时,生成得分的效果
takeEvery(is('star'))
takeEvery(is('helmet'))
input.type isturn
设置坦克的方向,并对坦克的坐标进行对齐
不产生爆炸效果,子弹直接消失
put BEFORE_START_STAGEput START_STAGE
input is null
handleTick()
takeEvery('PICK_POWER_UP')
destroySteels
while-true loop
takeEvery('START_SPAWN_TANK')
powerUpManager
yield all([...])
Non-Blocking
每次调用 shouldFire 函数都能获取最新的玩家输入。这里的玩家可能是 human 也可能是 AI。
return 关卡结果
文件名:坦克大战复刻版部分 saga 结构图
更新坦克冰冻状态时间
子弹爆炸的时候会破坏附近的游戏元素
stage is valid
tank
计算子弹生成位置put ADD_BULLET
fork
bulletsSaga
destroyEagleIfNeeded
产生爆炸效果,并移除子弹
takeLatest(is('shovel'))
{ delta } = yield take('AFTER_TICK')
如果红色坦克被击中,则随机生成一个 powerUp
坦克为空or 坦克处于冰冻状态or 开火冷却中or 子弹数量已达上限
判断坦克是否可以前进,如果可以的话,则更新坦克位置
计算子弹与其他游戏元素是否发生碰撞,碰撞的信息都会记录在 stat 对象中。
关卡通关 or 游戏结束?
收藏
收藏
0 条评论
下一页