2011-05-27 71 views
0

我遇到了一些问题 - 第一个是如何找出每条正弦曲线的尖端(即频率)和第二个是要解决如何使之沿正弦波横着滑出旋转每个对象沿正弦波移动和旋转物体

(记事本文件是800×600)

这里是我的代码: CarouselTest.as:

package 
{ 
    import com.greensock.easing.Sine; 
    import com.greensock.TweenMax; 
    import com.components.CarouselItem; 
    import com.theflashblog.fp10.SimpleZSorter; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import uk.co.thereceptacle.utils.Trig; 

    public class CarouselTest extends Sprite 
    { 
     public static const SPACING : int = 20; 
     public static const XSPACING: int = SPACING * 5; 
     public static const SPEED : Number = .05; 
     public static const XSPEED : Number = 800/360 * 2; 
     public static const RADIUS : int = 400; 

     private var _items:Array; 
     private var _container:Sprite; 
     private var _movePerItem:Number; 
     private var _noOfItems:int; 

     public function CarouselTest() 
     { 
      _items = new Array(); 
      _noOfItems = 200; 
      _movePerItem = 360/_noOfItems; // my attempt at finding how much each item must move in order to bring it to the front 

      _container = new Sprite(); 
      _container.x = 400; 
      _container.y = 300; 
      _container.z = 200; 
      addChild(_container); 

      var item:CarouselItem = new CarouselItem(); 
      for (var i:int = 0; i < _noOfItems; i++) 
      { 
       item = new CarouselItem(); 
       item.radius = RADIUS; 
       item.angle = (i * SPACING) % 360; 
       item.x = i * XSPACING - 300; 
       item.speed = SPEED; 
       _container.addChild(item); 
       _items.push(item); 
      } 

      moveItems(-1 * _movePerItem); 
     } 

     private function moveItems(direction:int):void 
     { 
      TweenMax.allTo(_items, 5, { angle:direction.toString(), x:(direction * XSPACING).toString(), ease:Sine.easeInOut }); 
      TweenMax.to(this, 5, { onUpdate:SimpleZSorter.sortClips, onUpdateParams:[_container] }); 
     } 
    } 
} 

CarouselItem.as

package com.components 
{ 
    import flash.display.Sprite; 
    import flash.text.TextField; 
    import uk.co.thereceptacle.components.HTMLTextField; 
    import uk.co.thereceptacle.utils.Trig; 

    public class CarouselItem extends Sprite 
    { 
     private var _angle : Number; 
     private var _prevX : Number; 
     private var _prevZ : Number; 

     public var speed : int; 
     public var radius : Number; 

     public function CarouselItem() 
     { 
      graphics.beginFill(0x99ff00); 
      graphics.lineStyle(1); 
      graphics.drawRect(-100, -150, 200, 300); 

      var tf:TextField = new HTMLTextField(); 
      tf.embedFonts = false; 
      tf.wordWrap = false; 
      tf.htmlText = "<p>THIS IS A TEST</p>"; 
      tf.x = -100; 
      tf.y = -tf.textHeight/2; 
      addChild(tf); 
     } 

     public function get angle():Number { return _angle; } 
     public function set angle(value:Number):void 
     { 
      _angle = value; 

      z = Math.sin(angle) * radius; 

      var deltaX:Number = x - _prevX; 
      var deltaZ:Number = z - _prevZ; 
      var rotate:Number = Trig.radiansToDegrees(Math.atan2(deltaZ, deltaX)); 
      rotationY = rotate; <strike>// this is getting close but always rotates the item away from the center and i need it to rotate towards the center on the positive side of the sine wave</strike> 
// edit: i've updated this as it's much closer but still flaky - it feels like i haven't done it right 

     } 

     override public function set x(value:Number):void 
     { 
      _prevX = x; 
      super.x = value; 
     } 

     override public function set z(value:Number):void 
     { 
      _prevZ = z; 
      super.z = value; 
     } 
    } 
} 

希望你能帮助 奥比

+0

嗨,大家好 - 我已经解决了频率问题(即正弦波的提示)。如果单次革命是2 * PI,那么只要我总是使用PI的一小部分,我就是金,所以现在我真的需要帮助,正在制定线的角度 – obie 2011-05-27 15:10:43

+0

正弦对pi/2或90度,取决于你的单位。我无法运行你的代码,但很显然你需要弄清楚旋转角度是0还是90度(或者任何你想要的)。 [本教程解释了atan2的工作方式](http://www.lashf.com/page/actionscript/atan_rotation) – Peter 2011-05-27 15:28:28

+0

你能再解释一下你想实现什么吗?在什么时候你想让精灵旋转多少度? – Peter 2011-05-27 15:35:51

回答

0

我以为你要动画有点像滑板上滚动山(或乘船在海上,或一些类似的运动)。

你需要知道的这个问题的所有触发/演算:以你想要的方式坐在曲线上的线是切线。它由曲线的导数描述。正弦曲线的导数是余弦。微积分魔术:如果曲线是* sin(b * x),则切线是a * b * cos(b * x)。这给你(上升/跑步)。如果你想以角度来表达,你需要atan(或atan2)。请注意,您需要与角度单位保持一致。最有可能atan给你弧度,你想要度。

+0

谢谢为你的帮助家伙:)我试图使用Trig.radiansToDegrees(Math.atan2(deltaY,deltaZ)),但我发现它非常闪烁,如果对象没有移动前一帧(由于在一个补间结束例如),它们将以deltaX/deltaZ为0并且平放。如果这是正确的路要走,那么我会看看我是否可以尝试解释这一点。 – obie 2011-05-27 23:50:43