2013-12-17 1 views
0

나는 물체를 던져서 시작점과 끝 지점을 기준으로 물체가 움직이는 각도와 속도를 만들려고합니다. 지금까지 객체를 드래그하면서 터치 포인트를 추적 할 수있었습니다 mySprite. 또한 물체를 놓을 때 정적 인 중력을 가지고 있습니다. 그러나 두 가지를 서로 연결하는 방법을 찾는 데 어려움을 겪고 있습니다.터치를 시작하고 속도를 결정하기 위해 터치 포인트를 끝내기 AS3

나는 객체가 언제 풀려나는지 감지하고 중력이 시작되는 곳을 감지하는 함수 onTouchEnd()이 있습니다.하지만 지금 아무 일도 일어나지 않습니다.

시작점과 종료점을 정확히 찾아 내고 두 점 사이의 각도를 객체의 궤도에 저장할 수 없으면 어떻게됩니까? 그런 멍청한 놈 한테 미안해.

편집 : 한 localX를 사용하여 업데이트 코드 및 localY 단지 x 값을 사용하여 각도를 계산

package { 
import flash.display.MovieClip; 
import flash.events.*; 
import flash.ui.Multitouch; 
import flash.ui.MultitouchInputMode; 
import flash.display.Sprite; 

public class ThrowIt extends MovieClip{ 
    public var bg:Sprite = new Sprite(); 
    public var mySprite:Sprite = new Sprite(); 
    Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT; 
    public var startX:int; 
    public var endX:int; 
    public var startY:int; 
    public var endY:int; 
    public var angle:int; 
    //public var speed:Number = 10; //this will change based on mouse speed 
    public var moving:Number = 0; 
    public var speedLimit:Number = 35; 
    public var scale_x:Number = Math.cos(angle); 
    public var scale_y:Number = Math.sin(angle); 
    public var posY:Number = stage.y; 
    public var goingUp:Boolean = false; 
    public var goingDown:Boolean = false; 
    //public var velocityX:Number = (speed*scale_x); 
    //public var velocityY:Number = (speed*scale_y); 

    public function ThrowIt() { 
     mySprite.graphics.beginFill(0x336699); 
     mySprite.graphics.drawRect(0,0,40,40); 
     //addChild(bg); 
     addChild(mySprite); 
     mySprite.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin); 
     mySprite.addEventListener(TouchEvent.TOUCH_END, onTouchEnd); 
    } 

    function onTouchBegin(e:TouchEvent) { 
     mySprite.startTouchDrag(e.touchPointID, false); 

     /*TRACK THE START POINT OF THE DRAG HERE*/ 
     /*NEED THE X AND Y POSITION TO FIGURE OUT ANGLE AND VELOCITY OF OBJECT*/ 
     startX = e.localX; 
     startY = e.localY; 
     trace("the starting x is " + startX); 

    } 

    function onTouchEnd(e:TouchEvent) { 
     mySprite.stopTouchDrag(e.touchPointID); 
     /*TRACK THE END POINT OF THE DRAG HERE*/ 
     /*AGAIN, NEED BOTH THE X AND Y POSITION*/ 

     endY = e.localY; 
     endX = e.localX; 

     //angle = (endX - startX)*Math.PI(180); 

     /*AFTER GETTING THE VELOCITY FIGURED OUT, THROW OBJECT*/ 
     if(!goingUp){ 
      goingUp = true; 
      //moving = speedLimit*-1; 
      moving = (startY - endY)*-1; 
      moving += .2; 
      mySprite.y += moving; 
      mySprite.y = Math.min(mySprite.y, stage.stageHeight - 510); //min position of the object 
      mySprite.y = Math.max(mySprite.y, 0); ///max position of the object 
     } 
     if(moving < 0){//if mySprite is still going up 
      moving *= 1 - speedLimit/250;//decrease moving slightly 
      if(moving > -speedLimit*.1){//if moving is small enough 
       moving *= -1;//then begin to go down 
      } 
     } 
     if(moving > 0 && moving <= speedLimit){//if mySprite is going down 
      moving *= 1 + speedLimit/400;//increase the falling speed 
     } 
     mySprite.y += moving; 
     //WHEN OBJECT GOES BELOW THE STAGE, DELETE IT AND STOP TRACKING EVENTS 
     if(mySprite.y >= stage.stageHeight){ 
      removeChild(mySprite); 
      mySprite.removeEventListener(TouchEvent.TOUCH_END, onTouchEnd); 
      mySprite.removeEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin); 

      trace("removed"); 
     } 
    } 


} 

} 
+0

당신이 e.localX, e.localY 또는 e.stageX와 함께 시도 않았다 e.stageY을 이벤트의 로컬 또는 글로벌 위치를, 도움이

distance = Math.sqrt(((startX - endX)*(startX - endX))/((startY - endY)*(startY - endY))); velocity = distance/(endTime-beginTime); // in pixel/ms 

희망? 이전에이 값을 검색하기 전에 touchPointID가 touchBegin과 동일한 지 확인해야합니다. 시작 이벤트의 touchPointID에 대한 참조를 유지해야합니다. 아마도 문서를 읽는 것으로 시작하는 것이 좋습니다. [TouchEvent documentation] (http://help.adobe.com/ko_KR/FlashPlatform/reference/actionscript/3/flash/events/TouchEvent.html) –

+0

@Binou 공유에 감사드립니다. 자원. 나는 몇 시간 동안 그것을보고 있었지만 구현을 이해할 수 없었다. 위의 코드를 업데이트했지만 여전히 문제가 있습니다. 이제 스프라이트를 화면 하단으로 드래그하면 무대에서 슛이 날 것입니다 (Android 기기에서 테스트). – questioner

+0

당신의 문제는 무엇입니까? 필자는 터치 대신 enterframe 유형의 이벤트를 스프라이트에서 제거하려고하는 것을 보았습니다. 나는 onTouchEnd 함수에서 모든 throwing 코드를 제거하는 것이 더 좋을 것이라고 생각한다. 왜냐하면 이러한 유형의 함수는 여러 번 호출되어야하고 시간이 지남에 따라 호출되어야하기 때문이다. –

답변

0

이상한 것,이 시도 :

angle = Math.atan((startY - endY)/(startX - endX)); // in rad 

이것은 라디안 당신에게 각도를 제공 할 것입니다.

속도를 계산하려면 시작 터치와 종료 터치 사이에 타이밍 변수가 있어야합니다. getTimer()을 사용하면 각각 onTouchBeginonTouchEndbeginTimeendTime을 얻을 수 있습니다.

그 후 거리와 시간으로 속도를 계산하면됩니다.)