Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [Box2D] userData не меняет позицию (http://www.flasher.ru/forum/showthread.php?t=131889)

bato 30.10.2009 14:06

userData не меняет позицию
 
Пытаюсь переписать HelloWorld так, чтобы вместо мувиков использовать картинки. Проблема в том, что картинки выводятся в верхнем левом углу и не меняют позицию.

Код AS3:

package 
{               
        import flash.display.Sprite;
        import flash.events.Event;
        // Classes used in this example
        import Box2D.Dynamics.*;
        import Box2D.Collision.*;
        import Box2D.Collision.Shapes.*;
        import Box2D.Common.Math.*;
 
        [SWF(backgroundColor="#000000")]
 
 
        /**
        * ...
        */

        public class Main extends Sprite
        {
 
                [Embed(source="smile.gif")]
                [Bindable]
                public var Smile: Class;               
 
                public function Main():void
                {
                        // Add event for main loop
                        addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
 
 
                        // Creat world AABB
                        var worldAABB:b2AABB = new b2AABB();
                        worldAABB.lowerBound.Set(-100.0, -100.0);
                        worldAABB.upperBound.Set(100.0, 100.0);
 
                        // Define the gravity vector
                        var gravity:b2Vec2 = new b2Vec2(0.0, 10.0);
 
                        // Allow bodies to sleep
                        var doSleep:Boolean = true;
 
                        // Construct a world object
                        m_world = new b2World(worldAABB, gravity, doSleep);                       
 
                        // Vars used to create bodies
                        var body:b2Body;
                        var bodyDef:b2BodyDef;
                        var boxDef:b2PolygonDef;
                        var circleDef:b2CircleDef;
 
 
 
                        // Add ground body
                        bodyDef = new b2BodyDef();
                        //bodyDef.position.Set(15, 19);
                        bodyDef.position.Set(10, 12);
                        //bodyDef.angle = 0.1;
                        boxDef = new b2PolygonDef();
                        boxDef.SetAsBox(30, 3);
                        boxDef.friction = 0.3;
                        boxDef.density = 0; // static bodies require zero density
                        body = m_world.CreateBody(bodyDef);
                        body.CreateShape(boxDef);
                        body.SetMassFromShapes();
 
                        // Add some objects
                        for (var i:int = 1; i < 10; i++){
                                bodyDef = new b2BodyDef();
                                bodyDef.position.x = Math.random() * 15 + 5;
                                bodyDef.position.y = Math.random() * 10;
                                var rX:Number = Math.random() + 0.5;
                                var rY:Number = Math.random() + 0.5;
 
                                // Box
                                boxDef = new b2PolygonDef();
                                boxDef.SetAsBox(rX, rY);
                                boxDef.density = 1.0;
                                boxDef.friction = 0.5;
                                boxDef.restitution = 0.2;
                                bodyDef.userData = new Smile();
                                bodyDef.userData.width = rX * 2 * 30;
                                bodyDef.userData.height = rY * 2 * 30;
                                body = m_world.CreateBody(bodyDef);
                                body.CreateShape(boxDef);
 
                                body.SetMassFromShapes();
                                addChild(bodyDef.userData);
                        }
 
                }
 
                public function Update(e:Event):void{
 
                        m_world.Step(m_timeStep, m_iterations);
 
                        // Go through body list and update sprite positions/rotations
                        for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next){
                                if (bb.m_userData is Sprite){
                                        bb.m_userData.x = bb.GetPosition().x * 30;
                                        bb.m_userData.y = bb.GetPosition().y * 30;
                                        bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);
                                }
                        }
 
                }
 
                public var m_world:b2World;
                public var m_iterations:int = 10;
                public var m_timeStep:Number = 1.0/30.0;
 
        }
 
}


elfon 30.10.2009 18:21

При такой инициализации у тебя Smile это Bitmap.
Соответственно проверка на Sprite не проходит.
Замени на Bitmap.

P.S: и вообще это криво будет выглядеть, т.к. картинка выровнена по левому верхнему углу, а надо по середине. Так что либо обернуть в контейнер и в нём выровнять либо при каждом перемещении доравнивать на половину ширины и высоты.


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

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