Flash Actionscript教程:游戏中的碰撞检测

时间:2022年12月19日

/

来源:颜徽

/

编辑:本站小编

收藏本文

下载本文

以下是小编为大家准备的Flash Actionscript教程:游戏中的碰撞检测,本文共7篇,希望对大家有帮助。本文原稿由网友“颜徽”提供。

篇1:Flash Actionscript教程:游戏中的碰撞检测

教程

简单碰撞

下面是代码:

//把你舞台上的MC实例名放入数组,测试

var ballA:Array = [ball1, ball2, ball3, ball4, ball5];

//随机初始化每个MC的运动速度和方向

for (var i = 0; i

ballA.dx = 11*rand1_1;

ballA.dy = 7*rand1_1();

}

//随机产生1或-1

function rand1_1():Number {

return random(2) ? -1 : 1;

}

Stage.scaleMode = “noScale”;

Stage.align = “TL”;

var sw:Number = Stage.width;

var sh:Number = Stage.height;

var stageListener:Object = new Object();

//舞台大小改变时,重置sw、sh

stageListener.onResize = function() {

sw = Stage.width;

sh = Stage.height;

};

Stage.addListener(stageListener);

nEnterFrame. = function () {

for (var i = 0; i

//检测所有MC之间是否有碰撞,有就根据情况改变“增量”方向

for (var j = i+1; j

if (ballA.hitTest(ballA[j])) {

mc12(ballA, ballA[j]);

ballA._x += ballA.dx;

ballA[j]._x += ballA[j].dx;

ballA._y += ballA.dy;

ballA[j]._y += ballA[j].dy;

}

}

//如果到了边界,就反射

if ((ballA._xsw-ballA._width/2 && ballA.dx>0)) {

ballA.dx *= -1;

}

if ((ballA._ysh-ballA._height/2 && ballA.dy>0)) {

ballA.dy *= -1;

}

//移动一个“增量”

ballA._x += ballA.dx;

ballA._y += ballA.dy;

}

};

//碰撞函数,根据两球碰撞方向和自身运动方向合成新的增量值

function mc12(mc1:MovieClip, mc2:MovieClip) {

var ang:Number = Math.atan2(mc2._y-mc1._y, mc2._x-mc1._x);

var ang1:Number = Math.atan2(mc1.dy, mc1.dx);

var ang2:Number = Math.atan2(mc2.dy, mc2.dx);

var r1:Number = (mc1.dy/Math.sin(ang1))*Math.cos(ang-ang1);

var r2:Number = (mc2.dy/Math.sin(ang2))*Math.cos(ang-ang2);

var dx1:Number = r1*Math.cos(ang)+r2*Math.cos(ang);

var dy1:Number = r1*Math.sin(ang)+r2*Math.sin(ang);

mc1.dx = -mc1.dx+dx1;

mc1.dy = -mc1.dy+dy1;

mc2.dx = -mc2.dx+dx1;

mc2.dy = -mc2.dy+dy1;

}

加入反弹效果

代码:

//把你舞台上的MC实例名放入数组,测试

var ballA:Array = [ball1, ball2, ball3, ball4, ball5];

//随机初始化每个MC的运动速度和方向

for (var i = 0; i

ballA[i].dx = 5*rand1_1();

ballA[i].dy = 5*rand1_1();

ballA[i].N=i;

}

//随机产生1或-1

function rand1_1():Number {

return random(2) ? -1 : 1;

}

Stage.scaleMode = “noScale”;

Stage.align = “TL”;

var sw:Number = Stage.width;

var sh:Number = Stage.height;

var stageListener:Object = new Object();

//舞台大小改变时,重置sw、sh

stageListener.onResize = function() {

sw = Stage.width;

sh = Stage.height;

};

Stage.addListener(stageListener);

