Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 02.08.2014, 19:42
delphic вне форума Посмотреть профиль Отправить личное сообщение для delphic Найти все сообщения от delphic
  № 1  
Ответить с цитированием
delphic

Регистрация: Apr 2014
Сообщений: 215
По умолчанию удаление нескольких объектов одновременно с экрана

Здравствуйте, логика в игре следующая
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 предметов от силы делать, все равно как то топорно делать каждому переменную, может кто поделится мыслями как можно поступить, буду признателен примерам


Последний раз редактировалось delphic; 03.08.2014 в 00:00.
Старый 02.08.2014, 20:38
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Компилятор тут ни при чем. Все это происходит не во время компиляции, а во время работы приложения.
Отсюда можно сделать вывод, что у вас путаница понятий, поэтому хотелось бы знать, что вы имеете в виду под удалением предмета?
В этих примерах нет удаления
__________________
Ко мне можно и нужно обращаться на ты)

Старый 02.08.2014, 20:43
nubideus вне форума Посмотреть профиль Отправить личное сообщение для nubideus Найти все сообщения от nubideus
  № 3  
Ответить с цитированием
nubideus

Регистрация: Jan 2013
Сообщений: 322
Код 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 - то, что нужно поднять


Последний раз редактировалось nubideus; 02.08.2014 в 21:03.
Старый 02.08.2014, 21:27
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 4  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
nubideus, да у него там похоже не в массиве дело. Как я понял в массив добавляются те предметы, которые нужно с дисплей листа снести, а удаляется потом только один
__________________
Ко мне можно и нужно обращаться на ты)

Старый 02.08.2014, 21:36
delphic вне форума Посмотреть профиль Отправить личное сообщение для delphic Найти все сообщения от delphic
  № 5  
Ответить с цитированием
delphic

Регистрация: Apr 2014
Сообщений: 215
Цитата:
Сообщение от caseyryan Посмотреть сообщение
nubideus, да у него там похоже не в массиве дело. Как я понял в массив добавляются те предметы, которые нужно с дисплей листа снести, а удаляется потом только один
да,совершенно верно, удаляю с экрана,если например герой поднял предмет он идет в массив, а потом в условии если тур такой то, если в массиве есть предмет, убираем с экрана, а убирается тока один. Извиняюсь что не уточнил откуда удалить

Старый 03.08.2014, 00:11
sospamom вне форума Посмотреть профиль Отправить личное сообщение для sospamom Найти все сообщения от sospamom
  № 6  
Ответить с цитированием
sospamom

Регистрация: Jun 2008
Сообщений: 126
Как и nubideus думаю дело в том, что excess.length меняется когда ты удаляешь элемент из массива, поэтому цикл for не проходит все элементы.

Старый 03.08.2014, 00:15
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 7  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
надо идти задом наперёд, иначе при удалении будут проскакивать следующие индексы
(можно конечно делать 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;)

Старый 03.08.2014, 08:58
delphic вне форума Посмотреть профиль Отправить личное сообщение для delphic Найти все сообщения от delphic
  № 8  
Ответить с цитированием
delphic

Регистрация: Apr 2014
Сообщений: 215
Цитата:
Сообщение от sospamom Посмотреть сообщение
Как и nubideus думаю дело в том, что excess.length меняется когда ты удаляешь элемент из массива, поэтому цикл for не проходит все элементы.
ну как бы у меня нет
Код AS3:
excess.splice(i, 1);
я просто в теме неправильно выразился, у меня вообще нет удаление, я просто убираю элемент с экрана

Старый 03.08.2014, 09:42
sospamom вне форума Посмотреть профиль Отправить личное сообщение для sospamom Найти все сообщения от sospamom
  № 9  
Ответить с цитированием
sospamom

Регистрация: Jun 2008
Сообщений: 126
Нужно больше информации. Вот этот пример работает.

Код 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);
				}
			}
		}
	}
}

Старый 03.08.2014, 15:44
delphic вне форума Посмотреть профиль Отправить личное сообщение для delphic Найти все сообщения от delphic
  № 10  
Ответить с цитированием
delphic

Регистрация: Apr 2014
Сообщений: 215
Цитата:
Сообщение от sospamom Посмотреть сообщение
Нужно больше информации. Вот этот пример работает.
это сработает как и мой код, если пройти героем,но стоит вернутся в тур где это брали, убирается тока один из предметов, а должны убираться два
вообщем нужно сделать так - собираем героем предметы, выходим в другой тур, возвращаемся в тур где подобрали предметы и их не должно уже там быть, да взять хотя бы пример марио, вы собираете копейки, а когда вы ворачиваетесь назад их уже нет, и это правильно,ведь вы уже их собрали.Да по факту, когда мы трогаем героем предмет он убирается, массив срабатывает, но стоит вам вернуться уберется тока один предмет

Создать новую тему Ответ Часовой пояс GMT +4, время: 06:06.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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