PDA

Просмотр полной версии : Проблемы с программированием "инвентаря"


vivado
24.05.2011, 18:41
Всем привет,
Прошу гуру о помощи, уже третий день никак преодолеть не могу одну весчь.
В общем есть несколько предметов которые можно будет помещать в любую из ячеек т.н. инвентаря (типа как в РПГ) Все перемещается прекрасно, только вот никак не могу записать условие "если ячейка занята, то предмет в нее не добавляется", чтоб нельзя было класть в одну ячейку по два и более предмета.
Вот код...
Первый кадр:

//Обозначаю что ячейки 1,2,3,4,5,6 - пустые
Empty1="0";
Empty2="0";
Empty3="0";
Empty4="0";
Empty5="0";
Empty6="0";


Второй кадр:
На нем находятся
Предметы (у меня портфели) - 6 мувиков с линками Portfel1, Portfel2...Portfel6
для перетаскивания.
На каждый мувик повешен код

on (press) { //Переход к функции для начала перетаскивания
toStart(Portfel1);
}
on (release) { //Переход к функции для окончания перетаскивания
toStop(Portfel1);
}


На том же кадре находятся Мувики-ячейки с линками box1,box2,box3...box6 в которые будут вкладываться портфели.

На сам кадр вешаю код:

stop(); //Остановка кадра

function toStart(NameP){ //Начало переноса предмета
startDrag (NameP);
if (box1.hitTest(_root._xmouse,_root._ymouse,false)){ Empty1="0";}; //Освобождаем ячейку 1 (если предмет в ней)
if (box2.hitTest(_root._xmouse,_root._ymouse,false)){ Empty2="0";}; //Освобождаем ячейку 2 (если предмет в ней)
if (box3.hitTest(_root._xmouse,_root._ymouse,false)){ Empty3="0";}; //Освобождаем ячейку 3 (если предмет в ней)
if (box4.hitTest(_root._xmouse,_root._ymouse,false)){ Empty4="0";}; //Освобождаем ячейку 4 (если предмет в ней)
if (box5.hitTest(_root._xmouse,_root._ymouse,false)){ Empty5="0";}; //Освобождаем ячейку 5 (если предмет в ней)
if (box6.hitTest(_root._xmouse,_root._ymouse,false)){ Empty6="0";}; //Освобождаем ячейку 6 (если предмет в ней)
}

function toStop(NamePortfel){ //При отпускании предмета
if (box1.hitTest(_root._xmouse,_root._ymouse,false)){ //Проверка находится ли портфель над ячейкой 1 (box1)
NameP=NamePortfel;
ItemInBoxX=259; ItemInBoxY=180; //Координаты предмета в ячейке
//Проверяем пустая ли ячейка 1 и если пустая то переходим к функции SelectBox
if (Empty1="0"){ Empty1="1"; SelectBox(NameP,ItemInBoxX,ItemInBoxY,"box1",Empty1)}
//если ячейка не пустая то переходим к функции GoItemToStart
else if (Empty1="1"){ GoItemToStart(NameP,"box1")}
//вывод данных для отладки при Empty=1 ячейка заполнена при Empty=0 - пуста
infoBox=" box1:"+Empty1+" box2:"+Empty2+" box3:"+Empty3; trace (infoBox);
infoBox2=" box4:"+Empty4+" box5:"+Empty5+" box6:"+Empty6; trace (infoBox2);
};

if (box2.hitTest(_root._xmouse,_root._ymouse,false)){
NameP=NamePortfel;
ItemInBoxX=332; ItemInBoxY=180;
if (Empty2="0"){ Empty2="1"; SelectBox(NameP,ItemInBoxX,ItemInBoxY,"box2",Empty2)}
else if (Empty2="1"){ GoItemToStart(NameP,"box2")}

infoBox=" box1:"+Empty1+" box2:"+Empty2+" box3:"+Empty3; trace (infoBox);
infoBox2=" box4:"+Empty4+" box5:"+Empty5+" box6:"+Empty6; trace (infoBox2);
};

if (box3.hitTest(_root._xmouse,_root._ymouse,false)){
NameP=NamePortfel;
ItemInBoxX=405; ItemInBoxY=180;
if (Empty3="0"){ Empty3="1"; SelectBox(NameP,ItemInBoxX,ItemInBoxY,"box3",Empty3)}
else if (Empty3="1"){ GoItemToStart(NameP,"box3")}
infoBox=" box1:"+Empty1+" box2:"+Empty2+" box3:"+Empty3; trace (infoBox);
infoBox2=" box4:"+Empty4+" box5:"+Empty5+" box6:"+Empty6; trace (infoBox2);
};

if (box4.hitTest(_root._xmouse,_root._ymouse,false)){
NameP=NamePortfel;
ItemInBoxX=259; ItemInBoxY=253,5;
if (Empty4="0"){ Empty4="1"; SelectBox(NameP,ItemInBoxX,ItemInBoxY,"box4",Empty4)}
else if (Empty4="1"){ GoItemToStart(NameP,"box4")}
infoBox=" box1:"+Empty1+" box2:"+Empty2+" box3:"+Empty3; trace (infoBox);
infoBox2=" box4:"+Empty4+" box5:"+Empty5+" box6:"+Empty6; trace (infoBox2);
};

if (box5.hitTest(_root._xmouse,_root._ymouse,false)){
NameP=NamePortfel;
ItemInBoxX=332; ItemInBoxY=253,5;
if (Empty5="0"){ Empty5="1"; SelectBox(NameP,ItemInBoxX,ItemInBoxY,"box5",Empty5)}
else if (Empty5="1"){ GoItemToStart(NameP,"box5")}
infoBox=" box1:"+Empty1+" box2:"+Empty2+" box3:"+Empty3; trace (infoBox);
infoBox2=" box4:"+Empty4+" box5:"+Empty5+" box6:"+Empty6; trace (infoBox2);
};

if (box6.hitTest(_root._xmouse,_root._ymouse,false)){
NameP=NamePortfel;
ItemInBoxX=405; ItemInBoxY=253,5;
if (Empty6="0"){ Empty6="1"; SelectBox(NameP,ItemInBoxX,ItemInBoxY,"box6",Empty6)}
else if (Empty6="1"){ GoItemToStart(NameP,"box6")}
infoBox=" box1:"+Empty1+" box2:"+Empty2+" box3:"+Empty3; trace (infoBox);
infoBox2=" box4:"+Empty4+" box5:"+Empty5+" box6:"+Empty6; trace (infoBox2);
};
};

