Haxe - 代码拒绝工作

时间:2010-09-02 22:25:53

标签: flash 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或Update调用都没有跟踪;为什么?
  • 从DisplayObject扩展我的Game类会让事情陷入停顿,永远不会触及我的任何其他代码,无论我是否在构造函数中调用super();

更新:,因为第一个问题是一个单独的问题,我将其分解为另一个问题。

3 个答案:

答案 0 :(得分:6)

来自AS3语言参考:

DisplayObject是一个抽象基类;因此,您无法直接调用DisplayObject。调用new DisplayObject()会抛出ArgumentError异常。

所以基本上你应该扩展ShapeSprite而不是DisplayObject

答案 1 :(得分:1)

    trace("Game constructor");

不打印我会说错误出现在它上面的一行中。

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

将它们评论出来并一次引入一个,直到“游戏构造函数”不再显示为止。然后你知道从哪里开始调查。

答案 2 :(得分:0)

Andy说,不要使用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;
}