簡體   English   中英

如何讓像Nape這樣的物理引擎工作?

[英]How to get a physics engine like Nape working?

簡介:我認為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識別為有效的類文件。 我嘗試編輯它,但即使我得到它識別(給出一個包名並添加大括號)但我仍然得到一堆錯誤。 它是偽造的代碼還是什么? 到底是怎么回事?

我的目標:我可以想象我會以錯誤的方式解決這個問題。 那么讓我解釋一下我想要實現的目標。 我基本上想學習如何使用引擎,從一個簡單的基本示例開始,我可以編輯和亂用。 如果我甚至無法得到一個有效的例子那么我就無法學到任何東西。 我最好不要開始使用像FlashDevelop這樣的東西(因為我必須學習如何使用該程序)但是如果它無法幫助那么我可以嘗試一下。

網站上的代碼示例是Haxe,而不是ActionScript,它解釋了添加“包”時出現的錯誤。

這是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的引用將為null。

混合AS3和Haxe對於剛開始編程的人來說並不容易。 如果你對Haxe感興趣,那就去吧,否則,為了更簡單的2D物理,我建議給Box2D World Construction Kit 它允許您使用組件定義直接在IDE中對世界進行原型設計,並且它應該比直接AS3端口快一點,因為它使用Alchemy。

世界建築工具包

此外,還有一個關於gotoAndLearn的免費入門視頻教程,可以幫助您入門。

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM