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

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_thinkcommon_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 更新生命显示

         

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值