您的位置:首页 > 其它

Flash 游戏设计笔记:鼠标类游戏(4)

2009-02-17 23:02 465 查看
Flash 游戏设计笔记:鼠标类游戏(1)

http://blog.csdn.net/hero82748274/archive/2009/02/11/3878304.aspx



Flash 游戏设计笔记:鼠标类游戏(2)

http://blog.csdn.net/hero82748274/archive/2009/02/16/3897058.aspx



Flash 游戏设计笔记:鼠标类游戏(3)

http://blog.csdn.net/hero82748274/archive/2009/02/17/3899443.aspx



一,旋转炮台***

之前我曾经写了一些炮台的***。这个炮台能够跟随鼠标旋转角度;他的原理很简单,使用Math.atan2(y,x)来求出对应的角度

如:(Fire 为场景上的Mc)

Fire.rotation=Math.atan2(mouseY-Fire.y, mouseX- Fire.x)*180/Math.PI;



Flash ***旋转炮台:http://blog.csdn.net/hero82748274/archive/2008/11/04/3219431.aspx



由于rotation 是角度,所以要进行弧度转换角度单位



private function Run(event:Event):void
		{
			dx.text=String(mouseX);
			dy.text=String(mouseY);
			photo.x=mouseX;
			photo.y=mouseY;
			Fire.rotation=Math.atan2(mouseY-Fire.y, mouseX- Fire.x)*180/Math.PI;
			
		 
		}




我们在场景上加入了一些名为Fire的影片剪辑



二、子弹的运行轨迹

在fla 文件里面创建一个名为Ball的子弹类,当我们鼠标按下去就产生一个对象,而这个对象根据一个角度和一个速度进行运行,由于速度是矢量可以分解两个不同轴的速度一个是 dx 一个是dy



dx=speed*cos(angle);

dy=speed*sin(angle);



物理上 h=dy*t;

s=dx*t ;在一定时间内运行一个在某一个角度的恒速的运动





Flash上的物理:

var ball:Ball=new Ball();
			addChild(ball);
			ball.x=Fire.x+Math.cos(angle2*Math.PI/180)*85;
			ball.y=Fire.y+Math.sin(angle2*Math.PI/180)*85;




这里我们只是计算机出它所在的子弹初始化位置:





2.1子弹的速度分量:

ball.vx=(speed+1)*3*Math.cos(angle2*Math.PI/180);//子弹x方向 的速度,技巧就是在这里
			ball.vy=(speed+1)*3*Math.sin(angle2*Math.PI/180);//子弹y方向 的速度




简单一点来说:根据角度来计算出速度speed 的两个分量;

ball.vx=speed*Math.cos(angle*Math.PI/180);

ball.vy=speed*Math.sin(angle*Math.PI/180);





2.2子弹运行

当我们指定了子弹的初始角度和初始速度,按理想状态(不引入重力),它会以这个方向一直运动下去。



接下来,我们所做的事情是让子弹能够按照这个速度和方向运行;

ball.addEventListener(Event.ENTER_FRAME,BallMove); 使用Event.ENTER_FRAME 事件让其每一帧产生渲染。

private function BallMove(e:Event):void
		{
			var myball:MovieClip=e.currentTarget as MovieClip;
						myball.x+=myball.vx;
			myball.y+=myball.vy;
		}


这样 每一关帧就会产生一个像素的位移,子弹的坐标也发生了改变。

在物理当中 S=v*t; 位移=速度X时间



而在flash里面,其实已经隐藏了时间,代替为帧

物体.x+=Speed*T 而T就是隐藏的帧

物体.y+=Speed*T









2.3引入重力



private function BallMove(e:Event):void
		{
			var myball:MovieClip=e.currentTarget as MovieClip;
			myball.vy+=2;
			myball.x+=myball.vx;
			myball.y+=myball.vy;
		}




由于子弹在空中运行的时候,它受重力和其他阻力,假设我们忽略子弹其他阻力,使用重力让子弹能够在重力的过程中

以一个抛物线的运动轨迹运行,所以在y轴的速度分量当中,我们要加上重力的加速度。假设为2.

这样就可以模拟出一个简单的重力效果



效果:



酷吧:嘿嘿



加上一些位图









代码清单:

package 
{
import flash.display.MovieClip;
import flash.events.*;
import flash.text.TextField;
import flash.ui.Mouse;
public class Example3 extends MovieClip
{
private var dx:TextField;
private var dy:TextField;
private var photo:MousePhoto;
private var power:int=0;
private var Maxpower:Number=100;
private var angle:int=-45;
private var angle2:int;
private var speed:int=0;
public function Example3()
{
addEventListener(Event.ENTER_FRAME,Run);
stage.addEventListener(MouseEvent.MOUSE_DOWN,MouseDown);
stage.addEventListener(MouseEvent.MOUSE_UP,Mouseup);
init();
}
private function init():void
{
dx=new TextField ;
addChild(dx);
dx.width=50;
dx.height=20;
dx.x=30;
dx.y=30;
dx.border=true;

dy=new TextField ;
addChild(dy);
dy.width=50;
dy.height=20;
dy.x=30;
dy.y=53;
dy.border=true;
Mouse.hide();//隐藏鼠标
photo=new MousePhoto ;//创建代替鼠标的图
addChild(photo);
}
private function Run(event:Event):void { dx.text=String(mouseX); dy.text=String(mouseY); photo.x=mouseX; photo.y=mouseY; Fire.rotation=Math.atan2(mouseY-Fire.y, mouseX- Fire.x)*180/Math.PI; }
private function adds():void
{
stage.addEventListener(Event.ENTER_FRAME,addnum);
}

private function addnum(event:Event):void
{
speed=getScale();
trace(speed);
Mypower.scaleX=speed*10;
}

private function getScale():int
{
if (power>=-1 )
{//angle=-45;
power+=Math.tan(angle*180/Math.PI);
if (power==10)
{
angle=-135;
}
if (power==0)
{
angle=-45;
}
}
return power;
}

private function MouseDown(event:MouseEvent):void
{
adds();
}
private function BallMove(e:Event):void { var myball:MovieClip=e.currentTarget as MovieClip; myball.vy+=2; myball.x+=myball.vx; myball.y+=myball.vy; }
private function Mouseup(event:MouseEvent):void
{
stage.removeEventListener(Event.ENTER_FRAME,addnum);
Shoot();
}

private function Shoot():void
{
angle2=Fire.rotation;
var ball:Ball=new Ball();
addChild(ball);
ball.x=Fire.x+Math.cos(angle2*Math.PI/180)*90;
ball.y=Fire.y+Math.sin(angle2*Math.PI/180)*90;
ball.vx=(speed+1)*3*Math.cos(angle2*Math.PI/180);//子弹x方向 的速度,技巧就是在这里 ball.vy=(speed+1)*3*Math.sin(angle2*Math.PI/180);//子弹y方向 的速度
ball.addEventListener(Event.ENTER_FRAME,BallMove);
}
}
}




累了明天再修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: