Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Нужна литература о Box2D на русском (http://www.flasher.ru/forum/showthread.php?t=181685)

CyberDude 29.06.2012 17:58

Нужна литература о Box2D на русском
 
Встречали ли вы литературу о Box2D на русском языке с примерами, если да, скиньте пожалуйста ссылку, желательно бесплатный источник...

П.С. Решил занятся изучением Box2D вплотную, но с английским не так хорошо как хотелось бы. Если были уже посты на эту тему, пожалуйста не злитесь? лучше скиньте ссылку на пост)

illuzor 29.06.2012 18:03

Есть серия уроков
http://demiart.ru/forum/index.php?showtopic=181251

Aquahawk 29.06.2012 18:04

Заняться вплотную это прочитать и понять исходник. Про nape на http://flashgameblogs.ru/ писали, по box2d тоже что-то было, можете поискать там.

54321go 29.06.2012 22:46

http://redefy.net/category/box2dflash/ здесь хорошие уроки

vizgl 30.06.2012 05:44

Лучше немного подучить английский и больше не будет возникать проблем.
На будущее, хороший блог(на английском) http://www.emanueleferonato.com/
Есть куча демок/примеров работы с box2d и еще куча всего. Код в демках ужасный, но все же кое-чему можно научится.

HardCoder 30.06.2012 09:52

Цитата:

Сообщение от 54321go (Сообщение 1086686)
http://redefy.net/category/box2dflash/ здесь хорошие уроки

Не читал другие, но эти уроки настоятельно рекомендую. Box2D осилил за один день по ним :).
PS: Так как информация осваивается слишком быстро, то свойственно скоро забывать пройденное. Поэтому сразу советую написать небольшую утилитку, обобщающую некоторые методы. Вот, например, моя. Прошу не судить строго - я к этому классу еще не возвращался. Писал в первый день во время изучения box2D:
Код AS3:

package {
        import Box2D.Collision.Shapes.*;
        import Box2D.Common.Math.*;
        import Box2D.Dynamics.*;
        import flash.display.*;
        import game.subjects.*;
 
        /**
        * Box2D basic transformations
        * @author HardCoder
        */

        public class B2Transformer {
                /**
                * Constant of transformation pixels/meters
                */

                public static const METERS:int = 30;
                /**
                * Constant to update world
                */

                public static const TIMES_STEP:Number = 1 / 60;
                /**
                * Constant to update world
                */

                public static const VELOCITY_ITERATIONS:int = 10;
                /**
                * Constant to update world
                */

                public static const POSITION_ITERATIONS:int = 10;
 
                public function B2Transformer() {
                }
 
                /**
                * Converts meters to pixels
                * @param        meters - number of meters
                * @return        number of pixels
                */

                public static function metersTopixels(meters:Number):Number {
                        return METERS * meters;
                }
 
                /**
                * Converts  pixels to meters
                * @param        pixels - number of pixels
                * @return        number of meters
                */

                public static function pixelsToMeters(pixels:Number):Number {
                        return pixels / METERS;
                }
 
                /**
                * Create Box2D world
                * @param        gravity - world gravity
                * @return        Box2D world
                */

                public static function createWorld(gravity:b2Vec2 = null):b2World {
                        if (!gravity)
                                gravity = b2Vec2.Make(0, 0);
                        return new b2World(gravity, true);
                }
 
                /**
                * Adds the debug drawing to b2World
                * @param        world - b2World
                * @param        sprite - sprite, where graphics will be displayed
                */

                public static function addDebugDraw(world:b2World, sprite:Sprite):void {
                        var debugDraw:b2DebugDraw = new b2DebugDraw();
                        debugDraw.SetSprite(sprite);
                        debugDraw.SetDrawScale(30);
                        debugDraw.SetFillAlpha(0.5);
                        debugDraw.SetLineThickness(1);
                        debugDraw.SetFlags(b2DebugDraw.e_jointBit | b2DebugDraw.e_shapeBit);
                        world.SetDebugDraw(debugDraw);
                }
 
                /**
                * Creates circle body to b2World
                * @param        world - b2World
                * @param        type - (b2Body.b2_staticBody:uint = 0, b2Body.b2_kinematicBody:uint = 1, b2Body.b2_dynamicBody:uint = 2)
                * @param        x - position in the world in pixels
                * @param        y - position in the world in pixels
                * @param        radius - circle radius in pixels
                * @param        userData - data that is linked to this body
                * @param        allowSleep - will the body be automaticly deactivated
                * @return        b2Body
                */

                public static function createCircleBody(world:b2World, type:uint, x:Number, y:Number, radius:Number, userData:* = null, allowSleep:Boolean = true):b2Body {
                        var bodyDef:b2BodyDef = new b2BodyDef();
                        bodyDef.type = type;
                        bodyDef.allowSleep = allowSleep;
                        bodyDef.userData = userData;
                        bodyDef.position.Set(B2Transformer.pixelsToMeters(x), B2Transformer.pixelsToMeters(y));
                        var body:b2Body = world.CreateBody(bodyDef);
                        var circleShape:b2CircleShape = new b2CircleShape(B2Transformer.pixelsToMeters(radius))
                        var fixture:b2FixtureDef = new b2FixtureDef();
                        fixture.density = 1000;
                        fixture.friction = 0;
                        fixture.restitution = 0;
                        fixture.shape = circleShape;
                        body.CreateFixture(fixture);
                        return body;
                }
 
                /**
                * Creates polygon body to b2World
                * @param        world - b2World
                * @param        type - (b2Body.b2_staticBody = 0, b2Body.b2_kinematicBody = 1, b2Body.b2_dynamicBody = 2)
                * @param        x - position in the world in pixels
                * @param        y - position in the world in pixels
                * @param        width - poligon width in pixels
                * @param        height - poligon height in pixels
                * @param        userData - data that is linked to this body
                * @param        allowSleep - will the body be automaticly deactivated
                * @return        b2Body
                */

                public static function createPolygonBody(world:b2World, type:uint, x:Number, y:Number, width:Number, height:Number, userData:* = null, allowSleep:Boolean = true):b2Body {
                        var bodyDef:b2BodyDef = new b2BodyDef();
                        bodyDef.type = type;
                        bodyDef.allowSleep = allowSleep;
                        bodyDef.userData = userData;
                        bodyDef.position.Set(B2Transformer.pixelsToMeters(x), B2Transformer.pixelsToMeters(y));
                        var body:b2Body = world.CreateBody(bodyDef);
                        var polygonShape:b2PolygonShape = b2PolygonShape.AsBox(B2Transformer.pixelsToMeters(width) / 2, B2Transformer.pixelsToMeters(height) / 2);
                        var fixture:b2FixtureDef = new b2FixtureDef();
                        fixture.density = 2;
                        fixture.friction = 0;
                        fixture.restitution = 0;
                        fixture.shape = polygonShape;
                        body.CreateFixture(fixture);
                        return body;
                }
        }
}

Добавлено через 3 минуты
Ну и, конечно, в методах можно по своему настроить density, friction и restitution. Я писал под конкретную игру, поэтому эти свойства фиксированы.

Добавлено через 11 минут
раз уж начал, то и пример использования:
Код AS3:

package {
        import Box2D.Common.Math.b2Vec2;
        import Box2D.Dynamics.b2World;
        import flash.display.Sprite;
        import flash.events.Event;
 
        /**
        * ...
        * @author HardCoder
        */

        public class Main extends Sprite {
                private var _world:b2World;
 
                public function Main() {
                        this._world = B2Transformer.createWorld(new b2Vec2(0, 10));
                        B2Transformer.addDebugDraw(this._world, this);
                        B2Transformer.createCircleBody(this._world, 2, 100, 20, 20);
                        B2Transformer.createPolygonBody(this._world, 0, 0, 300, 600, 30);
                        this.addEventListener(Event.ENTER_FRAME, loop);
                }
 
                private function loop(e:Event):void {
                        this._world.Step(B2Transformer.TIMES_STEP, B2Transformer.VELOCITY_ITERATIONS, B2Transformer.POSITION_ITERATIONS);
                        this._world.ClearForces();
                        this._world.DrawDebugData();
                }
        }
}


CyberDude 02.07.2012 17:35

Спасибо всем за информацию...


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

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