function SelectBox (Portfel,ItemXBox,ItemYBox,Name_Box,EmptyBox){ //Перенос портфеля в нужную ячейку
Portfel._x=ItemXBox;
Portfel._y=ItemYBox;
//info="координаты: x "+ItemXBox+ " y "+ItemYBox+" Портфель: "+NameP;
info="Портфель добавлен в ячейку "+Name_Box;
trace (info);
stopDrag ();
}

function GoItemToStart(NamePortfel,NameBox){ //Если ячейка занята то переносим портфель в координаты 0,0
ItemX=0;
ItemY=0;
infoempty="Ячейка "+NameBox+" занятa";
trace (infoempty);
NamePortfel._x=ItemX;
NamePortfel._y=ItemY;
//stopDrag ();
}


Скорее всего много лишнего написал но по другому пока до меня не дошло как сделать, наверняка можно все упростить.

Прошу помощи ибо я сам практически спекся :umnik2:
(Желательно на AS 2.0 ибо я только еще учусь)

вот ссылка на исходник: itemmm.rar (http://modxtest.1gb.ru/test/itemmm.rar)

dark256
24.05.2011, 21:08
Аммм..... упростите свой код для начала.

for ( var i=1; i<6; i++)
{
this["box"+i].hitTest(_root._xmouse,_root._ymouse,false) // и так далее

if (this["box"+i].hitTest(_root._xmouse,_root._ymouse,false))
{
}
}

Вместо this - можете писать имя клипа или контейнера где ваши боксы сложены :)

Добавлено через 2 минуты
Empty1="0";
Empty2="0";
Empty3="0";
Empty4="0";
Empty5="0";
Empty6="0";

перепишИте так:

var Empty:Array = [null,0,0,0,0,0,0]

Обращение к эл-ту массива - Empty[ i ]

mooncar
24.05.2011, 21:45
if (Empty3="1") - это вы тут приравниваете, а не сравниваете.
Нужно if (Empty3 == "1")

vivado
25.05.2011, 15:43
Спасибо огромное всем откликнувшимся. Вроде упростил код, но опять что то не вяжется, а конкретнее не работает корректно отпускание - наверное, что то с условиями намудрил или цикл как то не так прописал, если не сложно гляньте еще разок пожалуста, исходник прилагаю.

stop(); //Остановка кадра

