欢迎大家光临【无师自通-教程网】您的到来是我们的荣幸。本站提供photoshop教程,ps教程,flash教程,cad教程,网页制作教程,excel教程,asp教程,vb教程,3d教程,c语言教程,html教程,coreldraw教程,dreamweaver教程,java教程,3dmax教程 等各种教程为主题的内容和服务,相信您会在这里找到您所需要的东东。无师自通伴您一生-谢谢您的光临!!
网站地图 设为首页
简繁切换 加入收藏
栏目待定 留言本站
您现在的位置: 无师自通-教程网 >> 多媒体动画 >> Flash教程 >> Flash游戏实例教程 >> 教程正文

  没有公告

教程: Flash教程-Flash游戏实例教程-一个撞砖块的小游戏及源码 更多...
教程: Flash教程-Flash游戏实例教程-一个撞砖块的小游戏及源码


开学了,本以为可以继续开心的进行游戏及物理在FLASH中的相关设计的。 唉~~~可是开了学才知道一切都很现实,该学的东东还是得学(虽然很多我认为有些东西对我没用,比方说:对我来说很难的硬件),练FLASH变成了很少,一个月只做了一个小游戏,先请大家看看效果:
点击浏览该文件
先讲一下我的开发环境,我的签名档里你应该看得到(我觉得昨在外读书不应该多花父母的钱,要买好的电脑,应该自己挣),其实,这样配置的电脑,最大的一个好处,在于可以使你努力的去优化你的代码。
我用了一个很简单的方法来近似的测一个函数的执行时间:
var starts=getTimer();
var result=Fun(a,b...);
var ends=getTimer();
var k=ends-starts;
trace(k);
trace(result);
结果HITTEST的执行时间为3MS,而我一开始写的碰撞检测,平均要耗30MS,这在我的机子上是玩不了的,后来,经过优化后,变成了平均4MS,与HITTEST已相差无几,我觉得很满意。最后,至少在我的机子上,这个游戏还是能玩的。 我只挑本小游戏中几个最关键的部分讲一下:
1小球与砖块的碰:
这是一个球与矩形的碰撞问题,我讲一下我的思路。
其实,参考两个球的碰撞检测的话,可以想向,如果让小球贴着矩形的边缘走一圈,围出的那个类似于跑道的图形即为球体与矩形碰撞检测区域(小球的检测点为其圆心)。
如图
按此在新窗口浏览图片

解决这个问题:有两个方法比较好(可惜偶数学水平不够,还不会)
a)用曲线拟合的方法求出这个类似跑道的形状的函数表达式(图形学,计算方法及数值分析课程学过后就好了)比方说,是y=a(7-x)^6 b(3-x)^3-(5 x)^2,此时,只要用相关的点在图形内的判定便可以解决这样的碰撞检测了。 b)用离散数学的方法,用离散的方法求解图形的问题时,你要做的只是加减法,及逻辑判断,
对代码的执行效率的提高是很重要的。 由于我水平菜,只能用最土的方法来做了。
如图,把判定区域划分成8个部分,进行判定。
按此在新窗口浏览图片
其中的1,3,6,8用圆心和矩形的四个顶点的距离是否小于圆的半径来做。
而其它的只要用相关的触边判定就行了。
我现在用的比较优化的判定函数是这样的:(我就不逐句解释啦,真的不难,只不过有几句比较长而已,但一切都只为了优化,虽然看上去有些不美观。)
function HitBrackDetectTwo(ball, rect) {
if (ball._x>rect._x-rect._width/2-ball.r && ball._x<rect._x rect._width/2 ball.r && ball._y>rect._y-rect._height/2-ball.r && ball._y<rect._y rect._height/2 ball.r) {
if (ball._x<rect._x-rect._width/2) {
if (ball._y<rect._y-rect._height/2) {
if ((ball._x-(rect._x-rect._width/2))*(ball._x-(rect._x-rect._width/2)) (ball._y-(rect._y-rect._height/2))*(ball._y-(rect._y-rect._height/2))<ball.r*ball.r) {
return 1;
}
} else if (ball._y<rect._y rect._height/2) {
return 2;
} else if ((ball._x-(rect._x-rect._width/2))*(ball._x-(rect._x-rect._width/2)) (ball._y-(rect._y rect._height/2))*(ball._y-(rect._y rect._height/2))<ball.r*ball.r) {
return 1;
}
} else if (ball._x<rect._x rect._width/2) {
return 3;
} else {
if (ball._y<rect._y-rect._height/2 0.01) {
if ((ball._x-(rect._x rect._width/2))*(ball._x-(rect._x rect._width/2)) (ball._y-(rect._y-rect._height/2))*(ball._y-(rect._y-rect._height/2))<ball.r*ball.r) {
return 1;
}
} else if (ball._y<rect._y rect._height/2) {
return 4;
} else if ((ball._x-(rect._x rect._width/2))*(ball._x-(rect._x rect._width/2)) (ball._y-(rect._y rect._height/2))*(ball._y-(rect._y rect._height/2))<ball.r*ball.r) {
return 1;
}
}
} else {
return 0;
}
}
2小球与横杆的碰撞。
与上面的有点类似,相对简单些,要注意的一点就是,在刚好碰到杆的边缘时,小球应该是按原来的速度的相反方向返回,
函数如下:
function HitPoleDetectTwo(mcball, pole) {
if (mcball._x>pole._x-pole._width/2-7 && mcball._x<pole._x pole._width/2 7 && mcball._y>pole._y-pole._height/2-mcball.r-1 && mcball._y<pole._y-pole._height/2-mcball.r 4) {
if (mcball._x<pole._x-pole._width/2 3) {
return 1;
} else if (mcball._x<pole._x pole._width/2-3) {
return 2;
} else {
return 3;
}
} else if (mcball._y>pole._y-pole._height/2-mcball.r 2.9) {
return 0;
}
}3自动给方块填色和程序:
先用一个数组,存放一些比较自己觉得比较好看的颜色值:
_global.a = new Array();
a[0] = 0xFF0000;
a[1] = 0x00FF00;
a[2] = 0x0000FF;
a[3] = 0x6699FF;
a[4] = 0xFF99FF;
a[5] = 0xCCCCFF;
a[6] = 0xFF3333;
a[7]

[1] [2] [3] 下一页

教程录入:admin    责任编辑:admin 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     
     
     
     

    3DsMAX实例制作:三维玻璃灯泡

    3dmax在线教程--蝴蝶

    3ds max时尚水晶鞋

    精彩Flash制作风吹草动效果动画

    教程: 3DS Max-设计实例-三维虚拟…

    3dmax7.0教程--火焰特效

    绘画技巧:Flash绘制人头造型

    3ds max 室内设计---室内效果图
    免责声明!本站资料大部分来自于互联网,其版权归原作者或其他合法者所有.如内容涉及或侵犯了您的权益,请通知本人,我将尽快处理!.欢迎您的光临。
    辽ICP备07003958号
    无师自通,伴你一生-教程网