MC新手入门(三十七)------ 常用函数

  MC的特点就是以事件(event)、行为(action)为驱动,通过调用MC工具的引擎来进行游戏开发的,下面将通过一些例程来对常用的MC的事件(event)、行为(action)和引擎进行说明。
     在前面的章节中有介绍如何创建角色和在角色上添加动画,下面我们要设计一个简单的游戏,实现当鼠标按下时,人物响应相应的动作,当人物击打到目标的时候,把目标击碎,并让目标消失,同时产生一个新的目标,相应的屏幕也产生一次抖动的效果。
     如图6-1-1,创建了7个角色,其中actBackground、actTarget、actRole是普通的Normal类型的角色,将三个角色的启动时创建均勾选;actUp、actDown、actLeft、actRight这4个蓝色的框框是Filled Region类型的角色,它们不能导入动画,但能响应鼠标按下事件。
     在background角色上添加动画“bg1”;在target角色上添加动画“oil”和“oilbreak”;在role角色上添加动画“boyStill”、“boyUp1”、“boyDown1”、“boyLeft1”、“boyRight1”;

6-1-1.png


图6-1-1

     首先,在actRole角色上添加与其相关的操作的事件:Create Actor、Animation Finish、Draw Actor,三个事件均执行一段脚本代码(Script Editor),分别如下:
     Create Actor事件是指当actRole角色被创建时,执行一次这个事件。在本例程中,这个脚本非常简单,只有三条语句:即人物被创建时,指定好他的位置以及没有响应事件时的待机动画。
       x = 0;
       y = 0;
       ChangeAnimation("Event Actor", "animBoyStill", FORWARD);
    其中x、y是人物的两个属性,表示这个角色的绝对坐标值,该语句表示人物在屏幕上的中心位置;ChangeAnimation函数的功能是改变动画,放在这个事件中使用可以达到设定角色创建时的默认待机动画的效果。
     Animation Finish事件是指动画完成事件,可以指定某一个动画完成后的事件,也可以指定所有动画完成后的事件。本例程中是指所有动画完成后执行一个脚本代码,也是只有三条语句,跟上面的一样,但在这表达的意思却不一样。
        x = 0;
        y = 0;
        ChangeAnimation("actRole", "animBoyStill", FORWARD);
    前面两句是因为人物有做动画的切换时,由于动画图片大小的不同,会改变人物的位置,因而当人物每个动画完成后,要将其位置调整回原位(即Create Actor事件中的x、y分别为多少,则这里的值就为多少);第三句的意思是无论人物执行完什么动作,在没有再次做出响应时,它将会变成待机状态。
    Draw Actor事件,这是一个类似于定时器的事件,它每隔一个很短的时间间隔就会执行一次。在本例程中执行一个脚本代码:
        char animName[32] = "";
        strcpy(animName, getAnimName(animindex));
        //logoutf("%s", animName);
        if(0 == strcmp(animName, "animBoyStill"))
       {
           EventEnable("actUp",EVENTMOUSEBUTTONDOWN);
           EventEnable("actDown",EVENTMOUSEBUTTONDOWN);
           EventEnable("actLeft",EVENTMOUSEBUTTONDOWN);
           EventEnable("actRight",EVENTMOUSEBUTTONDOWN);
           EventDisable("actTarget",EVENTCOLLISION);
        }
        else
        {
           EventDisable("actUp", EVENTMOUSEBUTTONDOWN);
           EventDisable("actDown", EVENTMOUSEBUTTONDOWN);
           EventDisable("actLeft", EVENTMOUSEBUTTONDOWN);
           EventDisable("actRight", EVENTMOUSEBUTTONDOWN);
        }


        if(0 == strcmp(animName, "animBoyLeft1") && 9 == animpos)
        {
           EventEnable("actTarget", EVENTCOLLISION);
         }
    代码中涉及到了几个MC的函数getAnimName、logoutf、EventEnable、EventDisable,这些都是MC中常用的函数,具体使用功能查看相关的函数使用手册。
    这个脚本控制的功能:首先,用getAnimName获取角色当前动画的名称;然后,用strcmp(C函数)检测人物当前的动作是不是待机动作(动画“boyStill”),如果不是,则表示它正在响应鼠标按下的事件,那么这个时候,鼠标再次按下事件是无效的(EventDisable),当人物的动作是向左击打动画的第10帧时,表示拳头打到了目标(target),这时候就会促发使能目标碰撞事件(EventEnable)。
    以上引出了五个事件,其中四个为up、down、left、ritht的“鼠标键按下”事件,即四个传感器的鼠标左键按下事件,都是执行一个角色脚本,其中left的代码如下:
        actRole.x = -23;
        actRole.y = 5;
        ChangeAnimation("actRole", "animBoyLeft1", FORWARD);
    actRole.x、actRole.y是调整人物的位置的,以达到人物响应事件动作时,位置出现偏差;第三条语句即改变人物的动作,这时就是执行向左出拳的动作。其它三个方向的代码这里就不给出,请学员自己尝试代码的编写以及人物位置的调整。
    在人物的左边,有一个油捅,初始时,它在屏幕的可视范围之外,通过一定的速度移动到屏幕范围内。当它与人物角色相隔一段距离的时,它就会停下来,若人物击中它,那么,它会碎裂并被销毁,且当它被击中时,屏幕会产生一个震动的效果,当它被销毁时,会再创建一个新的actTarget循环以上行为,以使得游戏可持续的完下去。要实现这些功能,它的事件如下:

