Как заставить работать физический движок вроде Nape? - PullRequest
1 голос
/ 09 января 2011

Введение: Я думаю, что Nape - это относительно новый двигатель, поэтому некоторые из вас могут его не знать.Якобы он быстрее, чем box2d, и мне нравится, что есть достойная документация.Вот сайт: http://code.google.com/p/nape/

Я относительно новичок в программировании.Я неплохо справляюсь с основными функциями AS3, но каждый раз, когда я пытаюсь реализовать какой-то движок или фреймворк, я даже не могу заставить его работать.С Nape я чувствую, что продвинулся немного дальше, чем раньше, но все еще застрял.

Моя проблема: Я использую Adobe CS5, мне удалось импортировать файл SWC, как описано здесь .Затем я попытался скопировать исходный код демо-версии, например , этот и заставить его работать, но я продолжаю получать ошибки.Я сделал новый файл класса, скопировал в него демонстрационный исходный код и попытался добавить его на сцену.

Мой сценический код в основном выглядит следующим образом:

import flash.Boot; // these 2 lines are as described in the tutorial
new Boot(); 

var demo = new Main(); // these 2 are me guessing what I'm supposed to do
addChild(demo);

Ну, похожеFlash-файл даже не распознает исходный код как допустимый файл класса.Я попытался отредактировать его, но даже если я его узнаю (дайте имя пакета и добавьте фигурные скобки), но я все еще получаю кучу ошибок.Это код Psuedo или что-то?Что происходит?

Моя цель: Я могу представить, что поступаю неправильно.Итак, позвольте мне объяснить, чего я пытаюсь достичь.Я в основном хочу научиться использовать движок, начав с простого базового примера, который я могу редактировать и возиться с ним.Если я не могу даже получить рабочий пример, то я ничего не могу выучить.Желательно, чтобы я не хотел начинать использовать что-то вроде FlashDevelop (поскольку мне нужно было бы научиться пользоваться программой), но если с этим ничего не поделаешь, я могу попробовать.

1 Ответ

4 голосов
/ 10 января 2011

Пример кода на сайте - Haxe, а не ActionScript, который объясняет ошибки, которые вы получили при добавлении 'package'.

Вот модифицированная версия класса для ActionScript:

package{ 

import flash.display.Graphics; 
import flash.display.Sprite; 
import flash.events.Event; 
import flash.events.MouseEvent; 
import flash.display.StageQuality; 

import nape.space.Space; 
import nape.space.UniformSleepSpace; 
import nape.util.Tools; 
import nape.geom.Vec2; 
import nape.geom.GeomPoly; 
import nape.phys.PhysObj; 
import nape.phys.Material; 
import nape.geom.AABB; 

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  

public class Main extends Sprite
{ 
        private var space:Space; 

        private var g:Graphics; 
        private var vl:Array; 
        private var px:Number; private var py:Number; 

        //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  

        private function mouseDown(ev:MouseEvent):void { 
                var x = stage.mouseX; 
                var y = stage.mouseY; 

                g.lineStyle(1, 0, 0.5); 
                vl.push(new Vec2(x, y)); 
                g.moveTo(x, y); 
                px = x; py = y; 
        } 

        private function mouseUp(ev:MouseEvent):void { 
                if (vl.length >= 3) { 
                        var poly = new GeomPoly(vl); 
                        poly.simplify(50, 4); 
                        if (!poly.selfIntersecting()) { 
                                if (!poly.cw()) poly.points.reverse(); 

                                var p = Tools.createConcave(poly, 0, 0, 0, false, Material.Wood); 
                                space.addObject(p); 
                                addChild(p.graphic); 
                        } 
                } 
                g.clear(); 
                vl = new Array(); 
                px = -100; 
        } 

        //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  

        public function init(ev:Event = null)
        { 
                var s = new Sprite(); 
                g = s.graphics; 
                addChild(s); 
                s.cacheAsBitmap = true; 
                vl = new Array(); 
                px = -100; 

                space = new UniformSleepSpace(new AABB(0,0, 800,600), 30, new Vec2(0, 250)); 

                var p:PhysObj; 
                space.addObject(p = Tools.createBox(-20, 300, 50, 600, 0, 0, 0, true, Material.Wood)); 
                addChild(p.graphic); 
                space.addObject(p = Tools.createBox(820, 300, 50, 600, 0, 0, 0, true, Material.Wood)); 
                addChild(p.graphic); 
                space.addObject(p = Tools.createBox(400, -20, 800, 50, 0, 0, 0, true, Material.Wood)); 
                addChild(p.graphic); 
                space.addObject(p = Tools.createBox(400, 620, 800, 50, 0, 0, 0, true, Material.Wood)); 
                addChild(p.graphic); 

                stage.quality = StageQuality.MEDIUM; 
                stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown); 
                stage.addEventListener(MouseEvent.MOUSE_UP,   mouseUp); 
                stage.addEventListener(Event.ENTER_FRAME,     enterFrame); 
        } 

        //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  

    private function enterFrame(ev:Event) { 
                graphics.clear(); 
                graphics.lineStyle(1, 0, 1); 
                if (px != -100) { 
                        var x = stage.mouseX; 
                        var y = stage.mouseY; 
                        var dx = x - px; var dy = y - py; 
                        if (dx * dx + dy * dy > 5) { 
                                vl.push(new Vec2(x, y)); 
                                px = x; py = y; 
                                g.lineTo(x, y); 
                        }else { 
                                graphics.moveTo(px, py); 
                                graphics.lineTo(x, y); 
                        } 
                } 

        space.step(1/60, 6, 6); 
        } 
}
}

А вот код временной шкалы:

import flash.Boot; 
new Boot();

var m:Main = new Main();
m.addEventListener(Event.ADDED_TO_STAGE, m.init);
addChild(m)

Ваш fla должен быть 800x600 с frameRate 60 для этой настройки. Также обратите внимание, что я изменил конструктор на метод init. Это потому туда можно попасть на сцену, и пока на сцену не будет добавлен экземпляр Main, ссылка на stage будет нулевой.

Смешивать AS3 и Haxe непросто для новичка в программировании. Если вы заинтересованы в Haxe, зайдите на него, в противном случае для упрощения 2D физики я бы порекомендовал попробовать Box2D World Construction Kit . Он позволяет легко создавать прототипы миров прямо в IDE, используя определения компонентов, и он должен быть немного быстрее, чем прямой порт AS3, так как он использует Alchemy.

World Construction Kit

Кроме того, есть бесплатный вводный видеоурок по gotoAndLearn , с которого можно начать.

Гудлак!

...