2010-09-02 52 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; 
}