MC新手入门(四十六)------ 手势支持

来源:互联网 发布:智能锁屏软件 编辑:程序博客网 时间:2024/06/10 19:28
我们可能都接触过“水果忍者”这款游戏,通过手指在屏幕的滑动来模拟刀的砍切动作。

9-1-1.png

图9-1-1

    我们可能玩过手机上的塔防类的游戏,我们能用手指拖动要建造的箭塔到制定的位置;指头点击箭塔会弹出升级以及贩卖的选项;用两个指头去捏屏幕,能够放大或者缩小地图。那么以上说到的拖动,点击,捏等这些能被手机识别的手势,就属于我们这部分要讲到的手势支持的内容。

9-1-2.png

图9-1-2

    手势支持,顾名思义,就是手机能识别你的手指的动作。目前在MC能做到的手势支持的动作有:点击,拖动,滑动,捏开/合,长按,短按。

9-1-3.png

图9-1-3

那么这些功能在MC是如何实现的呢?
   手势支持的实现
在MC里实现手势支持需要通过以下的途径
    1.有四个相关的事件:鼠标按下,鼠标松开,长按,多点触控。这几个事件还是比较好理解的,需要说明的就是多点触控,触发的条件是,多个手指同时按在屏幕上。
    2.有四个相关的变量:knob_x,knob_y,knob_r,knob_ang。这四个变量只有在多点触控的情况下才会发生变化,先来解释一下MC实现多点触控的原理:
当多个手指头触碰到屏幕上的时候,我们去计算这所有点的坐标的平均值,从而得到取平均后的坐标(knob_x,knob_y)。对于这些点,我们构建一个圆,这个圆的半径为这些点到圆心的平均值。在我们手指捏合的过程中,这个圆的半径在缩小,那么,当前这一帧的圆半径与上一帧的差,就是knob_r,knob_ang是用来判断手指的旋转趋势的。当手指相对屏幕做顺时针运动的时候,knob_ang就为正值,当做逆时针运动的时候,knob_ang为负值。
    3.有两个函数可以调用:
以下两个函数都是在单个手指滑动的情况下使用的
                            getOnScrollDXY(float *dx, float *dy)
这个函数的返回值dx,dy的含义是,当前帧的拖动点和上一帧拖动点的在x、y的差值。
                            getOnFlingVXY(float *vx, float *vy)
这个函数的返回值vx,vy的意思是,当拖动后手指头离开屏幕那一瞬间的速度
学完上面的知识,下面我们就来动一动手。
手势支持的实例
第一步,我们按照下图对所有角色进行摆放

9-1-2-1.png

图9-1-2-1

第二步,先搭建边框actBun,对actBun角色添加“碰撞事件”,对应行为“脚本编辑器”添加如下代码:
                           PhysicalResponse(MOVE_COLLIDE_ACTOR_ONLY, USE_CALCULATED_MASS, 1.000000 , 1.000000, 0.000000, 1.000000);
对bird角色添加三个动画,就是bird的三个不同大小的照片,按照大中小命名为:animBirdBig,animBirdMiddle,animBirdSmall。
txtKnob角色添加“绘制角色”事件,行为“脚本编辑器”其代码如下:
        //输出四个变量
                            sprintf(text,”x=%.6f\n y=%.6f\n r=%.6f\n ang=%.6f\n”, knob_x, knob_y, knob_r, knob_ang);
        txtScroll角色用来显示getOnScrollDXY函数的返回值,添加“绘制角色”事件,行为“脚本编辑器”其代码如下:
                                 float i,j;
                            getOnScrollDXY(&i,&j);
                            sprintf(txtScroll.text,"getOnScrollDXY:%f,%f",i,j);
        txtFling角色用来显示getOnFlingVXY函数,添加“绘制角色”事件,行为“脚本编辑器”其代码如下:
                                   float i,j;
                            getOnFlingVXY(&i,&j);
                            sprintf(txtFling.text,"getOnFlingVXY:%f,%f",i,j);
        funcPressType角色用来获取按键类型,先建立一个全局变量pressType以侦测按键类型,如图9-1-2-1        然后添加“绘制角色”事件,行为“脚本编辑器”其代码如下:
                            getPressType(&IPressType);
                            if(IPressType == 0)
        //表示这是刚按下鼠标的状态,进而衍生出短按长按和拖动状态
                                {
                                      sprintf(txtState.text, "on down");
                            }
                            else if(IPressType == 1)
//表示这是长按的状态
                            {
                                     sprintf(txtState.text, "long down");
                            }
                            else if(IPressType == 2)
        //表示这是短按
                            {
                                      sprintf(txtState.text, "short down");
                            }

        以上的步骤都是用来做数值的显示的示范,接下来才是具体使用actBird角色,总共有五个事件,全都是“脚本编辑器”行为。

