Скворец ios перетаскивает объект больше экрана и устанавливает границы
В Starling у меня очень большой MovieClip. Видеоклип на 800% шире экрана. Если я использую as3, я могу установить границу, по которой я могу перетащить большой MC. Таким образом, MC нельзя вытащить за пределы экрана (поэтому отображается пустой фон). Знаете ли вы, если это возможно сделать в скворец?
Псевдокод ниже
1. Add the mc to the stage
2. Add eventlistener for touchEvent on MC
3. Only drag the mc so its 0,0 coordinates are smaller than stage 0,0 coordinates
4. Only drag the mc so its widthX,widthY are within stageWidthX, stageWidthY
Надеюсь, это имеет смысл? Я просто хочу перетащить большой MC, чтобы он всегда был внутри области экрана.
Приветствия.
Ps: извините, что не включил пример, но я понятия не имею, как это сделать.
1 ответ
Вы можете сделать это, изучив TouchPhase TouchEvent, чтобы увидеть, куда перетаскивается палец, и затем обновить позицию X мувиклипа только в том случае, если новая позиция попадет в границы сцены.
Вот пример использования четырехугольника, но он будет таким же для мувиклипа:
package
{
import starling.core.Starling;
import starling.display.DisplayObject;
import starling.display.Quad;
import flash.geom.Point;
import starling.display.Sprite;
import starling.events.TouchEvent;
import starling.events.Touch
import starling.events.TouchPhase;
public class QuadDrag extends Sprite
{
private var _startXPos:int = 0; // start of each drag
public function QuadDrag()
{
super();
// create quad 8x stage size
var quad:Quad = new Quad(Starling.current.stage.stageWidth*8, Starling.current.stage.stageHeight, 0xffffff);
quad.setVertexColor(0, 0xff0000);
quad.setVertexColor(1, 0x0000ff);
quad.setVertexColor(2, 0xff0000);
quad.setVertexColor(3, 0x0000ff);
addChild(quad);
// center quad on stage
quad.x = Math.round(Starling.current.stage.stageWidth/2 - quad.width/2);
quad.addEventListener(TouchEvent.TOUCH, onQuadTouch);
}
private function onQuadTouch(e:TouchEvent):void
{
var currentXPos:int = 0;
var newXPos:int = 0;
var touch:Touch = e.getTouch(stage);
var target:DisplayObject = e.currentTarget as DisplayObject;
if (touch == null)
{
return;
}
var position:Point = touch.getLocation(stage);
if (touch.phase == TouchPhase.BEGAN )
{
// store start of drag x pos
_startXPos = target.globalToLocal(new Point(touch.globalX, touch.globalY)).x;
}
else
if (touch.phase == TouchPhase.MOVED )
{
// set limits for target x
var minX:int = -Math.round(target.width - Starling.current.stage.stageWidth);
var maxX:int = 0;
// calculate new x based on touch's global coordinates
currentXPos = target.globalToLocal(new Point(touch.globalX, touch.globalY)).x;
newXPos = target.x + currentXPos - _startXPos;
if (newXPos <= maxX && newXPos>=minX) // set target's x if it falls within limits
target.x=newXPos;
}
else
if (touch.phase == TouchPhase.ENDED )
{
// touch released
}
return;
}
}
}