碰撞演示:
详细代码:
/*
原创flash教程尽在自娱自乐 www.MyGameMyLove.com
smallerbird 2010-7-22 mygamemylove@qq.com
源码下载地址:http://www.mygamemylove.com/index.php?t=1&id=338
小球碰撞检测的原理:
就是以小球为圆形。以一定的角度旋转半径获得其端点的若干坐标(就是圆形线上的一些点,这里是用4度为单位旋转的。这样每次会检测90次,4*90=360),然后分别用hitTest(x,y,true)
进行碰撞检测,如果碰撞了,就速度方向取反。
*/
//////////////////////////////////////////画线//////////////////////////////////////////
import flash.filters.BlurFilter;
import fl.events.ColorPickerEvent;
//
var _root:MovieClip=this;
//画线滤镜
var arrFilter:Array=new Array();
var levelBevel = new flash.filters.BevelFilter(2, 45, 16777215, 100, 6710886, 100, 7, 7);
arrFilter.push(levelBevel);
var levelGlow = new flash.filters.GlowFilter(0, 100, 5, 5, 150);
arrFilter.push(levelGlow);
var dropB = new flash.filters.DropShadowFilter(1, 45, 0, 100, 0, 0);
//画线的参数
var lineSize:Number=20;
var px:Number,py:Number;
px=py=0;
//画板
var spPad:Sprite=new Sprite();
spPad.x=spPad.y=0;
spPad.filters=arrFilter;
var GBrush:Graphics=spPad.graphics;
//设置线色
function setGBrush(numC:Number):void {
//trace("setGBrush")
GBrush.lineStyle(lineSize,numC,1);
}
setGBrush(0xff0000);
_root.addChild(spPad);
//拾色器
function colorChange(e:Event):void {
var cp:ColorPicker = e.target as ColorPicker;
setGBrush(cp.selectedColor);
}
myColor.addEventListener(ColorPickerEvent.CHANGE, colorChange);
myColor.selectedColor=0xff0000;
//鼠标画线
var isDown:Boolean=false;
function mouse_down(e:MouseEvent):void {
isDown=true;
}
function mouse_up(e:MouseEvent):void {
isDown=false;
px=py=0;
}
function mouse_move(e:MouseEvent):void {
if (isDown) {
//trace("move")
var x0:Number=_root.mouseX;
var y0:Number=_root.mouseY;
if (px!=0&&py!=0) {
GBrush.moveTo(px,py);
} else {
GBrush.moveTo(x0,y0);
}
GBrush.lineTo(x0,y0);
px=x0;
py=y0;
}
}
stage.addEventListener(MouseEvent.MOUSE_DOWN,mouse_down);
stage.addEventListener(MouseEvent.MOUSE_UP,mouse_up);
stage.addEventListener(MouseEvent.MOUSE_MOVE,mouse_move);
//////////////////////////////////////////小球运动//////////////////////////////////////////
//碰撞目标
var mcHit:Sprite=spPad;
//是否开始运动
var isGo:Boolean=false;
//小球
var spC:Sprite=new Sprite();
var spCG:Graphics=spC.graphics;
var r:Number=10;
spCG.lineStyle(1);
spCG.beginFill(0xff0000);
spCG.drawCircle(0,0,r);
spCG.endFill();
//初使位置
var iniX:Number=160
var iniY:Number=160
spC.x=iniX;
spC.y=iniY;
//Math.PI/180
var oneHuDu:Number=0.017453;//
//trace(Math.PI/180)
//速度的一些参数
var vx:Number=0;
var vy:Number=0;
var va:Number=1;
var vg:Number=0.4;
var vspeed:Number=0.5;
//碰撞检测用的旋转度数
var rSpeed:Number=4;
var numChkCount:Number=360/rSpeed;
/*
原创flash教程尽在自娱自乐 www.MyGameMyLove.com
smallerbird 2010-7-22 mygamemylove@qq.com
源码下载地址:http://www.mygamemylove.com/index.php?t=1&id=338
*/
//小球的循环
function spC_enterFrame(e:Event):Boolean {
if (!isGo) {
return false;
}
var mcMe:Sprite=e.target as Sprite;
var xTem:Number,yTem:Number;
//碰撞检测
for (var i:Number=1; i<=numChkCount; i++) {
xTem=r*Math.cos(rSpeed*i*oneHuDu);
yTem=r*Math.sin(rSpeed*i*oneHuDu);
if (mcHit.hitTestPoint(mcMe.x+xTem,mcMe.y+yTem,true)) {
//速度去反
vx=-xTem*vspeed;
vy=-yTem*vspeed;
//reak;
}
}
//运动
vx*=va;
vy*=va;
vy+=vg;
mcMe.x+=vx;
mcMe.y+=vy;
//
if(mcMe.y>400){
mcMe.x=iniX;
mcMe.y=iniY;
isGo=false
vx=vy=0
btnPlay.label="Play";
}
//
return true;
}
spC.addEventListener(Event.ENTER_FRAME,spC_enterFrame);
this.addChild(spC);
//控制按钮
//
function fun_PlayBall(e:MouseEvent):void {
var btnName:String=(e.target as Button).name;
if (btnName=="btnPlay") {
isGo=!isGo;
if (isGo) {
btnPlay.label="stop";
} else {
btnPlay.label="Play";
}
} else if (btnName=="btnBallLeft") {
if (!isGo){
spC.x-=5
}
} else if (btnName=="btnBallRight") {
if (!isGo){
spC.x+=5
}
}
}
btnPlay.addEventListener(MouseEvent.CLICK,fun_PlayBall);
//
btnBallLeft.addEventListener(MouseEvent.CLICK,fun_PlayBall);
btnBallRight.addEventListener(MouseEvent.CLICK,fun_PlayBall);
原创flash教程尽在自娱自乐 www.MyGameMyLove.com
smallerbird 2010-7-22 mygamemylove@qq.com
源码下载地址:http://www.mygamemylove.com/index.php?t=1&id=338
小球碰撞检测的原理:
就是以小球为圆形。以一定的角度旋转半径获得其端点的若干坐标(就是圆形线上的一些点,这里是用4度为单位旋转的。这样每次会检测90次,4*90=360),然后分别用hitTest(x,y,true)
进行碰撞检测,如果碰撞了,就速度方向取反。
*/
//////////////////////////////////////////画线//////////////////////////////////////////
import flash.filters.BlurFilter;
import fl.events.ColorPickerEvent;
//
var _root:MovieClip=this;
//画线滤镜
var arrFilter:Array=new Array();
var levelBevel = new flash.filters.BevelFilter(2, 45, 16777215, 100, 6710886, 100, 7, 7);
arrFilter.push(levelBevel);
var levelGlow = new flash.filters.GlowFilter(0, 100, 5, 5, 150);
arrFilter.push(levelGlow);
var dropB = new flash.filters.DropShadowFilter(1, 45, 0, 100, 0, 0);
//画线的参数
var lineSize:Number=20;
var px:Number,py:Number;
px=py=0;
//画板
var spPad:Sprite=new Sprite();
spPad.x=spPad.y=0;
spPad.filters=arrFilter;
var GBrush:Graphics=spPad.graphics;
//设置线色
function setGBrush(numC:Number):void {
//trace("setGBrush")
GBrush.lineStyle(lineSize,numC,1);
}
setGBrush(0xff0000);
_root.addChild(spPad);
//拾色器
function colorChange(e:Event):void {
var cp:ColorPicker = e.target as ColorPicker;
setGBrush(cp.selectedColor);
}
myColor.addEventListener(ColorPickerEvent.CHANGE, colorChange);
myColor.selectedColor=0xff0000;
//鼠标画线
var isDown:Boolean=false;
function mouse_down(e:MouseEvent):void {
isDown=true;
}
function mouse_up(e:MouseEvent):void {
isDown=false;
px=py=0;
}
function mouse_move(e:MouseEvent):void {
if (isDown) {
//trace("move")
var x0:Number=_root.mouseX;
var y0:Number=_root.mouseY;
if (px!=0&&py!=0) {
GBrush.moveTo(px,py);
} else {
GBrush.moveTo(x0,y0);
}
GBrush.lineTo(x0,y0);
px=x0;
py=y0;
}
}
stage.addEventListener(MouseEvent.MOUSE_DOWN,mouse_down);
stage.addEventListener(MouseEvent.MOUSE_UP,mouse_up);
stage.addEventListener(MouseEvent.MOUSE_MOVE,mouse_move);
//////////////////////////////////////////小球运动//////////////////////////////////////////
//碰撞目标
var mcHit:Sprite=spPad;
//是否开始运动
var isGo:Boolean=false;
//小球
var spC:Sprite=new Sprite();
var spCG:Graphics=spC.graphics;
var r:Number=10;
spCG.lineStyle(1);
spCG.beginFill(0xff0000);
spCG.drawCircle(0,0,r);
spCG.endFill();
//初使位置
var iniX:Number=160
var iniY:Number=160
spC.x=iniX;
spC.y=iniY;
//Math.PI/180
var oneHuDu:Number=0.017453;//
//trace(Math.PI/180)
//速度的一些参数
var vx:Number=0;
var vy:Number=0;
var va:Number=1;
var vg:Number=0.4;
var vspeed:Number=0.5;
//碰撞检测用的旋转度数
var rSpeed:Number=4;
var numChkCount:Number=360/rSpeed;
/*
原创flash教程尽在自娱自乐 www.MyGameMyLove.com
smallerbird 2010-7-22 mygamemylove@qq.com
源码下载地址:http://www.mygamemylove.com/index.php?t=1&id=338
*/
//小球的循环
function spC_enterFrame(e:Event):Boolean {
if (!isGo) {
return false;
}
var mcMe:Sprite=e.target as Sprite;
var xTem:Number,yTem:Number;
//碰撞检测
for (var i:Number=1; i<=numChkCount; i++) {
xTem=r*Math.cos(rSpeed*i*oneHuDu);
yTem=r*Math.sin(rSpeed*i*oneHuDu);
if (mcHit.hitTestPoint(mcMe.x+xTem,mcMe.y+yTem,true)) {
//速度去反
vx=-xTem*vspeed;
vy=-yTem*vspeed;
//reak;
}
}
//运动
vx*=va;
vy*=va;
vy+=vg;
mcMe.x+=vx;
mcMe.y+=vy;
//
if(mcMe.y>400){
mcMe.x=iniX;
mcMe.y=iniY;
isGo=false
vx=vy=0
btnPlay.label="Play";
}
//
return true;
}
spC.addEventListener(Event.ENTER_FRAME,spC_enterFrame);
this.addChild(spC);
//控制按钮
//
function fun_PlayBall(e:MouseEvent):void {
var btnName:String=(e.target as Button).name;
if (btnName=="btnPlay") {
isGo=!isGo;
if (isGo) {
btnPlay.label="stop";
} else {
btnPlay.label="Play";
}
} else if (btnName=="btnBallLeft") {
if (!isGo){
spC.x-=5
}
} else if (btnName=="btnBallRight") {
if (!isGo){
spC.x+=5
}
}
}
btnPlay.addEventListener(MouseEvent.CLICK,fun_PlayBall);
//
btnBallLeft.addEventListener(MouseEvent.CLICK,fun_PlayBall);
btnBallRight.addEventListener(MouseEvent.CLICK,fun_PlayBall);