Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   как делать удаление нескольких объектов одновременно (http://www.flasher.ru/forum/showthread.php?t=208594)

delphic 02.08.2014 19:42

удаление нескольких объектов одновременно с экрана
 
Здравствуйте, логика в игре следующая
1)Герой поднимает предметы в туре,в результате они попадают в некий массив текстовыми значениями (проверял через trace,нормально все), хоть по длине массива 2шт, хоть названия.
2)стоит уйти и зайти заново в эту комнату, удаляется только один из предметов
ниже просто пример
Код AS3:

                        if(game== "тест")
                        {
                        for(var i:Number = 0;i<excess.length;i++)
                        {
                          if(excess[i] == "предмет1")
                          {
                          //удаляем предмет 1
                          }
                          if(excess[i] == "предмет2" )
                          {
                            //удаляем предмет 2
                          }
                        }
                    }

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

                if(perem1 == "предмет1")
                          {
                          //удаляем предмет 1
                          }
                          if(perem2 == "предмет2" )
                          {
                            //удаляем предмет 2
                          }

то все нормально, но это сколько нужно переменных, если допустим в туре туча предметов, хотя я планирую пока 3 -6 предметов от силы делать, все равно как то топорно делать каждому переменную, может кто поделится мыслями как можно поступить, буду признателен примерам

caseyryan 02.08.2014 20:38

Компилятор тут ни при чем. Все это происходит не во время компиляции, а во время работы приложения.
Отсюда можно сделать вывод, что у вас путаница понятий, поэтому хотелось бы знать, что вы имеете в виду под удалением предмета?
В этих примерах нет удаления

nubideus 02.08.2014 20:43

Код AS3:

if(game == "тест")
{
        for(var i:uint = 0; i < excess.length; i++)
        {
                switch(excess[i]){
                        case "предмет1": /*удаляешь*/; i--; break;
                        case "предмет2": /*удаляешь*/; i--; break;
                }
        }
}

т.е. ошибка в том, что ты при перечислении пропускаешь некоторые элементы, после удаления. если удаляется только последний элемент, то пропусков не будет.
просто делаешь i-- до новой итерации.

плюс константы "предмет1" и "предмет2" записываешь в массив:
Код AS3:

var items:Vector.<String> = new <String>["предмет1", "предмет2"];
 
if(game == "тест")
{
        for(var i:uint = 0; i < excess.length; i++)
        {
                if(items.indexOf(excess[i]) !== -1)
                {
                        excess.splice(i, 1);
                        i--;
                }
        }
}

и получается красота

как я понял items - то, что герой уже поднял, а excess - то, что нужно поднять

caseyryan 02.08.2014 21:27

nubideus, да у него там похоже не в массиве дело. Как я понял в массив добавляются те предметы, которые нужно с дисплей листа снести, а удаляется потом только один

delphic 02.08.2014 21:36

Цитата:

Сообщение от caseyryan (Сообщение 1170028)
nubideus, да у него там похоже не в массиве дело. Как я понял в массив добавляются те предметы, которые нужно с дисплей листа снести, а удаляется потом только один

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

sospamom 03.08.2014 00:11

Как и nubideus думаю дело в том, что excess.length меняется когда ты удаляешь элемент из массива, поэтому цикл for не проходит все элементы.

expl 03.08.2014 00:15

надо идти задом наперёд, иначе при удалении будут проскакивать следующие индексы
(можно конечно делать i-- при удалении, но это менее гуманоидно)
Код AS3:

                        for(var i:Number = excess.length-1;i >= 0;i--)
                        {
                          if(excess[i] == "предмет1")
                          {
                          //удаляем предмет 1
                          }
                          if(excess[i] == "предмет2" )
                          {
                            //удаляем предмет 2
                          }
                        }

Можно использовать оператор "downto" :), но когда я так делаю коллеги ругаются, хотя вроде трюк старый, все должны были привыкнуть, но нет :(
Код AS3:

for(var i:Number = excess.length; i --> 0;)


delphic 03.08.2014 08:58

Цитата:

Сообщение от sospamom (Сообщение 1170037)
Как и nubideus думаю дело в том, что excess.length меняется когда ты удаляешь элемент из массива, поэтому цикл for не проходит все элементы.

ну как бы у меня нет
Код AS3:

excess.splice(i, 1);

я просто в теме неправильно выразился, у меня вообще нет удаление, я просто убираю элемент с экрана

sospamom 03.08.2014 09:42

Нужно больше информации. Вот этот пример работает.

Код AS3:

package 
{
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.DisplayObject;
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Main extends Sprite
        {
                public function Main():void
                {
                        var excess:Array = ["предмет1", "предмет2"];
 
                        var apple:Bitmap = new Bitmap(new BitmapData(100, 100, false, 0xff0000));
                        var orange:Bitmap = new Bitmap(new BitmapData(100, 100, false, 0x00ff00));
                        var banana:Bitmap = new Bitmap(new BitmapData(100, 100, false, 0x0000ff));
 
                        addChild(apple);
                        addChild(orange);
                        addChild(banana);
 
                        for (var i:Number = 0; i < excess.length; i++)
                        {
                                if (excess[i] == "предмет1")
                                {
                                        removeChild(orange);
                                }
                                if (excess[i] == "предмет2" )
                                {
                                        removeChild(banana);
                                }
                        }
                }
        }
}


delphic 03.08.2014 15:44

Цитата:

Сообщение от sospamom (Сообщение 1170052)
Нужно больше информации. Вот этот пример работает.

это сработает как и мой код, если пройти героем,но стоит вернутся в тур где это брали, убирается тока один из предметов, а должны убираться два
вообщем нужно сделать так - собираем героем предметы, выходим в другой тур, возвращаемся в тур где подобрали предметы и их не должно уже там быть, да взять хотя бы пример марио, вы собираете копейки, а когда вы ворачиваетесь назад их уже нет, и это правильно,ведь вы уже их собрали.Да по факту, когда мы трогаем героем предмет он убирается, массив срабатывает, но стоит вам вернуться уберется тока один предмет


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

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