2009年11月30日 星期一

鐘擺運動

想表現的是以下效果...














這次的困難點是擺盪時的數度變化
因為flash的MovieClip物件本身就有提供 rotation 這項物件旋轉的功能
所以在描述時就簡單多了
可以想成如下圖









....
總之程式大致是這樣...
(若要使用 需要把全行空白替換掉)

//創造一個容器並繪製圖像
var ObjBox = new MovieClip();

ObjBox.name="ObjBox";
ObjBox.Pic = new Shape();
ObjBox.Pic.graphics.beginFill(0xFFCC00);
ObjBox.Pic.graphics.lineStyle(0,0x666666);
ObjBox.Pic.graphics.moveTo(0,0);
ObjBox.Pic.graphics.lineTo(0,60);
ObjBox.Pic.graphics.moveTo(0,60);
ObjBox.Pic.graphics.lineTo(40,120);
ObjBox.Pic.graphics.lineTo(-40,120);
ObjBox.Pic.graphics.endFill();

ObjBox.x=100;
ObjBox.y=100;

addChild(ObjBox);
ObjBox.addChild(ObjBox.Pic);

MouseTouchObj(ObjBox,true);//導入
function MouseTouchObj(MC:MovieClip,BtnMode:Boolean=false){
 MC.buttonMode=BtnMode;//讓手指出現
 MC.addEventListener(Event.ENTER_FRAME,RotaDo);
 MC.TM_MovePower=0;
 MC.SP=5;//引力動量
 MC.SP_N=2;//引力差
 MC.SError=0.5;//停止誤差
 MC.MousePower=0;//滑鼠力量
 MC.addEventListener(MouseEvent.ROLL_OVER,ROLLDo);
 function RotaDo(e){
  var TempMC = e.currentTarget;
  TempMC.TM_X=mouseX;
  //==========Action
  if( (TempMC.TM_MovePower==0 && (TempMC.rotation==0 ||TempMC.rotation==undefined)) == false ){
   TempMC.TM_MovePower += -1*(TempMC.rotation/180) * TempMC.SP_N * TempMC.SP;
   TempMC.rotation+=TempMC.TM_MovePower;
   TempMC.TM_MovePower*=(39/40);
   //===
   if(TempMC.SError>Math.abs(TempMC.TM_MovePower) && TempMC.SError>Math.abs(TempMC.rotation)){
    TempMC.TM_MovePower=0;
    TempMC.rotation=0;
   }
  }
 }
 function ROLLDo(e){
  var TempMC = MovieClip(e.currentTarget);
  if(TempMC.TM_X==undefined){TempMC.TM_X=mouseX}
  if(TempMC.rotation<25 && TempMC.rotation>-25)
   var TempN = TempMC.TM_X-mouseX;
  if(Math.abs(TempN)>5){
   TempMC.MousePower = TempN;
   TempMC.TM_MovePower += int(20 * (((TempN)<0) ? -1*Math.sqrt(-1*TempN/10) : Math.sqrt(TempN/10)))/20;
  }
 }
}

沒有留言:

張貼留言