【问题标题】:How to make Object follow touch movement on screen如何使对象跟随屏幕上的触摸移动
【发布时间】:2013-12-28 18:29:59
【问题描述】:

大家好,我已经尝试解决这个问题一段时间了,我查看了许多论坛并试图了解他们试图通过使用 ActionScript 3 的代码来传达什么,但我仍然一无所获。我的主要目标是在舞台上有一个名为“mainPlayer”的角色现在我想设置触摸事件,以便当用户向上或左右拖动手指时,我希望 mainPlayer 跟随用户路径,或者如果用户触摸屏幕上的一个点并将手指保持在那里,mainPlayer 将被触摸吸引并移动到手指当前在屏幕上的点。

我见过很多实现了 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 函数中做什么,才能让我通过代码添加到舞台的对象跟随用户在屏幕上的触摸。

谁能带领我朝着正确的方向前进或给我任何建议?我真的很感激谢谢大家

【问题讨论】:

  • 如果我理解正确,您是否希望对象既遵循用户绘制的路径又到达用户触摸的点?
  • 是的,这正是我想要完成的。因此,只要您在屏幕上拖动手指,对象就会跟随它,并说您将手指移出屏幕,对象就会停止。你知道我应该做什么或如何解决这个问题吗?

标签: android actionscript-3 multi-touch touch-event


【解决方案1】:

是的,我碰巧知道如何做到这一点,只是不确定我是否完全掌握了您想要实现的目标。

注意,我不会考虑 speedmaxSpeed 变量来移动播放器。它超出了这个范围,超出了我的头顶范围。不过,稍微上网搜索一下就能让你在这个主题上走得更远!

首先,为了使对象遵循用户绘制的路径,我们需要一种存储路径的方法。为此,我建议使用VectorPoint 作为其数据类型。在添加和删除元素时使用它既快速又容易,而不必担心它的长度。

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

private var _pathPoints : Vector.<Point>;
private var _isMoving : Boolean = false;

简单的蛋糕。现在是有趣的部分! 首先,我们需要将onTouchBegin 事件的范围从mainPlayer 更改为stage。如果我们不这样做,用户将无法触摸舞台上的抽象点并让玩家精灵移动到那里。只需更改为

mainPlayer.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin);

然后我们会处理用户何时移动他或她的手指。这里没有什么好玩的。 我们只是简单地将坐标存储在向量中,并存储用户是否按下屏幕的当前状态。

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 function mainPlayerControls () : void
{
    // Update player position and forces
    vx *= friction;
    vy *= friction;
    mainPlayer.x += vx;
    mainPlayer.y += vy;

    // Check if the player should be moving to a new point
    if( _isMoving )
    {
        // Get a reference to the current target coordinate
        var target : Point = _pathPoints[0];

        // Check if the player position has reached the current target point
        // We use a bounding box with dimensions equal to max speed to ensure
        // that the player doesn't move across the point, move back towards it
        // and start jojo-ing back and forth
        if(mainPlayer.x >= target.x - maxSpeed && mainPlayer.x <= target.x + maxSpeed &&
           mainPlayer.y >= target.y - maxSpeed && mainPlayer.y <= target.y)
        {
            // The player has reached its target
            //so we remove the first element of the vector
            _pathPoints.shift();
            // and update the target reference
            target = _pathPoints[0];
        }

        // Calculate velocities to the first element of the vector
        vx = mainPlayer.x - target.x;
        vy = mainPlayer.y - target.y;
    }
}

【讨论】:

  • 非常感谢您的详细回复。当我下班时,我会尝试在我的代码中实现它。但这似乎比我想象的要简单哈哈。如果我遇到任何问题,很棒的东西会告诉你。
  • 好吧,我还是有一些问题。首先,您说将 mainPlayer.addeventlistener 更改为 stage.addeventlistener 对吗?此外,似乎根本没有发生物体的运动。我触摸屏幕,什么都没有发生,甚至没有任何痕迹。我会试着弄清楚,但同时我只是想更新你,看看是否可能有一些错误。同时谢谢。
  • 哦,是的,我差点忘了 pathPoints.splice(0);需要两个参数,所以我不确定第一个参数应该是什么,因为它不是一个 for 循环,我不能只切片我以前做的“i”哈哈
  • 抱歉刚刚看到您的笔记无法移动播放器
  • 嗯,玩家应该在移动。您的课程realmEngine 是主课程,还是在某处实例化?我在想它是否对舞台有实际的参考。至于splice的第二个参数,可以使用Number.MAX_VALUE
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多