Flash 模拟射箭

这个例子主要体现了Flash中物理学的运用——抛物线运动,主要有速度分量(水平方向,竖直方向),摩擦力等,UI非常丑,主要看功能

UI部分大概

1、新建一fla文件,在图层一导入一张带有鸟在天空飞翔的图片

2、新建一图层,命名弹力条,用矩形工具绘制一矩形,填充黑色,即弹力条背景,F8转换成影片剪辑元件,实例名命名power_staff,双击进入元件编辑区,再用矩形工具绘制一较小的矩形,就是弹力条,填充蓝色,F8转换成元件,实例名命名power_bar;再新建一文本,类型选择动态,用于显示当前弹力大小,文本命名为power_t;返回元件编辑区,回到舞台,在左上角新建一文本,用于显示弓箭角度,命名angle_t

3、导入一张弓箭箭杆的图片,F8转换成元件,实例名arrow,并在第一帧导出类Arrow

代码部分

F9在帧上添加如下脚本:

import flash.events.MouseEvent;

import flash.display.MovieClip;
import flash.text.TextField;

var curElasticNum:int = 0;//当前弹力
var maxElasticNum:int = 200;//最大弹力
var power_ratio:Number = 0.0;//衡量弹力大小的一个系数
var power_bar:MovieClip = null;
var power_bar_h:int = 0;
var power_t:TextField = null;
initialize();

function initialize():void{
initUI();
initEvents();
}
function initUI():void{
power_bar = power_staff.power_bar as MovieClip;
power_t = power_staff.power_t as TextField;
power_bar_h = power_bar.height;
power_bar.height = 0;
refreshElasticNum()
}

function initEvents():void{
arrow.addEventListener(MouseEvent.MOUSE_DOWN,onDown)
arrow.addEventListener(MouseEvent.MOUSE_UP,onUp)
arrow.addEventListener(Event.ENTER_FRAME,onHandler);
}

function onUp(e:MouseEvent):void{
createArrowAndFly()
curElasticNum = 0;
power_bar.height = (curElasticNum * power_bar_h)/maxElasticNum ;
refreshElasticNum();
this.removeEventListener(Event.ENTER_FRAME,onCounter);
}
function onDown(e:MouseEvent):void
{
this.addEventListener(Event.ENTER_FRAME,onCounter);
}

function onCounter(event:Event):void
{
if(curElasticNum < maxElasticNum){
curElasticNum++;
power_ratio = curElasticNum/40;
power_bar.height = (curElasticNum * power_bar_h)/maxElasticNum ;//弹力条变化
refreshElasticNum()
}
}
function refreshElasticNum():void{
power_t.text = "弹力"+curElasticNum+"N";
}
function onHandler(event:Event):void
{
var dy:Number = mouseY-arrow.y;
var dx:Number = mouseX-arrow.x;

angle_t.text = "角度: "+String((int(Math.atan2(dy,dx)*180/Math.PI)+360)%360);
arrow.rotation = Math.atan2(dy,dx)*180/Math.PI;
}

function createArrowAndFly():void{
var a:Arrow=new Arrow();
this.addChild(a);
a.x = arrow.x;
a.y = arrow.y;
a.scaleX = a.scaleY = 0.1;
a.rotation = arrow.rotation;
a.vx = Math.cos(a.rotation*Math.PI/180)*9 * power_ratio;//弹力系数,影响水平方向速度
a.vy = Math.sin(a.rotation*Math.PI/180)*9 * power_ratio;//弹力系数,影响竖直方向速度
a.firction = 0.1;//摩擦力系数
a.addEventListener(Event.ENTER_FRAME,onHandlerFly);
}

function onHandlerFly(event:Event):void
{
var arrow:Arrow = Arrow(event.target);
if(arrow){
arrow.x += arrow.vx;
arrow.y += arrow.vy;
arrow.vy += arrow.firction;
arrow.rotation = Math.atan2(arrow.vy,arrow.vx)*180/Math.PI;
if(arrow.x > stage.stageWidth || arrow.y < 0 || arrow.y > stage.stageHeight){
arrow.parent.removeChild(arrow);
arrow.removeEventListener(Event.ENTER_FRAME,onHandlerFly);
arrow = null;
}
}

}

Ctrl+Enter导出效果如下:


猜你喜欢

转载自blog.csdn.net/guominyou/article/details/80500697