Управление перетаскиваемыми объектами или Пазлы
Разработаем структуру файла
В слое «игровое поле» располагаются перетаскиваемые клипы и клипы, на которые они перетаскиваются. В слое сетка находится копия разлиновки объекта на части. Выше находится целое изображение, которое будет показано в случае перемещения клипов на свои места. Как всегда, есть слой для размещения программного кода.
Создадим дизайн и подготовим клипы к программированию.
Единственным элементом дизайна не являющийся клипом и не участвующий в программировании является сетка, подсказывающая пользователю форму частей.
В игре используются 4 символа:
· Клип с целым изображением, которое появится при выигрыше
Клипы, которые останутся неподвижными и являются целью для перетаскиваемых объектов.
Клипы, которые будут перетаскиваться на цель.
· Анимированный клип с сообщением о выигрыше
Очень важно дать правильно имена клипам, особенно клипам, которые являются целью и перетаскиваемым клипам, потому что в программном коде для этих клипов будем использовать динамические (изменяемые имена).
Обозначим основные позиции программного кода.
Программный код будет располагаться в первом кадре слоя «actions». При создании программного кода применялись технологии перетаскивания, обнаружения столкновения, а также слушателя.
import flash.filters.*;
import flash.geom.Point;
import flash.events.MouseEvent;
win_mc:MovieClip;
win_mc.visible = false;
//добавляем фильтр Объем при перетаскивании
var myBevel:BevelFilter = new BevelFilter();
//обнуляем счетчик
var county:Number = 0;
//указываем позицию клипа
var xPos:int;
var yPos:int;
//Создаем переменную логическим типом данных, или булев тип, или булевый тип — примитивный тип данных в информатике, принимающий два возможных значения, иногда называемых истиной и ложью.
var yellow:Boolean = false;
//массив перетаскиваемых клипов;
var yellowArr:Array = new Array(mc00,mc01,mc02,mc03,mc04,mc05,mc06,mc07,mc08,mc09,mc10,mc11,mc12,mc13,mc14,mc15);
//определяем первоначальную позицию
var tmpPoint:Point = new Point(0,0);
var rndIndex:uint;
for (var i:uint =0; i < yellowArr.length; i++)
{
yellowArr[i].addEventListener(MouseEvent.MOUSEDOWN, dragyellow);
yellowArr[i].addEventListener(MouseEvent.MOUSE_UUP, dropllow);
yellowArr[i].buttonMode = true;
yellowArr[i].filters = [myBevel];
// random arrange movies
rndIndex = Math.floor(yellowArr.length * Math.random());
//trace(rndIndex);
tmpPoint.x = MovieClip(yellowArr[rndIndex]).x;
tmpPoint.y = MovieClip(yellowArr[rndIndex]).y;
yellowArr[rndIndex].x = yellowArr[i].x;
yellowArr[rndIndex].y = yellowArr[i].y;
yellowArr[i].x = tmpPoint.x;
yellowArr[i].y = tmpPoint.y;
//перетаскивание клипов
function dragyellow(event:MouseEvent):void
{
winmc.visible = false;
this.addChild(event.currentTarget as DisplayObject);
event.currentTarget.startDrag(false);
xPos = event.currentTarget.x;
yPos = event.currentTarget.y;
}
//остановка перетаскивания клипов
function drop_yellow(event:MouseEvent):void
{
event.currentTarget.stopDrag();
var cel = getChildByName(event.currentTarget.name + "Target");
cel.alpha = 0;
if (event.currentTarget.hitTestObject(getChildByName(event.currentTarget.name + "Target")))
{
if (Math.abs(event.currentTarget.x - cel.x) < 20 && Math.abs(event.currentTarget.y - cel.y) < 20)
{
event.currentTarget.removeEventListener(MouseEvent.MOUSE_DOWN, drag_yellow);
event.currentTarget.x = cel.x;
event.currentTarget.y = cel.y;
event.currentTarget.filters = [];
trace(county);
event.currentTarget.mouseEnabled = false;
event.currentTarget.buttonMode = false;
county++;
if (county == yellowArr.length)
{
yellow = true;
}
if (yellow==true)
{
win_mc.visible = true;
addChildAt(win_mc, numChildren - 1);
}
}
}
}
}
//массив клипов, НА которые перетаскиваются
var greenArr:Array = new Array(mc00Target,mc01Target,mc02Target,mc03Target,mc04Target,mc05Target,mc06Target,mc07Target,mc08Target,mc09Target,mc10Target,mc11Target,mc12Target,mc13Target,mc14Target,mc15Target);
for (var j:uint =0; j < greenArr.length; j++)
{
greenArr[j].alpha=0;
}