9RIA-沐枫 发表于 2018-2-6 17:33:25

【9RIA—沐枫】—【基础小知识】第5节(力、向量)

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


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



向量运动
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;
}

单轴加速度
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;
}

反正切实现箭头跟随鼠标旋转加向量跟踪
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;
}

喷漆
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 = ;//适应于滤镜
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 的值再
测试一下,看看会有些什么不同的效果。大家也许已经想到如何让用户来控制改变这些参数
了。*/


下载:



PS:本教程我刚刚开始写,刚开始有不完善的地方请大家多多指教,本人会把它做的更好,帮助新手们早日提高自己的水平,也算是尽一份微薄之力。
页: [1]
查看完整版本: 【9RIA—沐枫】—【基础小知识】第5节(力、向量)

感谢所有支持论坛的朋友:下面展示最新的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)