9-1-2-2.png

图9-1-2-2

    在这之前,先定义一些自定义的变量,打开菜单栏“脚本”->“角色脚本”->“自定义变量”,创建四个变量如下图所示

9-1-2-3.png

图9-1-2-3

事件一:“创建角色”事件
                            IBirdSize = 2;
                            DSumR = 0.0;
                            IDragState = 0;
事件二:“绘制角色”事件
//对小鸟的大小进行判定,在捏合和捏开中能看到
                            if( IBirdSize == 1 )
                            {
                                      ChangeAnimation("actBird", "animBirdSmall", FORWARD);
                            }
                            else if( IBirdSize == 2 )
                            {
                                      ChangeAnimation("actBird", "animBirdMiddle", FORWARD);
                            }
                            else if( IBirdSize == 3 )
                            {
                                      ChangeAnimation("actBird", "animBirdBig", FORWARD);
                            }


                            sprintf(txtSum.text, "%.6f", DSumR);

//拖动状态的判定
                            if(IDragState == 1)
                            {
                                      actBird.xscreen = xmouse;
                                      actBird.yscreen = ymouse;
                            }
                            else
                            {    
                                      if(xvelocity >= 30.0)
                                      {
                                                 xvelocity -= 5.0;
                                      }
                                      else if(xvelocity <= -30.0)
                                      {
                                                 xvelocity += 5.0;
                                      }
                                      else
                                      {
                                                 xvelocity = 0.0;
                                      }
                                      if( yvelocity >= 30.0)
                                      {
                                                 yvelocity -= 5.0;
                                      }
                                      else if(yvelocity <= -30.0)
                                      {
                                                 yvelocity += 5.0;
                                      }
                                      else
                                      {
                                                 yvelocity = 0.0;
                                      }
                            }
事件三:“多点触控事件”
                           DSumR += knob_r;
                            if(DSumR > 0.1)
                            {
                                      IBirdSize = 3;
                            }
                            else if(DSumR <- 0.1)
                            {
                                      IBirdSize = 1;
                            }
                            else
                            {
                                      IBirdSize = 2;
                            }
事件四:“鼠标键按下”事件
//进入拖动状态,同时速度归零
                            if(IPressType == 0)
                            {
                                      IDragState = 1;
                            }


                            xvelocity = 0;
                            yvelocity = 0;
事件五:“鼠标键弹起”事件
//状态复位以及侦测甩动后的瞬时速度
//状态复位以及侦测甩动后的瞬时速度
                           float i,j;
                            getOnFlingVXY ( &i, &j );


                            IDragState = 0;


                            xvelocity = (double)j;
                            yvelocity = (double)i;
//考虑到i,j太小,所以强行把初速度改成200
                                if(xvelocity > 0) xvelocity = 200;
                           else if(xvelocity < 0) xvelocity = -200;


                           if(yvelocity > 0) yvelocity = 200;
                           else if(yvelocity < 0) yvelocity = -200;

都做好了,导出到手机看看效果吧。在手机上,你能拖动小鸟,甩动小鸟,捏放或者捏合来改变小鸟的大小,还能通过数值的变化看到具体的参数以及按键类型。

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


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怀孕7个月血糖高怎么办 孕妇7个月血糖高怎么办 空腹血糖6%2e7怎么办 血糖和尿酸都高怎么办 血糖高的孕妇便秘怎么办 血糖低怎么办吃什么好 孕检空腹血糖高怎么办 怀孕4个月血糖高怎么办 怀孕3个月血糖高怎么办 怀孕6个月血糖高怎么办 孕29周血糖高怎么办 餐后血糖偶尔高怎么办 歺后血糖9.8高怎么办 怀孕5个月血糖高怎么办 歺后2小时血糖高怎么办 怀孕餐后血糖高怎么办 老人餐后血糖高怎么办 血糖高尿糖不高怎么办 小孩鼻子不通气怎么办特效方法 婴儿20天不大便怎么办 新生儿8天没大便怎么办 新生儿2天没大便怎么办 新生儿4天没大便怎么办 2岁宝宝便秘严重怎么办 婴儿7天没有大便怎么办 新生儿6天没大便怎么办 大便带鲜血 不疼怎么办 宝宝发烧到39度怎么办 肛裂大便出鲜血怎么办 拉大便有血怎么办啊 长痔疮拉大便血怎么办 病人卧床太久不解大便怎么办 宝宝拉泡沫便便怎么办 孩子拉肚子怎么办呢有好办法吗 2岁宝宝大便带血怎么办 十个月宝宝肛裂怎么办 大便时拉出血怎么办啊 2岁宝宝大便干燥怎么办 5岁儿童大便干燥怎么办 九个月宝宝平血怎么办 6个月宝宝肛裂怎么办