function toStart(NameP){ //Начинаем перенос предмета
for (var i=1; i<6; i++){
if (this["box"+i].hitTest(_root._xmouse,_root._ymouse,false)){
if (this["Empty"+i]="1"){ this["Empty"+i]="0" } //Освобождаем ячейку(если предмет в ней)
}
}
info="box1:"+Empty1+" box2:"+Empty2+" box3:"+Empty3; trace (info);
info2="box4:"+Empty4+" box5:"+Empty5+" box6:"+Empty6; trace (info2);
startDrag (NameP);
}

function toStop(NamePortfel){ //Отпускаем переносимый предмет
for ( var i=1; i<6; i++){
//Проверка находится ли портфель над одной из ячеек
if (this["box"+i].hitTest(_root._xmouse,_root._ymouse,false)){
//если находится то переходим к функции добавления портфеля в ячейку
if (this["Empty"+i]=="0"){ this["Empty"+i]="1"; AddToBox(NamePortfel,this["box"+i])
info="box1:"+Empty1+" box2:"+Empty2+" box3:"+Empty3; trace (info);
info2="box4:"+Empty4+" box5:"+Empty5+" box6:"+Empty6; trace (info2);
startDrag (NameP);
}
}
//иначе обращаемся к функции возвращающей портфель на его начальное положение
else if (this["Empty"+i]==1){ GoToStart(NameP,this["box"+i])}
}
}

function AddToBox (Portfel,Name_Box){ //Перенос портфеля в нужную ячейку

if (Name_Box=="box1"){ ItemInBoxX=259; ItemInBoxY=180; } //Координаты портфеля в 1 ячейке
if (Name_Box=="box2"){ ItemInBoxX=332; ItemInBoxY=180; } //Координаты портфеля в 2 ячейке
if (Name_Box=="box3"){ ItemInBoxX=405; ItemInBoxY=180; } //Координаты портфеля в 3 ячейке
if (Name_Box=="box4"){ ItemInBoxX=259; ItemInBoxY=253,5; } //Координаты портфеля в 4 ячейке
if (Name_Box=="box5"){ ItemInBoxX=332; ItemInBoxY=253,5; } //Координаты портфеля в 5 ячейке
if (Name_Box=="box6"){ ItemInBoxX=405; ItemInBoxY=253,5; } //Координаты портфеля в 6 ячейке

Portfel._x=ItemInBoxX;
Portfel._y=ItemInBoxY;

info="Портфель "+Portfel+" добавлен в ячейку "+Name_Box; trace (info);
stopDrag ();
}

function GoToStart(NamePortfel,NameBox){ //Если ячейка занята то переносим портфель в его начальные координаты ItemX=0;

//Начальные координаты портфелей - задам потом
if (NamePortfel=="Portfel1"){ ItemX=0; ItemY=0; } //Начальные координаты портфеля 1
if (NamePortfel=="Portfel2"){ ItemX=0; ItemY=0; } //Начальные координаты портфеля 2
if (NamePortfel=="Portfel3"){ ItemX=0; ItemY=0; } //Начальные координаты портфеля 3
if (NamePortfel=="Portfel4"){ ItemX=0; ItemY=0; } //Начальные координаты портфеля 4
if (NamePortfel=="Portfel5"){ ItemX=0; ItemY=0; } //Начальные координаты портфеля 5
if (NamePortfel=="Portfel6"){ ItemX=0; ItemY=0; } //Начальные координаты портфеля 6

NamePortfel._x=ItemX;
NamePortfel._y=ItemY;

infoempty="Ячейка "+NameBox+" занятa"; trace (infoempty);
stopDrag ();
}

dark256
25.05.2011, 16:21
if (this["Empty"+i]="1")

Это элемент массива, а не клип.
Надо писать так:

if ( Empty[i] == "1" )

И вам уже написали - значок "=" это ПРИСВАИВАНИЕ переменной значения, а если вы СРАВНИВАЕТЕ, то "=" - должно быть ДВОЙНОЕ.
То есть "=="

