Flash摄像头游戏课件的设计之动画制作论文(2)

时间:2021-08-31

  import Flash.display.BitmapData;

  //创建BitmapData对象Var snapshot:BitmapData=newBitmapData(output_vid._width,output_vid._height);

  //从my_video获取当前图像now.draw(my_video);

4.运动检测的实现

  该部分是整个摄像头游戏实现的核心。主要利用了Flash 8的位图处理功能,即BitmapData类。

1)基本思路

  我们可以使用getPixel(x,y)获取前一张图片上每个像素点的像素值,然后对比后一张图片中的每一点的像素值,当像素的亮度差值变化达到一定程度时,认为该点发生了运动变化。通过这种方式,得到前后两张图片的负片效果图。

  //阀值tolerance=10;

  //获取当前图像now某一点的RGB值nc=now.getPixel(x,y);

  //红色通道nr=nc16&0xff;

  //绿色通道ng=nc8&0xff;

  //蓝色通道nb=nc&0xff;

  //计算该点亮度值nl=Math.sqrt(nr*nr + ng*ng + nb*nb)

  //获取前一快照before同一点的RGB值bc=before.getPixel(x,y);

  //红色通道br=bc16&0xff;

  //绿色通道bg=bc8&0xff;

  //蓝色通道bb=bc&0xff;

  //计算该点亮度值bl=Math.sqrt(br*br + bg*bg + bb*bb);

  //计算亮度值的变化d=Math.round(Math.abs(bl-nl));

  if(dtolerance){//该点发生了变化 }

  但是这种方法存在计算效率问题。按图像大小为180*160像素,每秒30帧计算,每计算一副图片需要的计算次数为180*160*30。图像的像素越大,需要的计算次数就越多。采用隔点检测的方法可以在一定程度上缓解计算压力,即每隔n个像素检测一次,这样电脑的计算次数减少为原来的1/n。

2)改进思路

  Flash8提供的图像混合模式可以解决上面遇到的效率问题。Flash8提供了11种图像混合模式。每一种混合模式可以得到不同的混合效果。Different 混合模式是基于两张图片之间的亮度差值进行计算,从而得到图片的负片效果。利用该模式,便可以得到移动像素的检测图像。

  //将前一张快照before的图像绘制到当前快照now上,使用different混合模式now.draw(before, new Matrix(), null, "difference");

  图像中黑色表示没有发生移动,其他颜色表示发生了移动。由于Flash8提供的混合模式是采用C++编码实现的,因此运行效率要比Action Script编码更加高效。

5.动态显示检测图像

1)处理检测图像

  通过以上两种方式得到的图像中色彩范围较广,这增加了统计上面的困难。通过使用 threshold() 方法,可以隔离和替换图像中的颜色范围,并对图像像素执行其它逻辑操作。threshold()函数根据指定的阈值测试图像中的像素值,并将通过测试的像素设置为新的颜色值。这样,便得到了清晰醒目的检测图像。

  //将大于阀值0xFF111111的像素替换为绿色。

  myBitmap.threshold(myBitmap, myBitmap.rectangle, myBitmap.rectangle.topLeft, "", 0xFF111111, 0xFF00FF00, 0x00FFFFFF, false);

2)检测图像的显示

  Bitmap对象无法直接在舞台上显示,必须附着在MovieClip上面才能显示。因此可以使用MovieClip类的attachBitmap()方法,将获取的图像信息显示出来。

  //创建一个影片剪辑来显示当前图像this.createEmptyMovieClip(当前,this.getNextHighest Depth());

  //将摄像头获取的图像显示在影片剪辑内bitmap_mc.attachBitmap(now,1);

