Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 获取开始接触点和结束接触点以确定速度AS3_Actionscript 3_Multi Touch - Fatal编程技术网

Actionscript 3 获取开始接触点和结束接触点以确定速度AS3

Actionscript 3 获取开始接触点和结束接触点以确定速度AS3,actionscript-3,multi-touch,Actionscript 3,Multi Touch,我试着抛出一个物体,并根据开始接触点和结束接触点创建物体移动的角度和速度。到目前为止,我能够在拖动对象mySprite时跟踪触点。当物体被释放时,我也有静态重力。然而,我很难弄清楚如何将两者联系起来 我有一个onTouchEnd函数,它可以检测物体何时被释放,这就是重力的作用。但现在什么都没发生 我错过了什么才能精确定位开始和结束接触点,然后为对象的轨迹保存两者之间的角度?对不起,我是个笨蛋 编辑:使用localX、localY更新代码 package { import flash.displ

我试着抛出一个物体,并根据开始接触点和结束接触点创建物体移动的角度和速度。到目前为止,我能够在拖动对象mySprite时跟踪触点。当物体被释放时,我也有静态重力。然而,我很难弄清楚如何将两者联系起来

我有一个onTouchEnd函数,它可以检测物体何时被释放,这就是重力的作用。但现在什么都没发生

我错过了什么才能精确定位开始和结束接触点,然后为对象的轨迹保存两者之间的角度?对不起,我是个笨蛋

编辑:使用localX、localY更新代码

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");
        }
    }


}

}

仅使用x值计算角度似乎很奇怪,请尝试以下方法:

angle = Math.atan( (startY - endY) / (startX - endX) );  // in rad
这将提供以弧度为单位的角度

要计算速度,必须在开始触摸和结束触摸之间有一个定时变量。您可以使用getTimer分别在函数onTouchBegin和onTouchEnd中获取beginTime和endTime

在那之后,你只需要用距离和时间来计算速度

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

希望有帮助

您是否尝试使用e.localX、e.localY或e.stageX、e.stageY来确定事件的本地或全局位置?在为end检索这些值之前,必须检查touchPointID是否与touchBegin中的相同。因此,可以保留对启动事件的touchPointID的引用。也许从阅读文档开始是一个好的观点:@Binou感谢分享资源。我已经看了好几个小时了,但我无法理解它的实现。我更新了上面的代码,但仍然有问题。现在看来,当我把精灵拖到屏幕底部时,它刚刚在Android设备上进行了阶段性测试。你到底有什么问题。我只是看到您正在尝试删除精灵上的enterframe类型事件,而不是触摸。我认为最好从onTouchEnd函数中删除所有抛出代码,然后将其放入另一个函数中,因为这些类型的函数必须多次调用,而不仅仅是按时调用。EnterFrame的removeEventListeners是我的错误。它们应该是touchEnd和touchBegin。上述代码已针对该错误进行了更新。这个想法是让精灵只被扔一次。所以一旦你放开它,它就会被抛起来,落在一个点上,然后一直落在屏幕的底部边缘。最后,我将添加一条规则,不允许精灵越过屏幕顶部。我只是想把角度和速度部分弄清楚。