vivado
25.05.2011, 17:17
Подправил как ты сказал, но, что то не получается... :(
И при трассировке Empty1...Empty6 теперь не отображаются...

stop(); //Остановка кадра

function toStart(NameP){ //Начинаем перенос предмета
for (var i=1; i<6; i++){
if (this["box"+i].hitTest(_root._xmouse,_root._ymouse,false)){
if (Empty[i]=="1"){ Empty[i]="0"; } //Освобождаем ячейку(если предмет в ней)
}
}
info="box1:"+Empty1+" box2:"+Empty2+" box3:"+Empty3; trace (info);
info2="box4:"+Empty4+" box5:"+Empty5+" box6:"+Empty6; trace (info2);
startDrag (NameP);
}

function toStop(NamePortfel){ //Отпускаем переносимый предмет
for ( var i=1; i<6; i++){
//Проверка находится ли портфель над одной из ячеек
if (this["box"+i].hitTest(_root._xmouse,_root._ymouse,false)){
//если находится то переходим к функции добавления портфеля в ячейку
if (Empty[i]=="0"){ Empty[i]="1"; AddToBox(NamePortfel,this["box"+i])
info="box1:"+Empty1+" box2:"+Empty2+" box3:"+Empty3; trace (info);
info2="box4:"+Empty4+" box5:"+Empty5+" box6:"+Empty6; trace (info2);
startDrag (NameP);
}
}
//иначе обращаемся к функции возвращающей портфель на его начальное положение
else if (Empty[i]=="1"){ GoToStart(NameP,this["box"+i])}
}
}

function AddToBox (Portfel,Name_Box){ //Перенос портфеля в нужную ячейку

if (Name_Box=="box1"){ ItemInBoxX=259; ItemInBoxY=180; } //Координаты портфеля в 1 ячейке
if (Name_Box=="box2"){ ItemInBoxX=332; ItemInBoxY=180; } //Координаты портфеля в 2 ячейке
if (Name_Box=="box3"){ ItemInBoxX=405; ItemInBoxY=180; } //Координаты портфеля в 3 ячейке
if (Name_Box=="box4"){ ItemInBoxX=259; ItemInBoxY=253,5; } //Координаты портфеля в 4 ячейке
if (Name_Box=="box5"){ ItemInBoxX=332; ItemInBoxY=253,5; } //Координаты портфеля в 5 ячейке
if (Name_Box=="box6"){ ItemInBoxX=405; ItemInBoxY=253,5; } //Координаты портфеля в 6 ячейке

Portfel._x=ItemInBoxX;
Portfel._y=ItemInBoxY;

info="Портфель "+Portfel+" добавлен в ячейку "+Name_Box; trace (info);
stopDrag ();
}

function GoToStart(NamePortfel,NameBox){ //Если ячейка занята то переносим портфель в его начальные координаты ItemX=0;

//Начальные координаты портфелей - задам потом
if (NamePortfel=="Portfel1"){ ItemX=0; ItemY=0; } //Начальные координаты портфеля 1
if (NamePortfel=="Portfel2"){ ItemX=0; ItemY=0; } //Начальные координаты портфеля 2
if (NamePortfel=="Portfel3"){ ItemX=0; ItemY=0; } //Начальные координаты портфеля 3
if (NamePortfel=="Portfel4"){ ItemX=0; ItemY=0; } //Начальные координаты портфеля 4
if (NamePortfel=="Portfel5"){ ItemX=0; ItemY=0; } //Начальные координаты портфеля 5
if (NamePortfel=="Portfel6"){ ItemX=0; ItemY=0; } //Начальные координаты портфеля 6

NamePortfel._x=ItemX;
NamePortfel._y=ItemY;

infoempty="Ячейка "+NameBox+" занятa"; trace (infoempty);
stopDrag ();
}

dark256
25.05.2011, 18:50
Empty1 - у вас более нет! Есть Empty[1]

мой_клип.stopDrag (); - так это пишется.

dark256
25.05.2011, 19:36
Вот рабочий исходник. 100 евро.
Чтобы работало и ползало скачайте и поставьте себе пакет http://www.greensock.com/tweenlite/

vivado
26.05.2011, 16:45
Спасибо за исходник, но зачем все так усложнять+ еще и ЯвуСкрипт подключать, ведь наверняка можно обойтись одним AS. Вернее я знаю, что можно, но пока не догнал как ))) Помогайте братцы...
Посмотрите код плиз...

stop(); //Остановка кадра

function toStart(NameP){ //Функция переноса предмета
startDrag(NameP); //Включаем перенос предмета
for (var i=1; i<6; i++){
//Проверяем находится ли предмет над ячейкой
if (this["box"+i].hitTest(_root._xmouse,_root._ymouse,false)){
if (Empty[i]=="1"){ Empty[i]="0"; } //Присваиваем ячейке статус "свободна" (Empty[i]=0)(если предмет забираем из нее)
}
}
}

