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

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

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

Регистрация: Jun 2014
Сообщений: 558
По умолчанию возврат объектов пул

Добрый день!
Возник наверно пустяковый вопрос, но ставит в тупик
Есть пулы, в которых сидят объекты Box2D, так вот, вывести - выведу, а обратно в пул запихнуть как?
так вывожу, в коде много через get, что бы каждый мувик сам хранил все свои параметры
Код AS3:
package Pool
{
	import Box2D.Collision.Shapes.b2PolygonShape;
	import Box2D.Common.Math.b2Vec2; //temp
	import Box2D.Dynamics.b2Body;
	import Box2D.Dynamics.b2BodyDef;
	import Box2D.Dynamics.b2FixtureDef;
	import Box2D.Dynamics.b2World; //временно
	import flash.display.MovieClip;
 
	public class PoolBox2D
	{
//*******************************************************************************
		private var movieClip:Class;
		private var vectorPool:Vector.<b2Body> = new Vector.<b2Body>;
		private var meters:uint = 30;
		private var body:b2Body;
 
		public function PoolBox2D(_movieClip:MovieClip, lengthPool:uint, world:b2World, stage:*) //world and stage - temp
		{
			movieClip = MovieClip(_movieClip).constructor;
 
			for (var i:uint = 0; lengthPool > i; ++i)
			{
				var movieClipView:MovieClip = new movieClip() as MovieClip;
 
				var bodyDef:b2BodyDef;
				var bodyShapePoligon:b2PolygonShape;
				var fixtureDef:b2FixtureDef;
 
				bodyDef = movieClipView.getBodyDef;
				bodyDef.position.Set((Math.random() * 1600) / meters, 1050 / meters / 2);
				bodyDef.userData = movieClipView;
				body = world.CreateBody(bodyDef);
				bodyShapePoligon = movieClipView.getBodyShapePoligon;
 
				fixtureDef = movieClipView.getFixtureDef;
				body.SetBullet(movieClipView.getCCD);
				body.CreateFixture(fixtureDef);
				stage.addChild(movieClipView);
				lengthPool = movieClipView.getlengthPool;//подумать
			}
		}
}
}
ещё, мож кто подскажет, мувик также хранит необходимое их количество себя в пуле (последняя строчка) в этом варианте, из-за цикла, я получаю совсем не нужные вызовы get(нужно вызвать лишь один раз), есть идеи как вызвать один раз, не создавая лишний мувик до начала цикла?

Старый 09.06.2015, 07:13
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

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

Старый 09.06.2015, 12:26
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 3  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
это часть кода, пул я создаю
в классе мейн я создаю массив всех объектов(точнее несколько, в зависимости от типов) и передаю его в класс createPool, createPool каждый объект (точнее тип) отправляет в класс PoolBox2D и возвращает в класс main массив пулов, PoolBox2D создаёт пул (он же и выводит на экран, так как я ещё не создал класс, который бы контролирует вывод на сцену, т.к. в первые решил сделать подобную конструкцию, нужно тестить было).
может кажется громоздко, зато получилось удобно, независимые универсальные классы, и все легко подкручивается
так вот, мувик я разумеется, то я знаю как удалить со сцены(делал пулы из мувиков/спрайтов) и оставить в пуле, а как удалить со сцены объект бокс2д, не удаляя его из пула? удалю со сцены userData, останется же сама форма (хз как называется, в дебаг режиме обводится контор), где у box2d правильнfя команда remove?

Добавлено через 19 минут
Код AS3:
public function PoolBox2D(_movieClip:MovieClip, world:b2World, stage:*) //world and stage - temp
		{
			var lengthPool:uint = _movieClip.getlengthPool;//подумать
			movieClip = MovieClip(_movieClip).constructor;
проблему решил, забыл, что я изначально передаю мувик
но появилась другая, хотя незначительная
Код AS3:
public function PoolBox2D(_movieClip:MovieClip, world:b2World, stage:*)
сюда я передаю уже созданный мувик, но не добавленный на сцену, т.е. в итоге лишний объект
так вот, если я создам этот мувик локально в функции и передам сюда, то по завершению функции ссылка на него пропадёт и его рано или поздно удалит сборщик мусора?


Последний раз редактировалось neonoviiwolf; 09.06.2015 в 12:48.
Старый 09.06.2015, 12:46
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 4  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
а как удалить со сцены объект бокс2д, не удаляя его из пула?
Объекты бокс2д существуют только математически. Ни на какую сцену они не добавляются. У бокс2д нет такого метода типа remove, на сколько я помню. Надо удалить тело из мира, но чтобы оно могло удалиться, надо делать это в тот момент, когда мир не закрыт, то есть b2World
.isLocked() == false. То есть надо делать это перед началом шага (перед вызовом b2World.Step())
Точно не помню уже уничтожается тело при этом или нет.

п.с. Вообще бокс2д ужасен. Он тормозной и API у него никудышный. Nape в сто раз лучше. Советую сразу забить на бокс2д и изучать нейп.
В нейпе тело легко удаляется из мира через _space.bodies.remove(body);
и так же легко опять возвращается в мир либо через body.space = _space; либо _space.bodies.add(body);

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

Регистрация: Jun 2014
Сообщений: 558
не в защиту бокса2д
у него у течка памяти в в какой-то функции из нижестоящих, но они нужны ток при разработке
world.SetDebugDraw(debugDraw);
world.DrawDebugData();
если отключить, то 61 объект на сцене жрёт около 30% (скачки при расчётам до 60%) - это всё вместе, т.е. математика и графика
что в принципе нормально, в следующий раз мож и nape попробую

Добавлено через 6 минут
ой, вру, при 41, при 61 тормозит

Добавлено через 14 минут
хм... а есть хороший учебник/уроки по nape (с английским совсем плохо)?


Последний раз редактировалось neonoviiwolf; 09.06.2015 в 13:36.
Создать новую тему Ответ Часовой пояс GMT +4, время: 08:35.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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