3)检测图像的动态显示

  要实现检测图像的动态显示,必须不断的更新当前图像now和历史图像before,并进行混合处理。可以把检测图像的功能写成方法snapshot(),每隔100毫秒调用一次。

  伪代码如下:

  function snapshot() {//获取当前图像//获取检测图像//将检测图像绘制到//将检测图像中RGB超过阀值0xFF111111的部分替换成绿色//显示检测图像//本次检测完成之后,当前图像便成为了历史图像。为下一次检测做好准备。preBitmap = nowBitmap.clone();}

  在该方法中,关键在于每次检测完成之后当前图像和历史图像的更新。

6.检测特定区域内的运动状态

  经过上面几步操作,已经得到了检测图像。检测图像是对整幅图像的运动情况的反映。在游戏中,经常需要检测的是某一特定区域的`运动状态。

1)检测某点的运动状态

  因为已经到了检测图像,所以在检测某一点运动状态时,只需要判断检测图像上该点的RGB值是否大于阀值。

  伪代码如下:

  pix = myBitmap.getPixel(x, y);if (pix大于阀值) {//该点发生了运动}

2)检测某区域的运动状态

  由于灯光因素、摄像头图像噪点等干扰因素的存在,每次只检测一个点容易造成检测结果的不稳定。因此,大多采用区域检测的方式。即在检测某点运动状态时,检测的不仅仅是这个点,而是以该点开始的n*n个像素的区域(n的取值根据实际情况确定,在检测点数量较多时,n的值不宜取太大。)。如果检测区域内的像素点变化数量超过一定阀值,如60%,则认为该区域发生了运动。

  需要注意的一点是,由于看到的图像是经过水平翻转的,但原有的图像内部坐标系并没有发生变化,因此,检测时的取点位置也要水平翻转。

  //以(rectx,recty)为顶点的rectw*recth的矩形区域的运动情况

  function ismove(a, rectx, recty, rectw, recth) {var i, j;

  var sum = 0;

     var pix;

  for (i=1; i=rectw; i++) {for (j=1; j=recth; j++) {//图像水平翻转后取点位置相对变化pix = a.getPixel(160-i-rectx, j+recty);

  if (pix132361) {sum++;

  //trace("sum="+sum);

  if (sum(recth*rectw/2)) {return (sum);

  //该区域发生了运动} else {return 0;}}

  在该方法中,检测图像、检测区域顶点坐标、检测区域大小都为作为变量输入。采用这种方法,提高了程序的重用性,还可以实现对运动物体的检测。

3)检测点的设置

  所谓检测点,实际是一个影片剪辑。在进行区域检测时,以该影片剪辑的坐标(x,y)确定检测区域的坐标位置。检测点可以是一个不可见的辅助点,也可以是舞台中运动的物体。当把运动物体做为检测点时,随着物体的移动,检测区域也随之移动,因此可以实现对运动物体的检测。检测点的作用:一是可以起到辅助点的作用,简化了检测区域定位的繁琐工作,使定位操作可视化。二是实现了代码的重用,起到了简化程序的作用。7.实现摄像头运动检测的控制接口

  游戏中检测点接口的作用就是返回舞台中被触碰的检测点编号。在接口函数中,调用了以上几个功能函数。返回值为检测点编号。

  function istouch() {var max:Number = 0;

  var min:Number;

  var num:Number;

  for (var i = 1; i=9; i++) {//检测第i个检测点是否被触碰min = ismove(myBitmap, this["point"+i]._x-xpoint, this["point"+i]._y-ypoint, 10, 10);

  //每次只能激发一个点,选择9个点中移动最显著的一个if (max max = min;num = i;}}

    if (num) {//返回被触碰的点的序号return (num);} else {//一个检测点也没碰到!;return 0;}}

8.游戏交互功能的实现

  游戏功能交互的实现tulaoshi.com方法和其他Flash游戏大体类似。在此游戏中,主要包括3大功能模块:子弹系统,气球系统 和主控制系统。

1)子弹系统的实现

  该部分主要是实现子弹的运动。游戏中有9个检测点,每个检测点都可以发射子弹。各位置发射的子弹运动方向是不同的。第i个检测点的子弹方向为rot=i*20,初始位置在界面底部中央。

  this._x = this._x-30*Math.cos(rot*Math.PI/180);

  this._y = this._y-30*Math.sin(rot*Math.PI/180);

  当子弹出界时,要使用this.unloadMovie()方法将该子弹实例销毁,释放内存。

2)气球系统的实现

  该部分主要是实现气球的碰撞检测,判断气球是否被子弹击中需使用hitTest()函数。该函数有两种用法:

用法 1:

        根据 shapeFlag 设置,将 x 和 y 坐标与指定实例的形状或边框进行比较。如果 shapeFlag 设置为 true,则只计算在舞台上的实例实际占据的区域,并且如果 x 和 y 在任意一点重叠,则返回 true 值。

用法 2:

         计算 target 和指定实例的边框,如果它们在任意一点上重叠或交叉,则返回 true。

3)主控制系统的实现

  主控制系统是实现互动功能的核心部分。主要工作就是把游戏中所有的功能模块集成起来,对各功能模块进行调度和显示。一方面,主控制系统要接收从摄像头功能接口传递的信息;一方面根据接收的信息执行相应的功能代码。四、结束语

  Flash摄像头游戏课件能够实现很多传统Flash课件难以实现的效果,特别是对操作技能的培养。我们开发的《水果乐园》课件提供给一些小学,进行了英语学习实践,效果还不错。但是,对于Flash摄像头游戏课件应用于学生高级思维策略的训练,还没有进行深入的研究,特别是角色扮演型、问题探究型等学习模式等实施,有待进一步的的探索和实践。

【Flash摄像头游戏课件的设计之动画制作论文】相关文章:

1.flash教学课件

2.论文:中职Flash动画制作教学中微课的运用

3.flash动画教学课件

4.flash化学课件

5.小学动画《FLASH入门》课件

6.flash教学课件实例

7.如何制作flash游戏论文

8.《惊弓之鸟》课件设计