nEnterFrame. = function () {

for (var i = 0; i

//如果到了边界,就反射

if ((ballA[i]._xsw-ballA[i]._width/2 && ballA[i].dx>0)) {

ballA[i].dx *= -1;

}

if ((ballA[i]._ysh-ballA[i]._height/2 && ballA[i].dy>0)) {

ballA[i].dy *= -1;

}

//检测所有MC之间是否有碰撞,有就根据情况改变“增量”方向

for (var j = i+1; j

if (myHitTest(ballA[i],ballA[j])) {

//if (ballA[i].hitTest(ballA[j])) {

mc12(ballA[i], ballA[j]);

ballA[i]._x += ballA[i].dx;

ballA[j]._x += ballA[j].dx;

ballA[i]._y += ballA[i].dy;

ballA[j]._y += ballA[j].dy;

}

}

//移动一个“增量”

ballA[i]._x += ballA[i].dx;

ballA[i]._y += ballA[i].dy;

}

updateAfterEvent();

};

//碰撞函数,根据两球碰撞方向和自身运动方向合成新的增量值

function mc12(mc1:MovieClip, mc2:MovieClip) {

//碰撞角

var ang:Number = Math.atan2(mc2._y-mc1._y, mc2._x-mc1._x);

//运动角

var ang1:Number = Math.atan2(mc1.dy, mc1.dx);

var ang2:Number = Math.atan2(mc2.dy, mc2.dx);

//反射角

var _ang1:Number = 2*ang-ang1-Math.PI;

var _ang2:Number = 2*ang-ang2-Math.PI;

//运动矢量

var r1:Number=Math.sqrt(mc1.dx*mc1.dx+mc1.dy*mc1.dy);

var r2:Number=Math.sqrt(mc2.dx*mc2.dx+mc2.dy*mc2.dy);

//碰撞矢量

var a1:Number = (mc1.dy/Math.sin(ang1))*Math.cos(ang-ang1);

var a2:Number = (mc2.dy/Math.sin(ang2))*Math.cos(ang-ang2);

//碰撞矢量合成

var dx1:Number = a1*Math.cos(ang)+a2*Math.cos(ang);

var dy1:Number = a1*Math.sin(ang)+a2*Math.sin(ang);

//碰撞后的增量

mc1.dx = r1*Math.cos(_ang1)+dx1;

mc1.dy = r1*Math.sin(_ang1)+dy1;

mc2.dx = r2*Math.cos(_ang2)+dx1;

mc2.dy = r2*Math.sin(_ang2)+dy1;

}

//碰撞侦测

function myHitTest(mc1:MovieClip,mc2:MovieClip):Boolean{

var a:Number=Math.sqrt((mc1._x-mc2._x)*(mc1._x-mc2._x)+(mc1._y-mc2._y)*(mc1._y-mc2._y));

if(a-5<=(mc1._width+mc2._width)/2){

return true;

}else{

return false;

}

}

带旋转效果:

代码:

//把你舞台上的MC实例名放入数组,测试

var ballA:Array = [ball1, ball2, ball3, ball4, ball5];

//随机初始化每个MC的运动速度、方向、旋转

for (var i = 0; i

ballA[i].dx = 5*rand1_1();

ballA[i].dy = 5*rand1_1();

ballA[i].dr = 0;//增加旋转属性

ballA[i].N=i;//球编号

}

//随机产生1或-1

function rand1_1():Number {

return random(2) ? -1 : 1;

}

//舞台属性

Stage.scaleMode = “noScale”;

Stage.align = “TL”;

var sw:Number = Stage.width;

var sh:Number = Stage.height;

var stageListener:Object = new Object();

//舞台大小改变时,重置sw、sh

stageListener.onResize = function() {

sw = Stage.width;

sh = Stage.height;

};

Stage.addListener(stageListener);

//------

