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

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

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

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

Добрый день!
Осваиваю движок, уже делал рабочий вариант, когда всё работало, но решил переделать по потёвому (для себя) т.е. сделать пул, в который будут загоняться все объекты.
Так вот, по первой с делал, в варианте, что до добавления в пул указываются все параметры, как ниже

код собран примерно, как было, т.к. от этой реализации я отказался, но всё работало
Код AS3:
		public function B2PoolTemp(_lengthVector:uint,_bodyShapePoligon:b2PolygonShape, _movieClip:MovieClip, _world:b2World, stage:*) //stage для теста
		{
			lengthVector = _lengthVector;
			world = _world;
			movieClipDef = MovieClip(_movieClip).constructor;
 
			var bodyDef:b2BodyDef;
			var fixture:b2FixtureDef;
			var bodyShapePoligon:b2PolygonShape = _bodyShapePoligon;
 
			while (--_lengthVector > -1)
			{
				var movieClipView:MovieClip = new movieClipDef() as MovieClip;
				movieClipView.cacheAsBitmap;
				stage.addChild(movieClipView);
				bodyDef = new b2BodyDef();
				bodyDef.position.Set((Math.random() * 1600) / meters, 1050 / meters / 2);
				bodyDef.type = b2Body.b2_dynamicBody;
				bodyDef.userData = movieClipView;
				//body = movieClipView.getBody;
                                bodyShapePoligon.SetAsArray([b2Vec2.Make(0.8, 0.7), b2Vec2.Make(-0.7, 0.7), b2Vec2.Make(-0.6, -0.7), b2Vec2.Make(0.8, -0.7)], 4);
				body = world.CreateBody(bodyDef);
				fixture = new b2FixtureDef();
				fixture.density = 10; //плотность
				fixture.shape = bodyShapePoligon;
				//body.CreateFixture(fixture);
				//movieClipView.swopBody(body);
				vectorPool.push(body);
			}
		}
но тут есть недостаток, нужно для разных объектов писать условия if(), т.к. плотность, положение на сцене, и размеры полигонов отличаются, и решил всё переписать, но уже все основные параметры добавить в сам мувик и просто при вызове считывать ljcnfdfnm "get"
Добился, что бы объекты выводились на экран, шейпы есть, в мир вроде добавились, при ударе об них (отдельный объект Box2D, которым управляет сам игрок) кораблик отлетает, но сами объекты не двигаются, хотя стоит тип динамический
проблема в том, что постоянно ругается, что не создан b2body = null, т.е. хочет, что бы было
var body:b2Body = new b2Body(bodyDef, world), тогда стартует, объекты есть, но они не двигаются, но об них можно удариться, а судя по обучение и моему первому варианту достаточно var body:b2Body

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

Код AS3:
package Enemies 
{
	import Box2D.Dynamics.b2World;
	import Pool.PoolBox2D;
 
	public class CreateEnemy 
	{
		private var world:b2World;
		private var poolBox2D:PoolBox2D;
		private var lengthPool:uint = 15; //длинна пула
 
 
		public function CreateEnemy(_world:b2World, tempArrayEnemy:Array, stage:*)//stage для теста 
		{
			world = _world;
			for (var i:uint = 0; tempArrayEnemy.length > i; ++i)
			{
				poolBox2D = new PoolBox2D (tempArrayEnemy[i], lengthPool, world, stage);
			}
		}
	}
}
тут пишу сам пул
Код 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 //extends MovieClip
	{
//*******************************************************************************
		private var movieClip:Class;
		private var vectorPool:Vector.<MovieClip> = new Vector.<MovieClip>;
		private var meters:uint = 30;
 
		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 = movieClipView.getBodyDef;
				var bodyShapePoligon:b2PolygonShape = movieClipView.getBodyShapePoligon;
				var fixtureDef:b2FixtureDef = movieClipView.getFixtureDef;
				bodyDef.position.Set((Math.random() * 1600) / meters, 1050 / meters / 2);
				bodyDef.userData = movieClipView;
 
				var body:b2Body = new b2Body(bodyDef, world); // вот здесь компилятор написать так, иначе ругается на body.CreateFixture(fixtureDef) - null
				body.CreateFixture(fixtureDef);
 
				stage.addChild(movieClipView);
				body = world.CreateBody(bodyDef);
			}
		}
 
//********************************************************************************
		public function get getVectorPool():Vector.<MovieClip>
		{
			return vectorPool;
		}
 
//*********************************************************************************
		public function transferPool(i:uint):void
		{
			//написать!!!
		}
 
