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

我们可能都接触过“水果忍者”这款游戏,通过手指在屏幕的滑动来模拟刀的砍切动作。

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。
### 内容概要 这份《计算机试卷1》包含多个部分,主要覆盖了计算机基础知识、操作系统应用、文字处理、电子表格、演示文稿制作、互联网应用以及计算机多媒体技术。试卷以单选题开始,涉及计算机历史、基本概念、硬件组成、软件系统、网络协议等。接着是操作应用部分,要求考生在给定的软件环境中完成一系列具体的计算机操作任务。 ### 适用人群 本试卷适用于计算机科学与技术、信息技术相关专业的学生,以及准备计算机水平考试或职业资格认证的人士。它适合那些希望检验和提升自己计算机操作能力的学习者,也适用于教育工作者作为教学评估工具。 ### 使用场景及目标 1. **学习评估**:作为教育机构的课程评估工具,帮助教师了解学生对计算机基础知识的掌握程度。 2. **自学检验**:供个人自学者检验自己的计算机操作技能和理论知识,为进一步学习提供方向。 3. **职业发展**:为职场人士提供计算机技能的自我提升途径,增强其在信息时代的竞争力。 4. **考试准备**:为准备计算机相关考试的考生提供实战演练的机会,加强考试自信。 5. **教学资源**:教师可以将其作为教学资源,设计课程和实验,提高教学效果。 试卷的目标是通过理论知识的测试和实践技能的操作,全面提升考生的计算机应用能力。考生应掌握从基础的计算机组成原理到复杂的数据处理、演示文稿制作、网络应用以及多媒体技术处理等多方面技能。通过本试卷的学习与练习,考生将能够更加熟练地使用计算机解决实际问题,为未来的学术或职业生涯打下坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值