Страницы

суббота, 22 декабря 2012 г.

Параметры объектов 2D физического движка Nape

      Пространство (Space) предназначено для моделирования физики в Nape. К пространству добавляются объекты физики, такие как Тела (Body) и Объединения (Constraints), которые будут моделироваться. К ним добавляются Слушатели (Listeners), для использования обратных вызовов (callbacks) Nape.

     Объект Пространства инициализируется с дополнительным вектором силы тяжести (гравитацией), который будет применен ко всем твердым телам в пространстве.
var gravity:Vec2 = new Vec2(0, 600); // гравитация (пикселей в секунду в квадрате)
var space:Space = new Space(gravity);

      При создании твердых тел в пространстве используется объект Тело (Body), которое состоит из нескольких Фигур (Shapes).
      Тело в пространстве имеет следующие физические параметры: позицию (position), вращение (rotation), скорость (velocity) и Фигуры, которые определяют форму тела. Каждая фигура имеет свойство - Материал (Material), которое определяет параметры трения (friction) и плотности (density).
      В Nape существует 3 типа Тел (задается перечислением BodyType):
  • Статическое тело
  • var staticBody:Body = new Body(BodyType.STATIC);
    
    Статическое тело единожды добавленное в пространство - фиксируется, оно не может быть передвинуто или повернуто, оно не может иметь скорость, также нельзя удалять Фигуры из тела. Но можно менять материал фигур.

     
  • Кинематическое тело
  • var staticBody:Body = new Body(BodyType.KINEMATIC);
    
    Кинематическое тело подобно статическому телу, за исключением того, что может иметь скорость, которая строго определит, как кинематическое тело перемещается. На такие тела не действует сила тяжести или ограничения, включая контакты. Можете думать о кинематических телах, как анимируемых.

     
  • Динамическое тело
  • var staticBody:Body = new Body(BodyType.DYNAMIC);
    
    На динамические тела действует физика Пространства, сила тяжести, ограничения, коллизии и архимедова сила.
      Рассмотрим пример использования статического тела - пола и динамических объектов -коробок с шаром. Создадим новый проект в FlashDevelop и скопируем nape-dev.swc в папку lib проекта (не забудьте подключить библиотеку к проекту - Add to library).

package 
{ 
    import flash.display.Sprite;
    import flash.events.Event;
 
    import nape.geom.Vec2;
    import nape.phys.Body;
    import nape.phys.BodyType;
    import nape.shape.Circle;
    import nape.shape.Polygon;
    import nape.space.Space;
    import nape.util.BitmapDebug;
    import nape.util.Debug;
 
    public class Main extends Sprite
    {
        private var space:Space;
        private var debug:Debug;
 
        public function Main():void
        {
            super();
 
            if (stage != null) {
                initialise(null);
            }
            else {
                addEventListener(Event.ADDED_TO_STAGE, initialise);
            }
        }
 
        private function initialise(ev:Event):void
        {
            if (ev != null) {
                removeEventListener(Event.ADDED_TO_STAGE, initialise);
            }
 
            // Создаем новый Space.
            // Устанавливаем гравитацию
            var gravity:Vec2 = Vec2.weak(0, 400);
            space = new Space(gravity);
 
            // Создаем новый BitmapDebug рамером со Stage и цветом Stage
            // Debug объект - это не флешевый DisplayObject
            debug = new BitmapDebug(stage.stageWidth, stage.stageHeight,
                stage.color);
            addChild(debug.display);
 
            setUp();
 
            stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
        }
 
        private function setUp():void {
            var w:int = stage.stageWidth;
            var h:int = stage.stageHeight;
 
            // Создаем статический пол для симуляции.
            // Пол состоит из одного Polygon с вершинами,
            // заданными Polygon.rect
   
            var floor:Body = new Body(BodyType.STATIC);
            floor.shapes.add(new Polygon(Polygon.rect(50, (h - 50), (w - 100), 1)));
            floor.space = space;
 
            // Создаем башню из коробок.
            // Здесь используются динамический (DYNAMIC) тим объектов. 
            // Каждая коробка состоит из одного Polygon с вершинами
            // заданными Polygon.box.
            //
            // Polygon.box(w, h) === Polygon.rect((-w / 2), (-h / 2), w, h)
            
            for (var i:int = 0; i < 16; i++)
            {
                var box:Body = new Body(BodyType.DYNAMIC);
                box.shapes.add(new Polygon(Polygon.box(16, 32)));
                box.position.setxy((w / 2), ((h - 50) - 32 * (i + 0.5)));
                box.space = space;
            }
 
            // Создаем динамический крутящийся шар посредством Circle
            // с радиусом 30px.
            // Установим  шару угловую скорость 10,
            // когда он соприкоснется с полом покатится на башню из коробок.
            var ball:Body = new Body(BodyType.DYNAMIC);
            ball.shapes.add(new Circle(30));
            ball.position.setxy(50, h / 2);
            ball.angularVel = 10;
            ball.space = space;
        }
 
        private function enterFrameHandler(ev:Event):void
        {
            // Устанавливаем шаг моделирования Space,
            // задав требуемое количество времени.
            space.step(1 / stage.frameRate);
 
            // Рендерим Space debug графику.
            // Первым делом очищаем debug экран,
            // затем рисуем Space,
            // в конце выводим на экран.
            debug.clear();
            debug.draw(space);
            debug.flush();
        }
    }
}

Тут можно посмотреть как работает этот пример.

Комментариев нет:

Отправить комментарий