嘿伙计们,所以我一直试图解决这个问题一段时间我已经在很多论坛上看了一下,并尝试用ActionScript 3来理解他们试图传达的代码,但我仍然一无所获。我的主要目标是在舞台上有一个名为“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函数中要做什么,以便我按照代码添加的对象跟随用户触摸屏幕。
任何人都可以带领我朝着正确的方向前进或给我任何建议吗?我非常感谢员工
答案 0 :(得分:1)
是的,我碰巧知道如何做到这一点,我只是不确定我是否完全掌握了你想要达到的目标。
注意我不会考虑移动播放器的speed
和maxSpeed
变量。它超出了这个范围,超出了我的脑海。然而,一点点的网络搜索会让你对这个主题有所了解!
首先,为了使对象遵循用户绘制的路径,我们需要一种存储路径的方法。为此,我建议使用Vector
作为其数据类型Point
。在添加和删除元素时,它可以快速轻松地工作,而不必担心其长度。
我们还需要一种方法来告诉玩家精灵应该移动与否,换句话说,用户是否按下屏幕上的手指。
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;
}
最后,对于更有趣的部分;主要游戏循环!或者&#34;魔术发生的地方&#34;。
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;
}
}