function toStop(NameP2){ //Отпускаем переносимый предмет
for ( var a=1; a<6; a++){
//Проверка находится ли предмет над одной из ячеек
if (this["box"+a].hitTest(_root._xmouse,_root._ymouse,false)){
//если находится то переходим к функции добавления предмета в ячейку
if (Empty[a]=="0"){ Empty[a]="1"; AddToBox(NameP2,["box"+a])}
//иначе обращаемся к функции возвращающей предмет на его начальное положение
else if (Empty[a]=="1"){ GoToStart(NameP2,["box"+a])}
}
/*-------------------------------------------------------------------------------*/
//Вот тут не могу догнать как сделать, мне нужно чтобы предмет при отпускании вне ячейки
//обращался к функции, это условие полюбас выполняется (наверное из-за того что находится в цикле
//если предмет не над ячейкой то переносим его в начальное положение
else { GoToStart(NameP2,["box"+a])}
/*-------------------------------------------------------------------------------*/
}
}

function AddToBox (NameP3,NameBox){ //Перенос предмета в нужную ячейку
//Координаты предметов в ячейках
if (NameBox=="box1"){ var ItemInBoxX:Number=259; ItemInBoxY=180; } //Координаты предмета в 1 ячейке
...
else if (NameBox=="box6"){ ItemInBoxX=405; ItemInBoxY=253; } //Координаты предмета в 6 ячейке

/*-------------------------------------------------------------------------------*/
//Почемуто величины ItemInBoxX и ItemInBoxX не задаются или задаются как то неправильно,
//пробовал выводить их через Number(ItemInBoxX) и задавать в виде
//var ItemInBoxX:Number=259 один фиг не работает :(
//Помещаем предмет в ячейку
NameP3._x=ItemInBoxX;
NameP3._y=ItemInBoxY;
/*-------------------------------------------------------------------------------*/

info="портфель "+NameP3+" добавлен в:"+NameBox+" Х="+ItemInBoxX+" Y="+ItemInBoxY; trace (info);
stopDrag();
}

function GoToStart(NameP4,NameBox2){
//Начальные координаты предметов - задам потом
NameP4._x=0;
NameP4._y=0;

if (NameP4=="Portfel1"){ ItemX=0; ItemY=0; } //Начальные координаты 1 предмета
...
else if (NameP4=="Portfel6"){ ItemX=0; ItemY=0; } //Начальные координаты 6 предмета

//Помещаем предмет в его начальные координаты
NameP4._x=ItemX;
NameP4._y=ItemY;

info2="Ячейка "+NameBox2+" занятa"+" Возвращаем "+NameP4+" в Х="+ItemX+" Y="+ItemY; trace (info2);
stopDrag();
}

dark256
26.05.2011, 17:20
Усложнять? Да там проще некуда. Причем ни о какой ЯВЕ там вообще ни слова. Это флэшовый пак.

vivado
27.05.2011, 18:08
Ну даж не знаю по поводу флешпака.
Вот берем и убираем файлик "AC_RunActiveContent.js" както без него ролик не работает ))) если расширение JS, это не ЯваСкрипт и надпись в приложенном HTML, гласящая "<script language="javascript">" ни о чем не говорит...

А без явы в fla исходнике простейший Драг&Дроп, а все остальное в файле AC_RunActiveContent.js

Может ты мне не то послал )))

mooncar
27.05.2011, 18:10
AC_RunActiveContent.js нужен только для публикации ролика, к флешке непосредственного отношения не имеет.

dark256
27.05.2011, 22:52
SWF дабл кликайте, а не HTML.....
Вам дали РАБОЧИЙ и ГОТОВЫЙ исходник, который я не поленился сесть и написать.
И вы теперь мне доказываете какие-то абстрактные тезисы, ссылаясь на то, что вообще в программировании мягко говоря только начали.

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

vivado
30.05.2011, 15:32
Я извиняюсь, если что не так...
Но я просил помочь мне с моим примером. Я думаю его легче было подправить, если уж вы разбираетесь, чем новый код писать. Спасибо, что сели и написали новый исходник, я это действительно ценю. Если вас не затруднит пожалуйста подправьте мой код в прилагаемом исходнике, мне так легче будет разобраться.

dark256
30.05.2011, 15:56
Ваш код подправлять - изначально не имеет смысла. Там все плохо и неверно.
Опубликованный исходник это и есть - ВАШ исправленный код :)

vivado
30.05.2011, 17:32
Просто хотелось на более простом примере так сказать, чтоб я понимал, что значит каждая строчка, вот у себя в коде я понимаю, а в вашем надо снова разбираться.
И почему у меня все изначально неверно? Получается я зря упрощал и следовал вашим советам? Ладно значит буду разбираться сам :(

dark256
30.05.2011, 17:49
Получается, что так ;)