package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.geom.PerspectiveProjection;
import flash.geom.Point;
import flash.geom.Vector3D;
import flash.utils.Timer;
import flash.utils.getDefinitionByName; /**
* @author Frost.Yen
* @E-mail 871979853@qq.com
* @create 2015-8-13 下午4:03:27
*
*/
[SWF(width="1024",height="768")]
public class RotateMain extends Sprite
{
[Embed(source="assets/001.png")]
private var _img0:Class;
[Embed(source="assets/002.png")]
private var _img1:Class;
[Embed(source="assets/003.png")]
private var _img2:Class;
[Embed(source="assets/004.png")]
private var _img3:Class;
[Embed(source="assets/005.png")]
private var _img4:Class;
[Embed(source="assets/006.png")]
private var _img5:Class;
[Embed(source="assets/007.png")]
private var _img6:Class;
[Embed(source="assets/007.png")]
private var _img7:Class; private var _num:int = 7;
private var _radius:Number = 300;
private var _itemArr:Array = [];
private var _speed:Number = 1;
private var _ratio:Number = 0.25;//系数
private var _downX:Number;
private var _container:Sprite;
private var _timer:Timer = new Timer(20);
public function RotateMain()
{
this.graphics.beginFill(0,1);
this.graphics.drawRect(0,0,1024,768);
this.graphics.endFill();
initViews();
initEventListeners();
}
private function initViews():void
{
_container = new Sprite();
_container.x = 1024*0.5;
_container.y = 768*0.5-200;
_container.z = 0;
this.addChild(_container);
for(var i:int = 0;i<_num;i++){
var angle:Number = Math.PI * 2/_num*i;
var sp:Sprite = new Sprite();
//var img:Class = getDefinitionByName("RotateMain__img"+i) as Class;
var bmp:Bitmap = new this["_img"+i](); sp.x = Math.cos(angle)*_radius;
sp.z = Math.sin(angle)*_radius;
sp.addChild(bmp);
_container.addChild(sp);
_itemArr.push(sp);
}
swapItems();
_timer.addEventListener(TimerEvent.TIMER,onTimer);
_timer.start(); }
private function initEventListeners():void
{
stage.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
}
private function onDown(e:MouseEvent):void
{
stage.addEventListener(MouseEvent.MOUSE_MOVE,onMove);
stage.addEventListener(MouseEvent.MOUSE_UP,onUp);
_timer.stop();
_downX = mouseX;
}
private function onMove(e:MouseEvent):void
{
_speed = (_downX-mouseX)*0.01;
_container.rotationY += _ratio * _speed;
var p:PerspectiveProjection = new PerspectiveProjection();
p.fieldOfView = 55;
p.projectionCenter = new Point(512,-100);
_container.transform.perspectiveProjection = p;
swapItems(); }
private function onUp(e:MouseEvent):void
{
stage.removeEventListener(MouseEvent.MOUSE_MOVE,onMove);
stage.removeEventListener(MouseEvent.MOUSE_UP,onUp);
_timer.start();
}
private function onTimer(e:TimerEvent):void
{
if(_speed < -1){
_speed+=0.02;
if(_speed >=-1){
_speed = -1;
}
}else if(_speed >1){
_speed-=0.02;
if(_speed <=1){
_speed = 1;
}
}else if(_speed>-1&&_speed<0){
_speed-=0.02;
}else if(_speed<1&&_speed>0){
_speed+=0.02;
}
_container.rotationY += _ratio *_speed ;//trace(_ratio,_speed);
var p:PerspectiveProjection = new PerspectiveProjection();
p.fieldOfView = 55;
p.projectionCenter = new Point(512,-100) ; //视点
_container.transform.perspectiveProjection = p;
swapItems();
}
private function swapItems():void
{
_itemArr.sort(swapDepth);
for(var i:int = 0; i < _itemArr.length; i++ )
{
_container.addChildAt(_itemArr[i] as Sprite,i);
(_itemArr[i] as Sprite).rotationY -= _ratio *_speed;
}
}
private function swapDepth(objA:DisplayObject,objB:DisplayObject):int
{
var posA:Vector3D = objA.transform.matrix3D.position ;
posA = _container.transform.matrix3D.deltaTransformVector(posA);
var posB:Vector3D = objB.transform.matrix3D.position;
posB = _container.transform.matrix3D.deltaTransformVector(posB);
return posB.z - posA.z;
}
}
}

