Вот забрёл я на
сайт, посмотрел, понравилось. Впроде как ничего тяжёлого решил повторить. Но столкнулся с проблемой - я начинаю осуществлять tween когда у меня двигается мышка. И вот если я вначале резко дёргаю мышкой, а потом замедляю но не останавливаю получается убожество. Мне интересно как это хоть примерно реализовано на том сайте. Вот то что я сделал:
Код AS3:
package
{
import away3d.cameras.HoverCamera3D;
import away3d.containers.Scene3D;
import away3d.containers.View3D;
import away3d.core.render.Renderer;
import away3d.events.MouseEvent3D;
import away3d.materials.ColorMaterial;
import away3d.materials.MovieMaterial;
import away3d.primitives.Cube;
import away3d.primitives.data.CubeMaterialsData;
import caurina.transitions.Tweener;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
[SWF(width="800", height="600", frameRate="60", backgroundColor="0xFFFFFF", quality="high")]
public class Menu_3D extends Sprite
{
private static const MENU_ITEM_WIDTH:int=200;
private static const MENU_ITEM_HEIGHT:int=25;
private static const MENU_ITEM_DEPTH:int=300;
private static const MENU_ITEM_DISTANCE:int=4;
private var _scene:Scene3D;
private var _view:View3D;
private var _cam:HoverCamera3D;
private var mat:ColorMaterial=new ColorMaterial(0x999999);
private var cubeData:CubeMaterialsData=new CubeMaterialsData({left:'black', right:mat, top:'black', bottom:'black', back:'black'});
private var _xmlMenu:XML;
private var _menuContainers:Array=new Array();
private var mousePositionX:int;
public function Menu_3D()
{
createXML();
init3d();
createMenu();
addListeners();
}
private function createXML():void
{
_xmlMenu=<Menu>
<item name="О компании">
</item>
<item name="Новости">
</item>
<item name="Продукция">
<subItem name="Новинки">
</subItem>
<subItem name="Изделия">
</subItem>
<subItem name="Материалы">
</subItem>
</item>
<item name="Портфолио">
</item>
<item name="Реклама">
<subItem name="Каталог">
</subItem>
<subItem name="Брошюры">
</subItem>
<subItem name="Демоматериалы">
</subItem>
<subItem name="Презентации">
</subItem>
</item>
<item name="Техподдержка">
<subItem name="Инструкции">
</subItem>
<subItem name="Схемы подключения">
</subItem>
<subItem name="Вводимые в производство">
</subItem>
<subItem name="Снимаемые с производства">
</subItem>
</item>
<item name="Для дизайнеров">
<subItem name="Конкурс 2008-2009">
</subItem>
<subItem name="GIRAклы Украины">
</subItem>
</item>
<item name="Для дилеров">
<subItem name="Остатки">
</subItem>
<subItem name="Поставки">
</subItem>
<subItem name="Доп информация">
</subItem>
</item>
<item name="Дилеры">
</item>
<item name="Контакты">
</item>
</Menu>;
}
private function init3d():void
{
_scene=new Scene3D();
_cam=new HoverCamera3D();
_view=new View3D({scene:_scene, view:_view, camera:_cam, x:stage.stageWidth/2, y:stage.stageHeight/2, stats:true});
_view.renderer = Renderer.CORRECT_Z_ORDER;
addChild(_view);
}
private function createMenu():void
{
for (var i:int=0; i<_xmlMenu.descendants("item").length(); i++)
{
var s:String=_xmlMenu.descendants("item")[i].attribute("name");
var b:Boolean=false;
if (_xmlMenu.descendants("item")[i].elements().length()>0) { b=true; }
_menuContainers[i]=new Cube({faces:cubeData});
_menuContainers[i].width=MENU_ITEM_WIDTH;
_menuContainers[i].height=MENU_ITEM_HEIGHT;
_menuContainers[i].depth=MENU_ITEM_DEPTH;
_menuContainers[i].y=(_xmlMenu.descendants("item").length()/2)*(MENU_ITEM_HEIGHT)-(i*(MENU_ITEM_HEIGHT+MENU_ITEM_DISTANCE));
_menuContainers[i].material=new MovieMaterial(new ItemTexture(s, b), {smooth:true, precision:5, interactive:false});
_view.scene.addChild(_menuContainers[i]);
}
}
private function addListeners():void
{
stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function mouseMoveHandler(evt:MouseEvent):void
{
//Tweener.removeAllTweens();
for(var i:int=0; i<_menuContainers.length; i++)
{
var t:Number=(0.2+(i*0.04));
Tweener.addTween(_menuContainers[i], {rotationY:mousePositionX, time:t, transition:"easeInOutSine"});
}
}
private function onEnterFrame(e:Event):void
{
if (mouseX<stage.stageWidth/2)
{
mousePositionX=0;
_cam.targetpanangle=0;
}
else
{
_cam.targetpanangle=-((mouseX-(stage.stageWidth/2))*0.03);
mousePositionX=((mouseX-(stage.stageWidth/2))*0.07);
}
_cam.targettiltangle=-((mouseY-(stage.stageHeight/2))*0.05);
_cam.hover();
_view.render();
}
}
}
Исходник и откомпиленая флешка в архиве в прикреплённом файле.