2011-08-15 3 views
0

나는 Rung-Kutta 물리학을위한이 코드 예제를 연구했지만 acceleration(p:Point, v:Point):Point 함수로 어떤 일이 일어나고 있는지 이해할 수 없다. 이 함수는 필요한 인수로 2 점 객체를 수락하지만 단순히 새 점을 반환하는 동안 함수에서 사용하지 않습니다.ActionScript - 합격 인수 무시?

저는이 인수 스타일 전달에 익숙하지 않습니다. 누군가이 기능의 중요성을 나에게 설명 할 수 있습니까? 나는 저자가 자리 표시 자 같은 방법 acceleration을 사용하고있을 수 있습니다 생각, 페이지 246

package { 
    import flash.display.Sprite; 
    import flash.display.StageAlign; 
    import flash.display.StageScaleMode; 
    import flash.events.Event; 
    import flash.geom.Point; 
    import flash.utils.getTimer; 

    public class RK2 extends Sprite 
    { 
     private var _ball:Sprite; 
     private var _position:Point; 
     private var _velocity:Point; 
     private var _gravity:Number = 32; 
     private var _bounce:Number = -0.6; 
     private var _oldTime:int; 
     private var _pixelsPerFoot:Number = 10; 


     public function RK2() 
     { 
      stage.align = StageAlign.TOP_LEFT; 
      stage.scaleMode = StageScaleMode.NO_SCALE; 

      _ball = new Sprite(); 
      _ball.graphics.beginFill(0xff0000); 
      _ball.graphics.drawCircle(0, 0, 20); 
      _ball.graphics.endFill(); 
      _ball.x = 50; 
      _ball.y = 50; 
      addChild(_ball); 

      _velocity = new Point(10, 0); 
      _position = new Point(_ball.x/_pixelsPerFoot, _ball.y/_pixelsPerFoot); 

      _oldTime = getTimer(); 
      addEventListener(Event.ENTER_FRAME, onEnterFrame); 
     } 

     private function onEnterFrame(event:Event):void 
     { 
      var time:int = getTimer(); 
      var elapsed:Number = (time - _oldTime)/1000; 
      _oldTime = time; 

      var accel1:Point = acceleration(_position, _velocity); 

      var position2:Point = new Point(); 
      position2.x = _position.x + _velocity.x * elapsed; 
      position2.y = _position.y + _velocity.y * elapsed; 

      var velocity2:Point = new Point(); 
      velocity2.x = _velocity.x + accel1.x * elapsed; 
      velocity2.y = _velocity.y + accel1.x * elapsed; 

      var accel2:Point = acceleration(position2, velocity2); 

      _position.x += (_velocity.x + velocity2.x)/2 * elapsed; 
      _position.y += (_velocity.y + velocity2.y)/2 * elapsed; 

      _velocity.x += (accel1.x + accel2.x)/2 * elapsed; 
      _velocity.y += (accel1.y + accel2.y)/2 * elapsed; 

      if(_position.y > (stage.stageHeight - 20)/_pixelsPerFoot) 
      { 
       _position.y = (stage.stageHeight - 20)/_pixelsPerFoot; 
       _velocity.y *= _bounce; 
      } 
      if(_position.x > (stage.stageWidth - 20)/_pixelsPerFoot) 
      { 
       _position.x = (stage.stageWidth - 20)/_pixelsPerFoot; 
       _velocity.x *= _bounce 
      } 
      else if(_position.x < 20/_pixelsPerFoot) 
      { 
       _position.x = 20/_pixelsPerFoot; 
       _velocity.x *= _bounce; 
      } 

      _ball.x = _position.x * _pixelsPerFoot; 
      _ball.y = _position.y * _pixelsPerFoot; 
     } 

     private function acceleration(p:Point, v:Point):Point 
     { 
      return new Point(0, _gravity); 
     } 
    } 
} 
+1

나는 액션 스크립트 전문가는 아니지만, 그 코드는 나에게 불완전 해 보인다. –

+0

그대로, 잘 컴파일하고 예상대로 작동합니다. – TheDarkIn1978

답변

2

고급 물리학 -

소스 키이스 피터스 '책 고급 액션 스크립트 3.0 애니메이션, 제 6 장입니다 아마도 후속 장에 대한 업데이트를 위해. 물론

지금 바로 그대로, 가속 방법은

private function acceleration(...rest):Point { 
    return new Point(0, _gravity); 
} 

로 다시 작성할 수 있습니다 또는 그 방법이 없습니다에 업데이트 될 호출되는 장소를 필요로하지만 인수는 (완전히 제거 할 수 어떤 인수도 포함해야합니다.)

이것은 프로그래밍 스타일이 아니지만 이전에 이런 유형의 자리 표시 자 코드를 책에 넣은 것을 보았습니다.

+0

이것은 내가 불완전한 것처럼 보였을 때 의미했던 것입니다. –

0

기본값으로 null을 사용하여 인수를 설정할 수도 있으므로 (선택 사항)입니다.

private function acceleration(p:Point = null, v:Point = null):Point 
    { 
     return new Point(0, _gravity); 
    }