Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Проблемы с программированием "инвентаря" (http://www.flasher.ru/forum/showthread.php?t=156610)

vivado 24.05.2011 18:41

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

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

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

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

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

На сам кадр вешаю код:
Код AS1/AS2:

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

dark256 24.05.2011 21:08

Аммм..... упростите свой код для начала.

Код AS1/AS2:

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

Код AS1/AS2:

if (Empty3="1")

- это вы тут приравниваете, а не сравниваете.
Нужно
Код AS1/AS2:

 if (Empty3 == "1")


vivado 25.05.2011 15:43

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

Код AS1/AS2:

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 теперь не отображаются...
Код AS1/AS2:

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

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

vivado 26.05.2011 16:45

Это снова я...
 
Вложений: 1
Спасибо за исходник, но зачем все так усложнять+ еще и ЯвуСкрипт подключать, ведь наверняка можно обойтись одним AS. Вернее я знаю, что можно, но пока не догнал как ))) Помогайте братцы...
Посмотрите код плиз...
Код AS1/AS2:

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

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


Часовой пояс GMT +4, время: 16:28.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.