2011-01-09 62 views
1

介紹:我認爲Nape是一個相對較新的引擎,所以你們有些人可能不知道它。它應該比box2d快,我喜歡這裏有不錯的文檔。這是網站:http://code.google.com/p/nape/如何讓像Nape這樣的物理引擎工作?

我對編程比較陌生。我在AS3的基本功能上很體面,但每次我嘗試實現某種引擎或框架時,我似乎都無法使其工作。用Nape我覺得我比以前進一步了一點,但我仍然陷入困境。

我的問題:我使用的是Adobe CS5,我設法導入SWC文件,如here所述。接下來,我試圖複製this one之類的演示源之一,並讓它工作,但我不斷收到錯誤。我創建了一個新的類文件,將演示源複製到它,並嘗試將其添加到舞臺上。

我的舞臺代碼基本上是這樣的:

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); 

好吧,看來源代碼甚至沒有被閃光燈識別爲有效的類文件。我試着編輯它,但即使我知道它(給一個包名稱並添加大括號),但我仍然有一堆錯誤。它是僞代碼還是什麼?到底是怎麼回事?

我的目標:我可以想象我正在以這種錯誤的方式去做。所以讓我解釋一下我試圖達到的目標。我基本上想從一個簡單的基本例子開始學習如何使用引擎,我可以編輯和處理這個簡單的例子。如果我甚至無法得到一個工作示例,那麼我無法學習任何東西。最好我不想開始使用FlashDevelop之類的東西(因爲我必須學習如何使用該程序),但如果無法幫助,那麼我可以嘗試一下。

+0

因爲Nape是使用Haxe構建的,所以您可以試試haxe的郵件列表... – goliatone 2011-01-09 13:23:13

回答

4

網站上的代碼示例是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應該是800×600與60,對於這種設置一個幀率。 另外,請注意我已經將構造函數更改爲init方法。這是因爲 階段在那裏被訪問,並且直到Main的實例被添加到階段 階段的引用將爲空。

混合AS3和Haxe對於新編程的人來說並不容易。如果你對Haxe感興趣,那就去做吧,否則,爲了更簡單的2D物理學,我建議給予Box2D World Construction Kit一試。它允許您使用組件定義輕鬆地在IDE中直接創建世界,並且它應該比直接AS3端口快一點,因爲它使用Alchemy。

World Construction Kit

此外,對gotoAndLearn一個免費的入門視頻教程,讓你開始。

Goodluck!

+0

哇。更多的信息比我所希望得到的更多。非常感謝你^^ – Glacius 2011-01-10 10:41:09