您的位置:首页 > 运维架构

横版格斗——openbor分析1_程序流程

2014-02-13 23:26 274 查看

1.程序运行大致流程

程序入口:openborMain

在main中循环调用:update(0, 0)更新帧

在update中:更新屏幕滚动update_scroller,计算游戏是否超时time_over(超时则杀死自己),更新实体update_ents



在update_ents中:遍历ent_list存的所有的实体

若在关卡中,check_lost测试消失(关卡滚动或超出寿命 引起的)



check_ai测试AI

check_gravity测试重力

update_animation更新动画

check_attack测试攻击(碰撞检测)

update_health更新生命显示

全部实体更新完后,arrange_ents重新排布实体,去掉不存在的实体。



2.实体更新详解

check_lost测试消失(关卡滚动或超出寿命 引起的)

若超出屏幕删除距离offscreenkill,则player_die或kill(self)死亡
若掉到陷阱pit中或寿命到了,则掉满血takedamage(若takedamage为空则kill)




check_ai测试AI:和平台platform移动、采取行动takeaction、思考think、尝试移动trymove

测试移动平台:若有着陆的平台landed_on_platform、平台有移动速度xdir || zdir、平台需要更新(到更新时间或有更新标记)、该实体还在平台上testplatform(plat, self->x, self->z) && self->a<= plat->a + plat->animation->platform[plat->animpos][7] + 0.5

若满足则和平台一起移动:有抓取物grabbing、正在抓走grabwalking 则check_link_move(plat->xdir, plat->zdir)否则self->trymove(plat->xdir,plat->zdir)

达到下次思考时间(nextthink= borTime + THINK_SPEED/*=2*/):

则有行动就可采取行动self->takeaction()

若self->noaicontrol为false则进行思考think(player_think和common_think)

尝试移动:抓跑则check_link_move(self->xdir,self->zdir) 否则trymove(self->xdir,self->zdir)

若出生或重生动画完了则跳转到空闲状态



check_gravity 测试重力:若在空中则更新海拔、投掷速度;若着地了则产生尘土、弹起震动、着地受伤

若(下落中falling 或 投掷中 tossv 或 海拔不等于基础海拔a != base)且超过投掷时间(toss_time<= borTime,一般是下一帧)

若提供平台modeldata.subject_to_platform且有向上的投掷速度tossv> 0则寻找一个该海拔上的最低平台other = check_platform_above(x, z, a + tossv)

若上面有平台且self->a+ heightvar >= other->a该实体高度超过平台海拔,则撞头,设置撞头物体hithead=other、投掷速度为0

更新海拔a += tossv,根据重力更新投掷速度tossv+= level->gravity * (1.0 – modeldata.antigravity - antigravity),限制其范围(level->maxfallspeed~level->maxtossspeed)

若该动画有dropframe开始下落帧 且投掷速度向下tossv<=0且当前帧小于下落帧animpos< dropframe,则更新帧update_frame(self, self->animation->dropframe)

若空闲idling且ANI_WALKOFF走开动画有效,则走开idling=0,takeaction=common_walkoff,设置走开动画



若着地了((a <=base || !inair(self)) && tossv <= 0):

若有尘土modeldata.dust[0]>= 0且投掷速度tosssv<-1且在下落中drop

则产生尘土实体dustentity:dust = spawn(x, z, a, direction, NULL, modeldata.dust[0], NULL)

dust->base = a; dust->autokill = 1;



若要弹起tobounce(self)(动画里需要弹起,投掷速度绝对值>2,且不是自动着陆 damage_on_landing==-1 或damage_on_landing==-2),且人物模型可以弹起modeldata.bounce

按动作的弹力计算速度:xdir、zdir /=animation->bounce

投掷toss(self,(-tossv) / animation->bounce)

设置震动if(!modeldata.noquake) level->quake = 4(应该是屏幕震动)

否则若seta<0且movea <=0则xdir = zdir= tossv = 0

否则 tossv = 0



若动画有着地帧animation->landframe[0]且当前帧小于着地帧

则更新到着地帧,若动画有着地尘土动画则产生尘土(根据animation->landframe[1])

若着地后有受伤且目前还活着damage_on_landing> 0 && !self->dead

若有takedamage则

attack.attack_force= damage_on_landing;

attack.attack_type= ATK_NORMAL;

takedamage(self, &attack);

否则直接减去damage_on_landing

置空撞头hithead =NULL

toss_time= borTime + (GAME_SPEED / 100);



update_animation 更新动画

关卡滚动

无敌时间完毕判断invincible&& borTime >= invincetime,重置invincible,blink,invincetime,arrowon

若有死亡闪烁dying,且血量少于一定限度,则进行颜色映射..

更新冻结时间freezetime、映射时间maptime、封锁时间sealtime(结束则特殊移动可再进行)

更新动画(当前帧,帧的循环和自动删除autokill,更新帧信息update_frame)

更新着陆的平台landed_on_platform

*调整海拔的基值base,要判断墙wall、洞hole

*更新着陆 移动的平台(根据动画里的move、movez进行移动)



check_attack 测试攻击(碰撞检测)

普通的下落(falling&& !projectile)则attack_id = 0返回

着地(drop&& !falling)则attack_id = 0返回

若未冻结!is_frozen且该帧动画有攻击项animation->attacks[animpos]则

do_attack(self)



update_health 更新生命显示
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: