Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [Box2D] частично не работает физика после разброса по классам (http://www.flasher.ru/forum/showthread.php?t=210978)

neonoviiwolf 07.06.2015 20:58

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

код собран примерно, как было, т.к. от этой реализации я отказался, но всё работало
Код 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;
                }
        }
}


dimarik 07.06.2015 22:14

Эмм... Проблема в том, что вы выявили недостаток производительности и решили сделать пул, но у вас это не получилось?

neonoviiwolf 07.06.2015 22:23

Цитата:

Сообщение от dimarik (Сообщение 1183263)
Эмм... Проблема в том, что вы выявили недостаток производительности и решили сделатиь пул, но у вас это не получилось?

я и в первый раз сделал пул, всё работало, но код не универсальный и для каждого типа объектов нужно писать свои параметры при создании и проверять к какому типу он относиться. По этому решил, что пусть сами мувики несут необходимые параметры, как плотность, форму и т.д. Получим универсальный пул, универсальный скелет для мувиков, которым нужно сделать физику. Но пока не получается полностью заставить их работать, т.е. объекты создаются, выводятся на сцену, но не двигаются, об них можно ударить другой физический объект, он оттолкнётся, а они стоят

dimarik 07.06.2015 22:31

Ну работайте над этим, придумывайте.

neonoviiwolf 07.06.2015 22:38

Цитата:

Сообщение от dimarik (Сообщение 1183271)
Ну работайте над этим, придумывайте.

к чему этот флуд?

Добавлено через 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 минут
можно закрывать


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

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