nEnterFrame. = function () {

for (var i = 0; i

//如果到了边界,就反射

if (ballA[i]._x

ballA[i].dx *= -1;

ballA[i].dr += ballA[i].dy;

}

if (ballA[i]._x>sw-ballA[i]._width/2 && ballA[i].dx>0) {

ballA[i].dx *= -1;

ballA[i].dr += -ballA[i].dy;

}

if (ballA[i]._y

ballA[i].dy *= -1;

ballA[i].dr += -ballA[i].dx;

}

if (ballA[i]._y>sh-ballA[i]._height/2 && ballA[i].dy>0) {

ballA[i].dy *= -1;

ballA[i].dr += ballA[i].dx;

}

//检测所有MC之间是否有碰撞,有就根据情况改变“增量”方向

for (var j = i+1; j

if (myHitTest(ballA[i],ballA[j])) {

//if (ballA[i].hitTest(ballA[j])) {

mc12(ballA[i], ballA[j]);

ballA[i]._x += ballA[i].dx;

ballA[j]._x += ballA[j].dx;

ballA[i]._y += ballA[i].dy;

ballA[j]._y += ballA[j].dy;

}

}

//移动一个“增量”

ballA[i]._x += ballA[i].dx;

ballA[i]._y += ballA[i].dy;

ballA[i]._rotation += ballA[i].dr;

ballA[i].dr -= ballA[i].dr*0.01;

}

};

//碰撞函数,根据两球碰撞方向和自身运动方向合成新的增量值

function mc12(mc1:MovieClip, mc2:MovieClip) {

//碰撞角

var ang:Number = Math.atan2(mc2._y-mc1._y, mc2._x-mc1._x);

//运动角

var ang1:Number = Math.atan2(mc1.dy, mc1.dx);

var ang2:Number = Math.atan2(mc2.dy, mc2.dx);

//反射角

var _ang1:Number = 2*ang-ang1-Math.PI;

var _ang2:Number = 2*ang-ang2-Math.PI;

//运动矢量

var r1:Number=Math.sqrt(mc1.dx*mc1.dx+mc1.dy*mc1.dy);

var r2:Number=Math.sqrt(mc2.dx*mc2.dx+mc2.dy*mc2.dy);

//碰撞矢量

var a1:Number = (mc1.dy/Math.sin(ang1))*Math.cos(ang-ang1);

var a2:Number = (mc2.dy/Math.sin(ang2))*Math.cos(ang-ang2);

//碰撞矢量合成

var dx1:Number = a1*Math.cos(ang)+a2*Math.cos(ang);

var dy1:Number = a1*Math.sin(ang)+a2*Math.sin(ang);

//旋转矢量,这里还有点问题,旋转方向有时不对,

Flash Actionscript教程:游戏中的碰撞检测

mc1.dr += r1*Math.sin(ang-ang1);

mc2.dr += r2*Math.sin(ang-ang2);

//碰撞后的增量

mc1.dx = r1*Math.cos(_ang1)+dx1;

mc1.dy = r1*Math.sin(_ang1)+dy1;

mc2.dx = r2*Math.cos(_ang2)+dx1;

mc2.dy = r2*Math.sin(_ang2)+dy1;

}

//碰撞侦测

function myHitTest(mc1:MovieClip,mc2:MovieClip):Boolean{

var a:Number=Math.sqrt((mc1._x-mc2._x)*(mc1._x-mc2._x)+(mc1._y-mc2._y)*(mc1._y-mc2._y));

if(a-2<=(mc1._width+mc2._width)/2){

return true;

}else{

return false;

}

}

篇2:游戏中的那些事儿

游戏中的那些事儿_900字

谁说游戏中就一定没有真知呢?

为了充实这个暑假,娱乐方面的活动当然不能少啦。于是,我和几个伙伴约定下来,一起玩一个比较旧的游戏。之所以比较旧,一个方面的原因是考验我们的耐心,再者,也防止我们沉迷于此。创个小号,几个人便一起出动,在一个陌生的区里奋斗了。众所周知,刚开始玩游戏的时候是最痛苦的,一来嘛没钱,再来嘛没人气,最后甚至连朋友都没几个。如果生活也是这样的话,那真是太可怕了。角色扮演类游戏的真谛,就是让一个默默无名的小角色,通过一翻奋斗,最终变成一个有钱有势全区闻名的大人物。这跟生活有什么不同的呢?创业,致富,享受生活,这便是一生的动力。只是生活中不太可能通过打怪练级,打造装备卖钱的方式成长。这里说的仅仅是一种奋斗精神。

