December 23, 2020

Управление перетаскиваемыми объектами или Пазлы

Разработаем структуру файла

В слое «игровое поле» располагаются перетаскиваемые клипы и клипы, на которые они перетаскиваются. В слое сетка находится копия разлиновки объекта на части. Выше находится целое изображение, которое будет показано в случае перемещения клипов на свои места. Как всегда, есть слой для размещения программного кода.

Создадим дизайн и подготовим клипы к программированию.

Единственным элементом дизайна не являющийся клипом и не участвующий в программировании является сетка, подсказывающая пользователю форму частей.

В игре используются 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;
}