使用阵列将多个对象捕捉到多个位置
难以制作一个简单的游戏,涉及用彩色瓷砖覆盖网格。我已经使用Arrays来建立拖放功能,但无法找到方法使它们轻松捕捉到网格上的位置。我已经将网格中的位置制作成名为snapA1到snapJ10的影片剪辑,全部由10个字母组成的实例名称进行匹配,但这些剪辑已从阵列中移除,因为它们不需要移动。我一直存在的问题是,我使用的任何函数只能用于捕捉单个位置。基本上我只是寻找一个简短的手,让两个或更多的对象组相互对齐,最好不用暴力代码,我哄你不到,20,000个相同代码的实例。下面 是我的代码,到目前为止,只允许一个捕捉目标位置使用阵列将多个对象捕捉到多个位置
import flash.events.Event;
import flash.events.MouseEvent;
var greenArr:Array = new Array
(greenTablet1, greenTablet2, greenTablet3, greenTablet4, greenTablet5,
greenTablet6, greenTablet7, greenTablet8, greenTablet9, greenTablet10,
greenTablet11, greenTablet12, greenTablet13, greenTablet14, greenTablet15,
greenTablet16, greenTablet17, greenTablet18, greenTablet19, greenTablet20);
for (var i1:uint =0; i1 < greenArr.length; i1++) {
greenArr[i1].addEventListener(MouseEvent.MOUSE_DOWN, dragG);
greenArr[i1].addEventListener(MouseEvent.MOUSE_UP, dropG);
}
function dragG(event:MouseEvent):void {
event.currentTarget.startDrag();
}
function dropG(event:MouseEvent):void {
event.currentTarget.stopDrag();
}
stage.addEventListener(MouseEvent.MOUSE_UP, stopMotionG1);
function stopMotionG1(evt:MouseEvent):void {
snapInPlaceG1();
}
function snapInPlaceG1():void {
if (snapA1.hitTestObject(greenTablet1)) {
greenTablet1.x = snapA1.x;
greenTablet1.y = snapA1.y;
}}
容易。你需要的是停止使用标准拖动并设计一个自定义的拖动。然后,您可以使用相同大小的脚本来创建尽可能多的可拖动对象和多个捕捉点:
package
{
import flash.display.Sprite;
import flash.geom.Point;
import flash.events.Event;
import flash.events.MouseEvent;
// Main class.
public class Snap extends Sprite
{
private var Circus:Vector.<Sprite>;
private var Dots:Vector.<Point>;
public function Snap()
{
Dots = new Vector.<Point>;
Circus = new Vector.<Sprite>;
// Create snap points, put them on stage and keep their coordinates.
for (var i:int = 1; i * 100 < stage.stageWidth; i++)
{
for (var j:int = 1; j * 100 < stage.stageHeight; j++)
{
var aDot:Sprite = new Sprite;
var aPos:Point = new Point(i * 100, j * 100);
aDot.graphics.beginFill(0xFF0000, 0.3);
aDot.graphics.drawCircle(0, 0, 4);
aDot.x = aPos.x;
aDot.y = aPos.y;
addChild(aDot);
Dots.push(aPos);
}
}
var aCircas:int = 2 + 3 * Math.random();
// Add random number of draggable objects.
while (Circus.length < aCircas)
{
Circus.push(addCirca());
}
}
// This method adds a draggable circle of random radius, color, position.
private function addCirca():Sprite
{
var result:Sprite = new Sprite;
result.graphics.lineStyle(0, 0);
result.graphics.beginFill(0x1000000 * Math.random(), 0.5);
result.graphics.drawCircle(0, 0, 20 + 20 * Math.random());
result.x = stage.stageWidth * Math.random();
result.y = stage.stageHeight * Math.random();
addChild(result);
result.buttonMode = true;
result.useHandCursor = true;
result.addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
return result;
}
// *** DRAGGING AN ITEM ** //
// Snap radius.
private var toleRance:int = 20
// Mouse offset.
private var offx:Number = 0;
private var offy:Number = 0;
// Dragged object.
private var TheDrag:Sprite;
private function startDragging(e:MouseEvent):void
{
// Get the dragged object reference.
TheDrag = e.currentTarget as Sprite;
// Bring it to front.
setChildIndex(TheDrag, numChildren - 1);
// Record the mouse offset. If you comment the next 2 lines
// the object will just snap to mouse by its center.
offx = TheDrag.x - mouseX;
offy = TheDrag.y - mouseY;
// Watch the object position every frame.
addEventListener(Event.ENTER_FRAME, onFrame);
// Subscribe for certain events that mean the end of dragging.
stage.addEventListener(Event.MOUSE_LEAVE, stopDragging);
stage.addEventListener(MouseEvent.MOUSE_UP, stopDragging);
}
private function onFrame(e:Event):void
{
// Get new object (x,y) according to the mouse position.
var aPos:Point = new Point;
aPos.x = mouseX + offx;
aPos.y = mouseY + offy;
// Browse through the list of snap points.
for (var i:int = 0; i < Dots.length; i++)
{
// Snap to a point within tolerance pixels radius.
if (Point.distance(aPos, Dots[i]) < toleRance)
{
aPos = Dots[i];
break;
}
// If there are no points withing the given radius,
// then the object will use mouse positioning.
}
TheDrag.x = aPos.x;
TheDrag.y = aPos.y;
}
private function stopDragging(e:Event):void
{
TheDrag = null;
// Stop monitoring.
removeEventListener(Event.ENTER_FRAME, onFrame);
// Stop waiting for events to cancel dragging.
stage.removeEventListener(Event.MOUSE_LEAVE, stopDragging);
stage.removeEventListener(MouseEvent.MOUSE_UP, stopDragging);
}
}
}
谢谢,最终做了类似 –
这样的事情,有没有办法让它成为这样,只有一个阵列中的一个片段可以堆叠到另一个阵列中的片段上 –
@LeonardRodriguez不太确定你的意思。你要求多对多 - 你有多对多。一对多是一对多= 1对多的情况。 – Organis
因此要弄清楚,每个greenTableX对应1个snapAX对象?您只能使用代码的1个实例执行此操作。同一个库对象都是你的'greenTables'实例吗? – BadFeelingAboutThis
你能描述一下你的网格吗? (是否可见,需要在FlashPro中创建多少水平/垂直线,还是可以在代码中创建?) - 最有可能 - 除非您的网格和对象与某些背景图形相对应,并且不仅仅是数学定位你可以做所有这些只需几行代码。 – BadFeelingAboutThis