2011-12-20 134 views
1

我正在与QuickBox2DAS3:更改对象的值

我用下面的语句丢了一个球。

  gameBall = sim.addCircle({x:(mouseX/30), y:(2), radius:0.15, density:1, restitution:0.7, friction:0, skin:ball, scaleSkin:false, angularDamping:20}); 

在一个if语句我想改变物体内的两个值:

   gameBall({friction:1,restitution:0}); 

我收到以下错误:

Call to a possibly undefined method gameBall. 

完整代码:

package { 

import flash.display.MovieClip; 
import com.actionsnippet.qbox.*; 
import flash.events.MouseEvent; 
import flash.events.Event; 

[SWF(width = 300, height = 600, frameRate = 60)] 

public class LuckyHitBeta extends MovieClip { 

    public var sim:QuickBox2D; 
    var winBox:QuickObject; 
    var looseBox:QuickObject; 
    var looseBox2:QuickObject; 
    var gameBall:QuickObject; 
    var simContacts:QuickContacts; 
    var isFiring:Boolean=false; 
    var ballIcon:ballIcon_mc; 



    /** 
    * Constructor 
    */ 
    public function LuckyHitBeta() 
    { 
     liveIcon(); 
     sim = new QuickBox2D(this); 
     simContacts = sim.addContactListener(); 
     simContacts.addEventListener(QuickContacts.ADD, contactListener); 
     //Important Collisions; 

     winBox = sim.addBox({x:2,y:597/30, width:98/30, height:10/30, density:0, skin:stick, skinScale:false}); 
     looseBox = sim.addBox({x:5,y:597/30, width:98/30, height:10/30, density:0, skin:stick, skinScale:false}); 
     looseBox2 = sim.addBox({x:8,y:597/30, width:98/30, height:10/30, density:0, skin:stick, skinScale:false}); 
     //Collisions 
     sim.addBox({x:3.5,y:560/30, width:72/30, height:13/30, density:0, skin:stick, skinScale:false, angle:1.57}); 
     sim.addBox({x:6.5,y:560/30, width:72/30, height:13/30, density:0, skin:stick, skinScale:false, angle:1.57}); 
     sim.addBox({x:0/30,y:300/30, width:600/30, height:28/30, density:0, skin:stick, skinScale:false, angle:1.57}); 
     sim.addBox({x:300/30,y:300/30, width:600/30, height:28/30, density:0, skin:stick, skinScale:false, angle:1.57}); 



     // make obstacles 
     for (var i:int = 0; i<(stage.stageWidth/28); i++){ 
     //End 
      sim.addCircle({x:1.2 + i * 0.8, y:16, radius:0.15, density:0, skin:ping, scaleSkin:false}); 
      sim.addCircle({x:0.6 + i * 0.8, y:15, radius:0.15, density:0, skin:ping, scaleSkin:false}); 
     } 

     for (var o:int = 0; o<(stage.stageWidth/55); o++){ 
     //Middle 

       sim.addCircle({x:1.3 + o * 1.5, y:14, radius:0.15, density:0, skin:ping, scaleSkin:false}); 
       sim.addCircle({x:1.3 + o * 1.5, y:13, radius:0.15, density:0, skin:ping, scaleSkin:false}); 
       sim.addCircle({x:1.3 + o * 1.5, y:12, radius:0.15, density:0, skin:ping, scaleSkin:false}); 
       sim.addCircle({x:1.3 + o * 1.5, y:11, radius:0.15, density:0, skin:ping, scaleSkin:false}); 
       sim.addCircle({x:1.3 + o * 1.5, y:10, radius:0.15, density:0, skin:ping, scaleSkin:false}); 
     } 

     for (var u:int = 0; u<(stage.stageWidth/45); u++){  
     //Start 
      sim.addCircle({x:0.8 + u * 1.3, y:09, radius:0.15, density:0, skin:ping, scaleSkin:false}); 
      sim.addCircle({x:1.55 + u * 1.3, y:08, radius:0.15, density:0, skin:ping, scaleSkin:false}); 
      sim.addCircle({x:0.8 + u * 1.3, y:07, radius:0.15, density:0, skin:ping, scaleSkin:false}); 
      sim.addCircle({x:1.55 + u * 1.3, y:06, radius:0.15, density:0, skin:ping, scaleSkin:false}); 

     } 
     addEventListener(Event.ENTER_FRAME,onEnterFrm); 
     stage.addEventListener(MouseEvent.CLICK, _clicked); 
     sim.start(); 



    } 

    /** 
    * .. 
    * @param e MouseEvent.CLICK 
    */ 
    private function _clicked(e:MouseEvent) 
    { 
     if (! isFiring){ 
      gameBall = sim.addCircle({x:(mouseX/30), y:(2), radius:0.15, density:1, restitution:0.7, friction:0, skin:ball, scaleSkin:false, angularDamping:20}); 
      isFiring=true; 
      ballIcon.gotoAndStop(2); 

     } 
    } 

    private function liveIcon():void { 
     ballIcon=new ballIcon_mc(); 
     addChild(ballIcon); 
     ballIcon.y=30; 
    }   

    private function onEnterFrm(e:Event):void 
    {   
     ballIcon.x=mouseX; 
     if (gameBall && gameBall.body.IsSleeping()) 
      { 
       gameBall.destroy(); 
       gameBall = null; 
       isFiring=false; 
       ballIcon.gotoAndStop(1); 
      } 
    } 

    private function contactListener(e:Event) 
    { 
     if (simContacts.isCurrentContact(winBox,gameBall)) 
     { 
      // Won. 
      trace ('You won!'); 
      isFiring=false; 
      ballIcon.gotoAndStop(1); 
     } 

     if (simContacts.isCurrentContact(looseBox,gameBall)) 
     { 
      // Loose. 
      trace ('You loose!'); 
      gameBall({friction:1,restitution:0}); 
      isFiring=false; 
      ballIcon.gotoAndStop(1); 
     } 
    } 


} 

}

回答

1

gameBall一些Object,但你要使用它作为一个function(介意括号())。通常你访问对象的属性,在这种表示法:

object.property = value;

虽然我不知道,如果QuickBox2D让你的对象初始化后更改这些属性。自从我与Box2D合作已经有一段时间了。

6

在您的代码中,gameBall是一个变量,指的是由addCircle方法创建的QuickObject。但是,在该行,

gameBall({friction:1,restitution:0}); 

您使用gameBall作为一个功能,当它是一个对象。解决的办法是

gameBall.params.friction = 1.0; 
gameBall.params.restitution = 0.0; 

注意,你不想做,

gameBall.params = { friction: 1.0, restitution: 0.0 }; 

,因为它会覆盖所有其他参数。

QuickObject的文档是here

+0

非常感谢! – 2011-12-20 06:14:20

+0

不客气! – 2011-12-20 06:17:15

+0

为了确保发生的变化,我一旦把球与地面接触,就把'密度= 0;'放在'密度= 0;'。但球继续弹跳。没有改变的迹象! – 2011-12-20 23:46:17