Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.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
Android 如何使物体跟随屏幕上的触摸运动_Android_Actionscript 3_Multi Touch_Touch Event - Fatal编程技术网

Android 如何使物体跟随屏幕上的触摸运动

Android 如何使物体跟随屏幕上的触摸运动,android,actionscript-3,multi-touch,touch-event,Android,Actionscript 3,Multi Touch,Touch Event,嘿,伙计们,我已经尝试解决这个问题有一段时间了,我在很多论坛上看过,试图理解他们试图用ActionScript3的代码传达什么,但我仍然一无所获。我的主要目标是在舞台上有一个名为“主要玩家”的角色现在我想设置触摸事件,这样当用户上下拖动手指或左右拖动手指时,我希望主播放器跟随用户路径,或者如果用户触摸屏幕上的某个点并将手指保持在那里,主播放器将被触摸吸引,并移动到手指当前在屏幕上的位置 我看到了很多关于Phase和ID实现的东西,但我不太明白到底发生了什么 到目前为止,我已经建立了: p

嘿,伙计们,我已经尝试解决这个问题有一段时间了,我在很多论坛上看过,试图理解他们试图用ActionScript3的代码传达什么,但我仍然一无所获。我的主要目标是在舞台上有一个名为“主要玩家”的角色现在我想设置触摸事件,这样当用户上下拖动手指或左右拖动手指时,我希望主播放器跟随用户路径,或者如果用户触摸屏幕上的某个点并将手指保持在那里,主播放器将被触摸吸引,并移动到手指当前在屏幕上的位置

我看到了很多关于Phase和ID实现的东西,但我不太明白到底发生了什么

到目前为止,我已经建立了:

    public class realmEngine extends MovieClip 
{
    //MultiTouch gestures
    Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
    Multitouch.inputMode = MultitouchInputMode.GESTURE;

    public var mainPlayer:mcPlayer;


    //PlayerControls
    private var speed:Number = 8.0;
    public var vx:Number = 0;
    public var vy:Number = 0;
    private var friction:Number = 0.85;
    private var maxSpeed:Number = 15;



    public function realmEngine() 
    {
            //Add Player to Stage
        mainPlayer = new mcPlayer();
        stage.addChild(mainPlayer);
        mainPlayer.x = (stage.stageWidth / 2) - 300;
        mainPlayer.y = (stage.stageHeight / 2 );
        //trace("this works");



        //Setup Touch Event listeners
        mainPlayer.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin);
        stage.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove);
        stage.addEventListener(TouchEvent.TOUCH_END, onTouchEnd);

        //Game Loop Event Listener
        stage.addEventListener(Event.ENTER_FRAME, gameLoop);


    }

    private function gameLoop(e:Event):void 
    {
        mainPlayerControls();
    }

    private function mainPlayerControls():void 
    {

    }

    private function onTouchEnd(e:TouchEvent):void 
    {

    }

    private function onTouchMove(e:TouchEvent):void 
    {

    }

    private function onTouchBegin(e:TouchEvent):void 
    {

    }

}
我不确定在onTouch函数中应该做什么,以便我通过代码添加到stage中的对象跟随用户在屏幕上的触摸


有谁能给我指引正确的方向或给我一些建议吗?我会非常感激的,谢谢各位。是的,我碰巧知道怎么做,我只是不确定我是否完全掌握了你们想要实现的目标

注意我不会考虑移动播放器的
速度
最大速度
变量。这超出了这个范围,也超出了我头顶的范围。然而,一点网络搜索会让你在这个问题上走得更远

首先,为了使对象遵循用户绘制的路径,我们需要一种存储路径的方法。为此,我建议使用
作为其数据类型的
向量
。在添加和删除元素时,它可以快速轻松地使用,而无需担心其长度

我们还需要一种方法来告诉玩家精灵是否应该移动,换句话说,用户是否在屏幕上按手指

private var _pathPoints : Vector.<Point>;
private var _isMoving : Boolean = false;
private function onTouchBegin ( e:TouchEvent ) : void
{
    _pathPoints.push( new Point( e.stageX, e.stageY ) );
    _isMoving = true;
}

private function onTouchMove ( e:TouchEvent ) : void
{
    _pathPoints.push( new Point( e.stageX, e.stageY ) );
}

private function onTouchEnd ( e:TouchEvent ) : void
{
    // Dirty but quick way of clearing the vector
    _pathPoints.splice(0);
    _isMoving = false;
}
然后我们注意用户移动手指的时间。这里没什么好玩的。 我们只是简单地将坐标存储在向量中,并存储用户是否按下屏幕的当前状态

private var _pathPoints : Vector.<Point>;
private var _isMoving : Boolean = false;
private function onTouchBegin ( e:TouchEvent ) : void
{
    _pathPoints.push( new Point( e.stageX, e.stageY ) );
    _isMoving = true;
}

private function onTouchMove ( e:TouchEvent ) : void
{
    _pathPoints.push( new Point( e.stageX, e.stageY ) );
}

private function onTouchEnd ( e:TouchEvent ) : void
{
    // Dirty but quick way of clearing the vector
    _pathPoints.splice(0);
    _isMoving = false;
}
最后,更有趣的是;主游戏循环!或者“魔法发生的地方”

private函数mainPlayerControls():void
{
//更新玩家位置和兵力
vx*=摩擦;
vy*=摩擦力;
mainPlayer.x+=vx;
mainPlayer.y+=vy;
//检查玩家是否应该移动到新的点
如果(正在移动)
{
//获取对当前目标坐标的引用
变量目标:点=_路径点[0];
//检查球员位置是否达到当前目标点
//我们使用尺寸等于最大速度的边界框来确保
//如果玩家没有越过该点移动,则向后移动
//然后开始来回走动

如果(mainPlayer.x>=target.x-maxSpeed&&mainPlayer.x=target.y-maxSpeed&&mainPlayer.y如果我理解正确,是否希望对象既遵循用户绘制的路径,又指向用户触摸的点?是的,这正是我试图实现的。因此,每当你在屏幕上拖动手指时,对象都会跟随它一个方向。)我说你把手指从屏幕上移开,物体就会停止。你知道我应该做什么或者怎么做吗?非常感谢你的详细回答。我下班后会尝试在我的代码中实现它。但这似乎比我想象的要简单。哈哈。很棒的东西如果我遇到任何问题,我会告诉你的。好吧,我仍然有问题我的问题。首先,你说要将mainPlayer.addeventlistener更改为stage.addeventlistener,对吗?而且对象似乎根本没有移动。我触摸屏幕,什么都没有发生,甚至没有任何痕迹。我会尝试找出原因,但同时我只想更新你,看看是否有错误。谢谢,我同时。哦,是的,我差点忘了路径点。拼接(0);需要两个参数,所以我不确定第一个参数应该是什么,因为它不是for循环,我不能只分割“i”我习惯做hahaSorry刚才看到你在上面的笔记不能移动播放器,播放器应该在移动。你的类是主类
realmEngine
还是在某个地方实例化的?我在想它是否有对舞台的实际引用。至于要拼接的第二个参数,你可以使用
Number.MAX\u VALUE