打开新手礼包,戴好装备,组好队伍,在阳光的炙烤下,开始踏上漫长的`征程。每个游戏总有前期难练的职业,我们玩的这个游戏当然也不例外啦。倘若只是一个人玩的话,基本上是不会有人选择这种职业的。但是,我们不一样,我们分别选择了一种职业,并始终坚持玩下去。为什么?因为我们是一个集体!只要大家都在线,大部分时间是在一起的。我们一起练级,一起做任务,一起在聊天框里嚣张。谁要是少了什么东西,其他人若有的话,必定会马上送去,如果有谁被“杀”了,大家就会冲上去报仇。这就是一种兄弟精神。现在,至少在我写这篇文章的时候,我们已经不再是刚出道的小角色了。背包里开始有了一些资金,身上穿的也不再是新手礼包里送的了。仅仅几天,我们的成长就让这个游戏世界稍稍震惊,小有名气的我们并不满足,当其他玩家在聊天框里看到整齐的我们的名字时,我们就在成长。我们是兄弟!

当然啦,漫漫长假,不可能被游戏填满。我们还是学生,学业才是最重要的,虚拟世界中的美好若放在现实的残酷面前就不值得一提了。只是在学业之余,合理地放松,暂时逃离现实,到虚拟环境中寻找现实中找不到的那份真罢了。

以上就是我在游戏中所感悟到的。

篇3:游戏中的启示

游戏中的启示

俗话说:“在家靠父母,出门靠朋友。”人生的道路上,会经历许多的坎(kǎn)坷(kě),因为有朋友的鼓励与支持,我们才能从一条条坎坷的道路上顺利通过,走向成功。而信任,是灌(uàn)溉友谊的最好养料。

今天,老师和我们玩了一个心理游戏——信任之旅。游戏规则是:一部分同学装作盲人,另一部分同学装作哑(yǎ)巴,“盲人”戴上眼罩,而“哑巴”不可发出声音,让看得见却不能说话的“哑巴”,带着能说话却看不见的“盲人”在操场上走一圈。我选择了当盲人,戴上眼罩后,眼前一片漆黑,看不见青翠的.树木,也看不见蔚(wèi)蓝的天空,感觉心里空落落的。秋风抚摩着我的脸,我却一点儿也体会不到凉爽。

我的伙伴“哑巴”牵着我的手,缓缓前行着。我小心翼翼地迈着步伐,一小步一小步慢慢地走着,心里很矛盾,要相信他吗?如果他没有带好,我摔倒了怎么办?可是我又看不见,如果不相信他,我也走不了。

突然,他将我拉住,一只手从我肩上移到脚跟,慢慢地将我的脚抬起,又下放,我这才意识到原来是到了楼梯。我挥舞着手,希望摸到一些物体,可是很失望,除了脚底的路,仿佛什么东西都不存在。这时我发现,在我的肩上还有一双手,是他慢慢地扶着我走了这么长的路,我突然明白了“出门靠朋友”的意思。只有信任朋友,相信他们,才能渡过难关,如果自己一意孤行,肯定不能顺利走完这条路。于是,我把自己交付给他。我仔细地感觉着他的一举一动,慢慢地,我们走完了楼梯,来到一个斜坡。他走在我身后,用双手撑着我的身体。“我们又通过了一个‘关卡’!”我在心里呐喊着。突然,他将我的一只手抬起,并且放慢了行走速度,我的手摸到了一根柱子,原来是一扇门,幸好他这样做,不然我肯定会撞得鼻青脸肿(zhǒn)。于是,我更相信他了。过了一会儿,我们就顺利走完了这条“漫长”的道路。

当我摘下眼罩时,眼前又恢(huī)复了光明,明媚(mèi)的阳光下,景物是那么迷人……

我默默地思索着:信任是多么重要。因为信任,所以友谊才会天长地久;因为信任,所以朋友帮助你渡过了一个又一个的难关。

篇4:游戏中的数学

在我们日常生活中,数学无所不在,本文从数学角度对人们日常所玩的抛硬币、赛马、搏饼等游戏进行分析、计算,探索游戏中的数学的奥密.

作 者:黄海鹰 黄若飞 作者单位:黄海鹰(集美大学信息学院,福建,厦门,361021)

黄若飞(南京大学,江苏,南京,210093)

刊 名:科技信息 英文刊名:SCIENCE & TECHNOLOGY INFORMATION 年,卷(期):20xx “”(7) 分类号:G42 关键词:抛硬币 赛马 搏饼 数学

篇5:游戏中的数学

一天,茜茜姐姐交给我们一个游戏:两人轮流从1~10按顺序报数,每次只能报1~3个数,谁先报到10,谁就赢了。

大家都想将对方“打倒”,但是,怎样才能让自己百分之百的胜利呢?这个问题总在我脑海中回荡,使我疑惑不解。回到家,我在小篮子里挑了十个石子,准备新手操作一下。我把爸爸叫来,让爸爸和我一起做这个游戏。我找来一支笔和一张纸,将我做的每一步记录下来。规则是这样的:我和爸爸轮流拿石子,最多拿3个,至少拿1个,谁拿到最后一个,谁就赢了。

篇6:游戏中的数学

第一场我失败了,原来爸爸让我先拿,让我在最短的时间内输的“很惨”。第二场我先拿,我居然赢了……我将记录反复看了几遍,终于发现:我把最多可以拿的数和最少要拿的数相加,即1+3=4,又用了石子总数除以它们的和,也就是10÷4=2……2,如果有余数,我就先拿,余数是几就拿几个石子,如果没有余数,就让对方先拿。现在余数是2,就拿2个石子,剩下的每次拿的石子和对方拿的和是除数4,我就可以必胜了。

依据这一发现,我又增加了取物的数量,修改了游戏的规则,把石子数增加到33,两人轮流取石子,每次取1~4个,谁先取到最后一个石子谁获胜。先用1+4=5,33÷5=6……3,也就是说谁先手谁将取得获胜机会:先取3个石子,以后每次取的石子数与对手取的加起来是5,这就也就必胜无疑了。

篇7:游戏中的数学

一、游戏教学法的重要作用

初中时期的学生对各种游戏活动往往具有较高的兴趣,所以在课堂教学过程中我们能够按照学生的心理状况与教学知识来设计合理的数学游戏,把要求学生应当理解和掌握的知识点渗透到游戏活动中来,同时在这一过程中将数学思想渗透给学生,让他们在潜移默化中培养数学思维方式,摆正学习态度,促进课堂教学效率的不断提升。与此同时,还能够借助于数学游戏来调动学生的学习积极性,因为数学游戏可以把抽象的知识内容变得更加形象化,初中数学中常常有很多抽象的知识点,这些知识是要求学生必须掌握的,所以我们在课堂教学中引入游戏,将实际生活中的案例搬到课堂中来引导学生理解知识,让他们在潜移默化的过程中把抽象的知识点具象化,随后完成内化的过程。在初中数学课堂教学中,作为教师应当给学生提供更多观察和分析的机会,进一步培养学生的自学能力,让他们实现终身学习。

二、游戏教学法在初中数学课堂中的应用

(一)在知识讲解中应用数学游戏

初中数学课堂教学中学生往往会碰到很多性质类、定理类的知识概念需要掌握和理解,然而因为部分学生自身理解能力和基础知识水平不是很高,所以在学习过程中对这部分定理和性质应用不是非常熟练,理解也不够透彻。所以我们能够应用合理的数学游戏,充分发挥出游戏活动的作用,如对三角形相关性质与定理的学习过程中,因为三角形性质较多,初中生学习时好奇心较重,不免会提出很多有趣的问题。在教学三角形内角和为180笆保糠盅嵛饰裁矗恳獯鹚堑囊苫笪颐悄芄簧杓埔恍┯蜗罚缛盟亲约憾种谱魅切危蟀蚜礁鼋羌粝吕丛俸土硗饬礁鼋瞧唇釉谝黄穑岱⑾帜芄黄闯梢桓銎浇牵绱艘焕此堑囊晌示湍芄幌N唐淅斫猓颐且竺恳幻屯澜醒菔荆佣由疃哉庖欢理的记忆[1]。

(二)在思维培养中设置数学游戏

初中数学课堂教学过程中,科学的应用游戏教学法能够帮助我们更好的培养学生的数学思维,同时在设计数学游戏活动的过程中,教师应当对游戏有更加深入的解读,同时对游戏的选择也必须要重视其中蕴含的数学价值和趣味性特点。对数学游戏的深入解读能够让学生逐渐培养和提升数学思维。例如说在教学三视图的过程中我们能够设计如下的游戏活动,拿出一个透明的水壶摆放在讲台上,随后把学生分为几个不同的小组要求他们对水壶进行观察,借助于不同角度的观察,学生所说出的答案和正视图都存在一定的差别。此时学生会产生疑问,我们顺势把三视图的基本概念和应用向他们进行细的讲解,再回头配合观察水壶这个游戏,让学生对三视图相关知识的理解更加深入。

(三)在讲解概念时设置数学游戏

讲解数学概念时常常不容易吸引学生的注意力,学生学习起来也较为乏味,因此我们应用数学游戏来让这部分知识变得有趣起来,调动他们的学习积极性。如在教学平面直角坐标系的各象限中的坐标符号时,我们能够设置如下的游戏:首先向学生解释要求两位学生手牵手,这样表示有序实数即是平面中的某点坐标,位于左边的学生代表横坐标,位于右边的学生代表纵坐标,面朝大家为正数,背向大家为负数;随后我们邀请任意两位同学手牵手站在讲台上,蒙住双眼,在地上画出直角坐标系,要求两名同学不断变换方向。随后提问:谁可以根据他们面对的方向带这两名同学回到各个象限中?借助于这一游戏让学生更加深刻的了解了平面直角坐标系的应用,进而强化了他们对知识的理解。

(四)在巩固新知时应用数学游戏

所谓温故而知新,巩固和复习知识是数学学习中非常重要的一部分,在过去的课堂教学过程中,当学生基本掌握新学的知识内容后,教师常常会选择一些练习题来帮助学生巩固教学,然而这样较为传统的“题海战术”很难调动学生的学习积极性。在巩固知识内容的过程中,我们能够考虑应用游戏活动,让游戏变为练习,这样一来往往能够起到更好的巩固效果。例如说在教学了概率这部分知识之后,为了进一步加深学生对概率的理解和认识,让他们感受到概率在实际生活中的应用,我们设计了一个转盘游戏。事先制作好两个转盘,一个分为三部分,标上1、2、3,一个分为两部分,标上4、5,这时任意邀请两位学生来转转盘,两人转完一次为一轮游戏。学生A的获胜要求是两个转盘之和为6、7,否则学生B获胜。其他同学自己选择支持的一方。在得到结果后我们要求学生思考这一游戏是否公平,为什么,并计算出概率[2]。

三、结语

总而言之,初中数学课堂教学中设计科学合理的数学游戏来辅助教学活动,能够让学生更容易理解和掌握数学知识,充分调动其学习积极性,培养其学习信心。作为一线数学教学,我们更应当进一步深入探索更新更好的教学方法,积极总结经验教训,让数学课堂更加丰富多彩,充满趣味。

参考文献:

[1]刘媛媛.初中数学教学中运用数学游戏的有效策略探讨[J].中国校外教育,20xx,(11):137.

[2]雷希国.数学游戏与初中数学课堂教学[J].学周刊,20xx,(31):63.

游戏中的科学

游戏中的收获作文

游戏中的数学作文

《游戏中的科学》读后感

数学在游戏中的主导作用

下载Flash Actionscript教程:游戏中的碰撞检测(整理7篇)
Flash Actionscript教程:游戏中的碰撞检测.doc
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档
点击下载本文文档