我使用模数创建了一个三维立方体网格,三维立方体是从数学和Flash tutorial
创建的我已经设置了监听器,所以当鼠标悬停在一个立方体上时,它开始旋转:
private function setUpListeners():void {
spBoard.addEventListener(MouseEvent.ROLL_OUT,boardOut);
}
工作正常。
要在鼠标经过它时开始旋转立方体,我使用了:
private function boardOut(e:MouseEvent):void {
addEventListener(Event.ENTER_FRAME,rotateSquare);
var i:int = 1;
function rotateSquare(e:Event) {
renderView(curTheta+i,curPhi+i);
i++;
}
}
我可以看出为什么这会效率低下,因为它每隔一帧运行一次循环,对于这么多的多维数据集它只是滞后(非常糟糕)。
有人有更好的方法吗?如果人们需要/需要它,我会很乐意发布更多代码。
提前致谢。
编辑:我应该澄清一下,我希望一旦鼠标离开立方体,旋转将无限期地继续。第二次编辑:
以下是我在“网格”上创建立方体的方法:
public function FlowerMenu(){
var rowY:Number = 0;
for (var i:int = 0; i < 190; i++) {
var myCube = new CubeMenu(["anemon.jpg","parodia.jpg","anagallis.jpg","lila.jpg","cosmos.jpg","adonis.jpg"],100);
myCube.x = 0 + ((i % 10) * 200);
if (i % 10 == 0) {
rowY += 200;
}
myCube.y = rowY;
addChild(myCube);
}
答案 0 :(得分:3)
在这种情况下,您可以将要旋转的每个多维数据集放在一个数组中,并在容器剪辑上调用ENTER_FRAME(而不是每个多维数据集)。
循环播放数组(在容器中)将比调度大量的ENTER_FRAME事件(我认为)更快。
(如果需要,请询问示例; D)
假设renderView
是MenuCube的一种方法,我建议您将所有轮换所需的代码放在renderView
内(i++
,curTheta
和{{1}等信息})。
curPhi
如果我做对了,你可以使用MOUSE_OVER和MOUSE_OUT事件:
// The container where every cube will reside
public var CubeContainer:Sprite;
// Creating Cubes, setting a listener to rotate them on MOUSE_OVER
// and adding them to the container.
public function CreateCubes()
{
CubeContainer = new Sprite();
for (var i:int = 0; i < 10; i++)
{
var NewCube = new CubeMenu(/*...*/);
NewCube.addEventListener(MouseEvent.MOUSE_OVER, RotateMe);
CubeContainer.addChild(NewCube);
}
CubeContainer.addEventListener(Event.ENTER_FRAME, RotateCubes);
}
// When MOUSE_OVER fires, start rotating (by pushing it into an Array)
// and remove MOUSE_OVER listener
public function RotateMe(e:MouseEvent):void
{
var TargetCube:CubeMenu = e.currentTarget;
CubesToRotate.push(TargetCube);
TargetCube.removeEventListener(MouseEvent.MOUSE_OVER, RotateMe);
}
// ENTER_FRAME of the container...
// This will check every container that need to be rotated
// and call renderView for it.
public function RotateCubes(e:Event):void
{
for(var i:int = 0; i <= CubesToRotate.length; i++)
{
var CurrentCube:CubeMenu = CubesToRotate[i];
CurrentCube.renderView();
}
}
这样,当您将鼠标移到private var i:int = 0;
private function setUpListeners():void
{
spBoard.addEventListener(MouseEvent.MOUSE_OVER, boardOver);
spBoard.addEventListener(MouseEvent.MOUSE_OUT, boardOut);
}
private function boardOver(e:MouseEvent):void
{
addEventListener(Event.ENTER_FRAME, rotateSquare);
}
private function boardOut(e:MouseEvent):void
{
removeEventListener(Event.ENTER_FRAME, rotateSquare);
}
private function rotateSquare(e:Event)
{
renderView(curTheta+i, curPhi+i);
i++;
}
上时,鼠标事件将仅 。
ps:如您所见,必须在函数外部定义spBoard
变量才能使其生效。
答案 1 :(得分:1)
使用补间库来执行动画(它取代了输入帧事件处理程序)。大多数这些库比使用输入框处理程序“手动”执行它更有效,例如,它将在单个处理程序中执行多个动画步骤。因此,它不是调用n
函数(对于需要旋转的n
个方格),而是调用一次执行动画的单个函数。