//*******************************************************************************
		public function increasePool():void
		{
			//написать!!!
		}
	}
}
сам мувик

Код AS3:
package Enemies
{
	import Box2D.Collision.Shapes.b2PolygonShape;
	import Box2D.Common.Math.b2Vec2;
	import Box2D.Dynamics.b2Body;
	import Box2D.Dynamics.b2BodyDef;
	import Box2D.Dynamics.b2FixtureDef;
	import Box2D.Dynamics.b2World;
	import flash.events.Event;
 
	public class EnemyOne extends enemyOne_mc
	{
//********************************************************************************
		public function EnemyOne()
		{
			scaleX = 0.25;
			scaleY = 0.25;
			createExhaust();
		}
//********************************************************************************
		//анимация двигателя
		private var exhaustLeft:exhaust_mc;
		private var exhaustRight:exhaust_mc;
 
		private function createExhaust():void
		{
			exhaustLeft = new exhaust_mc();
			exhaustLeft.x = 70;
			exhaustLeft.y = 130;
			this.addChild(exhaustLeft);
 
			exhaustRight = new exhaust_mc();
			exhaustRight.x = -70;
			exhaustRight.y = 130;
			this.addChild(exhaustRight);
			create();
		}
//********************************************************************************
		private var body:b2Body;
		private var bodyDef:b2BodyDef;
		private var fixtureDef:b2FixtureDef;
		private var bodyShapePoligon:b2PolygonShape;
 
		private var world:b2World;
 
		private function create():void
		{
			//var body:b2Body;
			bodyDef = new b2BodyDef();
			bodyDef.type = b2Body.b2_dynamicBody;
			fixtureDef = new b2FixtureDef();
			bodyShapePoligon = new b2PolygonShape();
			bodyDef.type = b2Body.b2_dynamicBody;
			bodyShapePoligon.SetAsArray([b2Vec2.Make(0.8, 0.7), b2Vec2.Make(-0.7, 0.7), b2Vec2.Make(-0.6, -0.7), b2Vec2.Make(0.8, -0.7)], 4);
			fixtureDef.density = 10;
			fixtureDef.shape = bodyShapePoligon;
 
			//body.CreateFixture(fixtureDef);
			//body = world.CreateBody(bodyDef);
		}
 
		public function get getBodyDef():b2BodyDef
		{
			return bodyDef;
		}
 
		public function get getBodyShapePoligon():b2PolygonShape
		{
			return bodyShapePoligon;
		}
 
		public function get getFixtureDef():b2FixtureDef
		{
			return fixtureDef;
		}
	}
}


Последний раз редактировалось neonoviiwolf; 07.06.2015 в 21:16.
Старый 07.06.2015, 22:14
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 2  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Эмм... Проблема в том, что вы выявили недостаток производительности и решили сделать пул, но у вас это не получилось?
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

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

Регистрация: Jun 2014
Сообщений: 558
Цитата:
Сообщение от dimarik Посмотреть сообщение
Эмм... Проблема в том, что вы выявили недостаток производительности и решили сделатиь пул, но у вас это не получилось?
я и в первый раз сделал пул, всё работало, но код не универсальный и для каждого типа объектов нужно писать свои параметры при создании и проверять к какому типу он относиться. По этому решил, что пусть сами мувики несут необходимые параметры, как плотность, форму и т.д. Получим универсальный пул, универсальный скелет для мувиков, которым нужно сделать физику. Но пока не получается полностью заставить их работать, т.е. объекты создаются, выводятся на сцену, но не двигаются, об них можно ударить другой физический объект, он оттолкнётся, а они стоят

Старый 07.06.2015, 22:31
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 4  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Ну работайте над этим, придумывайте.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

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

Регистрация: Jun 2014
Сообщений: 558
Цитата:
Сообщение от dimarik Посмотреть сообщение
Ну работайте над этим, придумывайте.
к чему этот флуд?

Добавлено через 49 минут
в общем переписал, видимо проблема была в очередности, так работате

Код 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 //extends MovieClip
	{
//*******************************************************************************
		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.CreateFixture(fixtureDef);
				stage.addChild(movieClipView);
			}
		}
 
//********************************************************************************
		public function get getVectorPool():Vector.<b2Body>
		{
			return vectorPool;
		}
 
//*********************************************************************************
		public function transferPool(i:uint):void
		{
			//написать!!!
		}
 
//*******************************************************************************
		public function increasePool():void
		{
			//написать!!!
		}
	}
}
Добавлено через 50 минут
можно закрывать


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

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

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


 


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


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