2010-09-02 95 views
0

我有以下代碼:HAXE - 代碼拒絕工作

package ; 

import flash.display.DisplayObject; 
import flash.display.Graphics; 
import flash.display.MovieClip; 
import flash.display.Shape; 
import flash.display.Sprite; 
import flash.events.Event; 
import flash.events.MouseEvent; 
import flash.geom.Rectangle; 
import flash.Lib; 
import flash.utils.Timer; 

/** 
* ... 
* @author RCIX 
*/ 

class Main 
{ 
static function main() 
{ 
    trace("game started"); 
    var game : Game = new Game(); 
    game.Run(); 
    trace("game finished"); 
} 
} 
class Game extends DisplayObject 
{ 
var rectX : Int; 
var rectY : Int; 
var velocityX : Int; 
var velocityY : Int; 

var screenBounds : Rectangle; 
var graphics : Graphics; 

public function new() 
{ 
    super(); 
    screenBounds = Lib.current.getBounds(new DisplayObject()); 
    graphics = Lib.current.graphics; 
    Lib.current.addChild(this); 
    trace("Game constructor"); 
} 

public function Run() 
{ 
    trace("Run"); 
    Lib.current.addEventListener(Event.ENTER_FRAME, OnFrameEnter); 
    velocityX = 1; 
    velocityY = 1; 
} 
function OnFrameEnter(event : Event) 
{ 
    trace("OnFrameEnter"); 
    graphics.beginFill(0xFFFFFF, 0xFFFFFF); 
    graphics.drawRect(0, 0, screenBounds.width, screenBounds.height); 
    graphics.endFill(); 
    Update(); 
} 
function Update() 
{ 
    trace("Updating"); 
    if (rectX + 50 > screenBounds.width || 
     rectX < 0) 
    { 
    velocityX *= -1; 
    } 
    if (rectY + 50 > screenBounds.height || 
     rectY < 0) 
    { 
    velocityY *= -1; 
    } 
    rectX += 1; 
    rectY += 1; 
    graphics.beginFill(0xFF0000); 
    graphics.drawRect(rectX, rectY, 50, 50); 
    graphics.endFill(); 
} 
} 

但唯一的跟蹤輸出我得到的是「遊戲開始」;沒有別的是追蹤或工作。爲什麼?

更新:後有固定的screenBounds問題,下面的問題依然存在:

  • 我OnFrameEnter或更新調用跟蹤過的無;爲什麼?
  • 擴展從我的DisplayObject Game類使事情陷入停頓,並沒有機會到我的任何其他代碼,無論我是否在構造函數中調用​​。

更新:以來的第一個問題是一個單獨的問題,我認爲拆分出到另一個問題。

+0

我建議,在安裝調試播放器:http://www.adobe.com/support/flashplayer/downloads.html。它比釋放播放器的性能更差,但是你會得到錯誤消息和堆棧跟蹤(對於FlashDevelop的測試(你似乎使用它),獨立調試器應該足夠了)。另外,與C#不同的是,在haXe中按照慣例保留了PascalCase類型和枚舉構造函數 – back2dos 2010-09-03 13:40:16

+0

哎呀,我以某種方式跳過調試投影儀>。< – RCIX 2010-09-03 22:12:11

+0

@ back2dos:oik,它在調試播放器後仍然不起作用。請參閱http://stackoverflow.com/questions/3623363/flashdevelop-haxe-repeated-an-i-o-error-has-occured-errors我的問題 – RCIX 2010-09-03 22:25:59

回答

6

從AS3語言參考:

的DisplayObject是一個抽象基類;因此,您不能直接調用DisplayObject。調用新的DisplayObject()會引發ArgumentError異常。

所以基本上你應該延伸ShapeSprite而不是DisplayObject

1

由於

trace("Game constructor"); 

沒有打印我想說的錯誤是在它上面的線路之一。

super(); 
    screenBounds = Lib.current.getBounds(new DisplayObject()); 
    graphics = Lib.current.graphics; 
    Lib.current.addChild(this); 

註釋掉它們,並一次一個地介紹它們,直到「遊戲構造函數」不再顯示。然後你知道從哪裏開始調查。

+0

試過,仍然沒有別的。 – RCIX 2010-09-02 22:36:20

+0

所以,如果你註釋掉整個構造不同的是它不工作的痕跡? – 2010-09-02 22:50:53

+0

正確。奇怪的... – RCIX 2010-09-02 23:58:23

0

安迪說,不使用的DisplayObject。我建議你使用Sprite。 DisplayObject是例如父類的返回類型,這可能會非常棘手,DisplayObject應該只在與Sprite,Shape,MovieClip等一般處理時使用......它不應該用於創建顯示項目,所以只能用於像接口,當你想更一般地處理幾種類型的顯示對象時。

例如...

var sp: DisplayObject = cast new Sprite(); 
var mc: DisplayObject = cast new MovieClip(); 

setX(sp, 20); 
setX(mc, 20); 

function setX(do: DisplayObject, val: Float) 
{ 
do.x += val; 
}