9RIA-沐枫 发表于 2018-2-6 17:13:11

【9RIA—沐枫】—【基础小知识】第3节(三角函数大集合)


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


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


介绍:本小节主要是关于数学中三角函数公式的一些应用,在日常做游戏中你会发现它非常重要。比如在学到碰撞检测时,我们会发现内置的碰撞检测(hit testing)方法存在着先天不足,然后会看到使用勾股定理公式完成基于距离(distance-based)碰撞检测方法。它还非常适合用于计算重力或弹力等,因为这些力的大小与两个物体之间的距离成正比。

反正切实现箭头跟随鼠标旋转

import flash.display.Sprite;
import flash.events.Event;

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;
}

平滑的上下运动
import flash.events.Event;

var angle:Number=0;
stage.addEventListener(Event.ENTER_FRAME,onENTER_FRAMEHandler);
function onENTER_FRAMEHandler(e:Event):void
{
mc.y=stage.stageHeight/2+Math.sin(angle)*100;
angle+=0.1;
}

线性垂直运动和绘制波形
import flash.events.Event;

var angle:Number=0;
var sp:Sprite=new Sprite();
sp.graphics.lineStyle(1,0x000000,0.5);
sp.graphics.moveTo(mc.x,200);
stage.addEventListener(Event.ENTER_FRAME,onENTER_FRAMEHandler);
function onENTER_FRAMEHandler(e:Event):void
{
if(mc.x>550-33)//舞台默认宽550;
{
mc.x=16;
angle=0;
}
else
{
mc.x+=2;
}
mc.y=stage.stageHeight/2-Math.sin(angle)*100;
angle+=0.05;
sp.graphics.lineTo(mc.x,mc.y);
stage.addChild(sp);
}

心跳运动
import flash.events.Event;

var angle:Number=0;
stage.addEventListener(Event.ENTER_FRAME,onENTER_FRAMEHandler);
function onENTER_FRAMEHandler(e:Event):void
{
mc.scaleX=1+Math.sin(angle)*0.5;
mc.scaleY=1+Math.sin(angle)*0.5;
angle+=0.1;
}

双角波形
import flash.events.Event;
import flash.display.Sprite;

var angle:Number=0;
var angle2:Number=0;
var sp:Sprite=new Sprite();
sp.graphics.lineStyle(1,0x000000,0.5);
sp.graphics.moveTo(mc.x,200);
stage.addEventListener(Event.ENTER_FRAME,onENTER_FRAMEHandler);
function onENTER_FRAMEHandler(e:Event):void
{
sp.graphics.lineTo(mc.x,mc.y);
mc.x=275+Math.sin(angle)*50;
mc.y=200+Math.sin(angle2)*50;
angle+=0.05;
angle2+=0.11;
stage.addChild(sp);
}

圆形运动
import flash.events.Event;

var angle:Number=0;
var sp:Sprite=new Sprite();
sp.graphics.lineStyle(1,0x000000,0.5);
sp.graphics.moveTo(mc.x,200);
stage.addEventListener(Event.ENTER_FRAME,onENTER_FRAMEHandler);
function onENTER_FRAMEHandler(e:Event):void
{
mc.x=275+Math.cos(angle)*100;
mc.y=200+Math.sin(angle)*100;
//mc.y=200+Math.sin(angle)*150;//画椭圆
angle+=0.05;
sp.graphics.lineTo(mc.x,mc.y);
stage.addChild(sp);
}

两点间距离
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFormat;

var sprite1:Sprite;
var textField:TextField;
sprite1 = new Sprite();
addChild(sprite1);
sprite1.graphics.beginFill(0x000000);
sprite1.graphics.drawRect(-2, -2, 4, 4);
sprite1.graphics.endFill();
sprite1.x = stage.stageWidth / 2;
sprite1.y = stage.stageHeight / 2;
textField = new TextField();
addChild(textField);
var textF:TextFormat = new TextFormat();
textF.color = 0xff0000;
textF.size = 35;
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMoveHandler);

function onMouseMoveHandler(event:MouseEvent):void
{
graphics.clear();
graphics.lineStyle(1, 0, 1);
graphics.moveTo(sprite1.x, sprite1.y);
graphics.lineTo(mouseX, mouseY);
var dx:Number = sprite1.x - mouseX;
var dy:Number = sprite1.y - mouseY;
var dist:Number = Math.sqrt(dx * dx + dy * dy);
textField.text = dist.toString();
textField.setTextFormat(textF);
}


下载:



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

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