6-1-2.png

图6-1-2

    其中Animation Finish事件执行Destroy Actor行为,删除的是Event Actor,即角色本身;Destroy Actor事件执行Create Actor行为是创建一个新的角色,选项可以不管,因为会在Create Actor事件执行的Script Editor脚本中涉及,其脚本如下:
       x = -300;
       y = 35;
       xvelocity = 30;
       ChangeAnimation("Event Actor", "animOil", FORWARD);
    此脚本设置了actTarget角色创建时的初始位置,移动到可视范围内的速度,和初始使用的动画,再加上如下的Draw Actor事件的执行脚本,就可以实现从屏幕外进入屏幕内,然后停在人物左边的一定位置的游戏效果。
       char animName[32] = "";
       strcpy(animName, getAnimName(animindex));
       if(x >= -140)
       {
               xvelocity = 0;
        }
        if(0 == strcmp(animName, "animOilBreak"))
        {
               EventDisable("actTarget", EVENTCOLLISION);
         }
其中第二个if语句是做为开关,控制target角色与人物碰撞检测时机的。
Collision事件碰撞的角色是actRole角色的任意边界,执行脚本如下:
        shake = 4;
        ChangeAnimation("Event Actor", "animOilBreak", FORWARD);
其中shake涉及到屏幕的震动,光有这个变量是不行的,要达到这个效果,需要在actBackground角色上添加一个Draw Actor事件,部分代码如下,其中,y值的设定即与振幅相关,学员可以自己修改其值观查效果差异,当shake减为零时,屏幕停止震动,这时屏幕的位置应该回到初始时的位置。
        if( shake == 4 && y == 0 )
        {
            y = -16; 
         }
         else if(shake == 4 && y == -16)
         {
            shake = 3;
            y = 0;
          }
          else if(shake == 3 && y == 0)
         {
             y = -10;
          }
          else if(shake == 3 && y == -10)
           {
             shake = 2;
             y = 0;
          }        
          else if(shake == 2 && y == 0)
         {
             y = -6;
          }
          else if(shake == 2 && y == -6)
          {
             shake = 1;
             y = 0;
          }
          else if(shake == 1 && y == 0)
         {
             y = -3;
          }
         else if(shake == 1 && y == -3)
         {
            shake = 0;
            y = 0;
         }
思考:
1、如何使得震动是左右震动而不是上下震动。

2、如何确定屏幕震动停止时,是停在了初始时的位置(初始时的位置如何设置)。

Demo下载地址:http://www.dongyo.cn/bbs/forum.php?mod=viewthread&tid=2505&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline%26orderby%3Ddateline


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值