[ActionScript 3.0] AS3实现3D旋转的更多相关文章

  1. [ActionScript 3.0] as3处理xml的功能和遍历节点

    as3比as2处理xml的功能增强了N倍,获取或遍历节点非常之方便,类似于json对像的处理方式. XML 的一个强大功能是它能够通过文本字符的线性字符串提供复杂的嵌套数据.将数据加载到 XML 对象 ...

  2. [ActionScript 3.0] AS3.0 动态加载显示内容

    可以将下列任何外部显示资源加载到 ActionScript 3.0 应用程序中: 在 ActionScript 3.0 中创作的 SWF 文件 — 此文件可以是 Sprite.MovieClip 或扩 ...

  3. [ActionScript 3.0] AS3 3D双圆环贴图

    package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.MovieCl ...

  4. [ActionScript 3.0] AS3 3D星形贴图

    package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.MovieCl ...

  5. [ActionScript 3.0] AS3.0和AS2.0的相互通信

    AS3和AS2之间的通信,最好的方式可能就是LocalConnection了. AS2向AS3发送数据,即AS2调用AS3的函数: as2.0代码(按钮上写的发送信息代码): on (release) ...

  6. [ActionScript 3.0] AS3.0 本机鼠标指针

    Flash Player 10.2添加了内置的本机鼠标指针(native mouse cursor)支持,虽然在之前的版本里我们可以侦听MouseEvent事件来模拟鼠标指针,但是在有了原生的本机鼠标 ...

  7. [ActionScript 3.0] AS3 深入理解Flash的安全沙箱Security Domains

    简介 如果你还没有与复杂的的安全域(security domain)和应用程序域(application domain)问题打过交道,那么你真是个幸运的家伙.当你在加载外部内容(然后他们开始播放)的时 ...

  8. [ActionScript 3.0] AS3 深入理解Flash的 应用程序域Application Domains

    简介 网上有很多flash,通常都不需要显示的使用应用程序域,因为默认的应用程序域就够用了.其实复杂的情况下需要用到应用程序域,比如说有两个不同的swf,一个是旧版本的,一个是新版的,这两个文件里的类 ...

  9. [ActionScript 3.0] AS3调用百度天气预报查询API

    接口说明 根据经纬度/城市名查询天气的结果 接口示例 http://api.map.baidu.com/telematics/v3/weather?location=成都&output=jso ...

随机推荐

  1. 新手C#ListView使用记录2018.08.03

    在使用C#的ListView时,感觉有一些部分需要自己注意. ListView1.Clear()这条指令在使用时,用于Click后在ListView中显示数据,应该放在输入数据的前面. 在ListVi ...

  2. SQL select 执行顺序

    一.sql语句的执行步骤:1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义.2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限.3)视图转换,将涉及视图的查询语 ...

  3. Elasticsearch前沿:ES 5.x改进详解与ES6展望

    转:http://www.dataguru.cn/article-11094-1.html 曾勇(Medcl),Elastic 工程师与布道师,2015 年加入 Elastic 公司.加入 Elast ...

  4. Unity3D UI史

    http://www.cnblogs.com/hammerc/p/4837204.html 扫码时备注或说明中留下邮箱付款后如未回复请至https://shop135452397.taobao.com ...

  5. EntityFramework - Code First - 数据迁移

    需求 在更新模型之后同步更新数据库里的表,并不丢失原有数据 使用默认值填充新增加的字段 EntityFramework迁移命令 Enable-Migrations 启用迁移 Add-Migration ...

  6. TortoiseSVN教程

    TortoiseSVN使用教程 TortoiseSVN是一个SVN的客户端 1.Checkout Repository 首先要Checkout服务器端的Repository,所谓的Checkout就是 ...

  7. NHibernate获取实体配置信息(表名,列名等等)

    // 注意这里有个&符号,并不是写错了,而是约定 就是这样写的ctx.GetObject("&SessionFactory") 这是官网地址http://nhfor ...

  8. Oracle 自增长id

    CREATE SEQUENCE to38_import_result_seq INCREMENT BY 1 START WITH 10000 NOMAXVALUE NOCYCLE NOCACHE CR ...

  9. hbase java api样例(版本1.3.1,新API)

    hbase版本:1.3.1 目的:HBase新API的使用方法. 尝试并验证了如下几种java api的使用方法. 1.创建表 2.创建表(预分区) 3.单条插入 4.批量插入 5.批量插入(客户端缓 ...

  10. [GO]匿名字段的同名字段操作

    package main import ( "fmt" ) type Person struct { name string sex byte age int } type Stu ...