11RIA 闪客社区 - 最赞 Animate Flash 论坛

搜索
查看: 1944|回复: 0
上一主题 下一主题

[高级教程] 【9RIA—沐枫】—【基础小知识】第5节(力、向量)

[复制链接] TA的其它主题
发表于 2018-2-6 17:33:25 | 显示全部楼层 |阅读模式

【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
转载:9RIA游戏开发者社区(天地会)
作者:沐枫(原天地会大神)


【基础小知识】系列教程(总目录)——沐枫大神出品



向量运动
[Actionscript3] 纯文本查看 复制代码
import flash.events.MouseEvent;

var angle:Number =0;
var speed:Number = 2;//每帧移动的距离
var vx:Number=0;
var vy:Number=0;
btn.buttonMode=true;
var radians:Number=0;
txt.addEventListener(MouseEvent.CLICK,onTxTHandler);
function onTxTHandler(e:MouseEvent):void
{
stage.removeEventListener(Event.ENTER_FRAME,onEnterFrameHandler);
}
btn.addEventListener(MouseEvent.CLICK,onClickHandler);
function onClickHandler(e:MouseEvent):void
{
angle=Number(txt.text);
radians = angle * Math.PI / 180;//转换为弧度
stage.addEventListener(Event.ENTER_FRAME,onEnterFrameHandler);
}
function onEnterFrameHandler(event:Event):void
{
vx = Math.cos(radians) * speed;
vy = Math.sin(radians) * speed;
ball.x += vx;
ball.y += vy;
}


单轴加速度
[Actionscript3] 纯文本查看 复制代码
var vx:Number = 0;//加速度
var ax:Number = 0;
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUpHandler);
function onKeyDownHandler(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.LEFT)
{
ax = -0.2;//向左移动
stage.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
}
else if (event.keyCode == Keyboard.RIGHT)
{
ax = 0.2;//向右移动
stage.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
}
else if (event.keyCode == Keyboard.DOWN)
{
stage.removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler);//停止移动
}
else if (event.keyCode == Keyboard.UP)
{
stage.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);//开始移动
}
}
function onKeyUpHandler(event:KeyboardEvent):void
{
ax = 0;
}
function onEnterFrameHandler(event:Event):void
{
vx += ax;
ball.x += vx;
}


反正切实现箭头跟随鼠标旋转加向量跟踪
[Actionscript3] 纯文本查看 复制代码
import flash.display.Sprite;
import flash.events.Event;

var speed:Number = 5;
stage.addEventListener(Event.ENTER_FRAME,onEnterFrameHandler);
function onEnterFrameHandler(e:Event):void
{
var dx:Number = mouseX - mc.x;
var dy:Number = mouseY - mc.y;
var radians:Number = Math.atan2(dy,dx);//求出箭头起点与鼠标直接连线与水平线的夹角弧度。
mc.rotation = radians * 180 / Math.PI;
var vx:Number = Math.cos(radians) * speed;
var vy:Number = Math.sin(radians) * speed;
mc.x += vx;
mc.y += vy;
}


喷漆
[Actionscript3] 纯文本查看 复制代码
var canvas:BitmapData;
var color:uint;
var size:Number = 50;//半径
var density:Number = 50;//喷漆量

canvas = new BitmapData(stage.stageWidth,
stage.stageHeight,
true, 0x00000000);
var bmp:Bitmap = new Bitmap(canvas);
addChild(bmp);
//bmp.filters = [new BlurFilter(2, 2, 3)];//适应于滤镜
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDownHandler);
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUpHandler);

function onMouseDownHandler(event:MouseEvent):void
{
color = Math.random() * 0xffffff + 0xff000000;//可根据需求调换
addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
}
function onMouseUpHandler(event:MouseEvent):void
{
removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
}
function onEnterFrameHandler(event:Event):void
{
for (var i:int = 0; i < density; i++)
{
var angle:Number = Math.random() * Math.PI * 2;
var radius:Number = Math.random() * size;//不规律分布
var xpos:Number = mouseX + Math.cos(angle) * radius;
var ypos:Number = mouseY + Math.sin(angle) * radius;
canvas.setPixel32(xpos, ypos, color);
}
}
/*一步步来看,首先,创建了一些类变量,包括 canvas 变量,
用于存放 BitmapData 的实例。创建的实例尺寸等于舞台的尺寸,并使用透明的背景色。然
后使用 canvas 创建一个位图,并加入到显示列表。
鼠标事件处理函数中选择了一个随机的颜色,并且带有添加和删除 enterFrame 事件处理函
数的功能。我们来回忆一下三角学,首先,从 0 到 Math.PI * 2 中计算出一个随机的角度,
不要忘记使用弧度制表示,相当于随机的360 度。然后,计算出一个随机的半径后,再使用
三角函数将半径和角度转换为 x,y 值。最后使用 setPixel32 以鼠标位置加上随机的 x,y
值的像素点设置为喷漆色,每一次开始喷漆时随机决定颜色。在这个例子中有一个 for 循
环,每一帧都会进行循环,每次循环多少次由 density 的值决定。 color 的值为24 位的
色彩值,然后加上 0xFF000000,为的是设置 alpha 通道为完全不透明,如果没有加上这个
值,那么所有的颜色就都为透明的。如果用 0xFFFFFFFF 乘以 Math.random(),那么颜色的
透明度是随机的,也许是你想要的,但不是我想要的。通过改变 density 和 size 的值再
测试一下,看看会有些什么不同的效果。大家也许已经想到如何让用户来控制改变这些参数
了。*/



下载:
源文件.rar (28.07 KB, 下载次数: 6)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)



快速回复 返回顶部 返回列表