2014-02-24 81 views
1

我有以下簡單的haxe/openfl代碼,並且無法弄清楚爲什麼它應該爲一個目標編譯並且爲其他目標編譯失敗。我的理解是,OpenFL應該將Flash API帶到所有支持的語言/平臺。OpenFL:針對不同目標的編譯結果不一致

$ haxelib run openfl build project.xml neko 

然而,編譯它閃爍時,會產生一個錯誤:編譯ネ目標時

//test.hx 
import flash.display.Sprite; 
class Test { 
    static function main() { 
     var g:Sprite = new Sprite(); 
     g.graphics.drawPath([1, 2], [1.1, 1.2,2.1,2.2]); //problem line 
    } 
} 

彙編是OK

$ haxelib run openfl build project.xml flash 
./Test.hx:5: characters 23-29 : Array<Int> should be flash.Vector<Int> 
./Test.hx:5: characters 23-29 : For function argument 'commands' 

它看起來怪我因爲從錯誤消息看來,對於一個目標,函數drawPath需要Array類型參數,對於另一個目標,相同的函數需要Vector鍵入的參數。

任何想法爲什麼發生這種情況,以及如何使這兩個目標的工作?

順便說一句,如果我編譯這HTML5,我得到:

$ haxelib run openfl build project.xml html5 
./Test.hx:5: characters 3-22 : flash.display.Graphics has no field drawPath 

功能甚至不存在這裏。上述結果與HAXE 3.0.1和最新openfl爲2014年二月的

+0

我真的不明白,爲什麼你的編譯命令是「openfl建設......」,我用「石灰建設......」還是我錯過了又一次更新? :) –

+0

@CreativeMagic我使用'haxelib run openfl build',因爲這是編譯OpenFL項目時由FlashDevelop使用的命令。什麼是你使用的完整命令?謝謝。 – tinlyx

+0

順便說一句,因爲我使用msys/mingw32,我需要使用'haxelib run lime'而不是'lime'。 stackoverflow.com/questions/21837170/ – tinlyx

回答

-1

這可能是存在於您的問題,因爲你正在執行一個命令:

haxelib run openfl build project.xml flash 

也許你還沒有安裝在LiME(Light Media Engine)上運行的最新OpenFL,或者您擁有舊版本的FlashDevelop,它們使用較舊的OpenFL版本構建您的應用程序。

我手動和現在做我所有的建築在命令行中,新的命令是:

lime build flash 

是的,就像我記得JS API沒有drawPath方法,所以沒有那裏運氣好。然而,如果沒有,我建議爲HTML5製作一個編輯條件並使用其他方法:繪製線條,曲線等。

看看OpenFL官方網站獲取更多信息 - 它是寫得相當好: http://www.openfl.org/documentation/

請注意,OpenFL變化非常頻繁,它有時會讓人困惑,因爲構建命令和依賴包變化很大。您必須始終檢查OpenFL的當前狀態。我敢肯定它在半年左右會再次發生變化。

+0

感謝您的回答。我剛剛嘗試過'haxelib run lime build {flash,html5,neko}'。結果是一樣的。只有neko的作品,閃光燈和HTML5失敗,同樣的錯誤。我使用的openfl版本是在問題發佈前兩天才下載的,而且是最新版本。 – tinlyx

+0

如果情況好轉,我會再檢查一次。 – tinlyx

1

OpenFL要求openfl.Vector,如在Graphics.drawPath方法簽名看出:

public function drawPath (commands:Vector<Int>, data:Vector<Float>, winding:GraphicsPathWinding = null):Void 

而Mac和ネ目標接受陣列,閃存需要OpenFL矢量類;另外,drawPath未針對html5目標實施。

因此,執行命令和數據參數如下:

package; 

import openfl.Vector; 
import openfl.display.Sprite; 
import openfl.display.Graphics; 

class Main extends Sprite { 

    public function new() { 
     super(); 

     var g:Graphics = graphics; 
     g.lineStyle(2, 0x0); 

     var commands:Vector<Int> = [1, 2, 2, 2, 2]; 
     var data:Vector<Float> = [20.0,10.0, 
            50.0,10.0, 
            50.0,40.0, 
            20.0,40.0, 
            20.0,10.0]; 
     g.drawPath(commands, data); 
    } 

}