代码之家  ›  专栏  ›  技术社区  ›  RCIX

haxe-代码拒绝工作

  •  0
  • RCIX  · 技术社区  · 14 年前

    我有以下代码:

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

    但我得到的唯一跟踪输出是“游戏开始”;其他的都不是跟踪或工作。为什么?

    更新: 在解决了屏幕边界问题之后,仍然存在以下问题:

    • 我的onframeenter或update调用都没有跟踪过;为什么?
    • 从DisplayObject扩展我的游戏类会使事情陷入停顿,无论我是否调用 super(); 在构造函数中。

    更新: 由于第一个问题是一个单独的问题,我将把它分成另一个问题。

    3 回复  |  直到 7 年前
        1
  •  6
  •   Andy Li    14 年前

    来自AS3语言参考:

    DisplayObject是抽象基类;因此,不能直接调用DisplayObject。调用New DisplayObject()会引发ArgumentError异常。

    所以基本上你应该扩展 Shape Sprite 而不是 DisplayObject .

        2
  •  1
  •   Preet Sangha    14 年前

    自从

        trace("Game constructor");
    

    如果不是打印,我会说错误在上面的一行。

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

    把它们注释掉,一次介绍一个,直到不再显示“游戏构造函数”。然后你知道从哪里开始调查。

        3
  •  0
  •   Justinfront    12 年前

    正如安迪所说,不要使用DisplayObject。我建议你用雪碧。以DisplayObject为例,父对象的返回类型比较复杂,通常只在处理sprite、shape、movieclip等时才使用DisplayObject。它不应该用于创建显示项,因此仅在您希望更一般地处理几种类型的显示对象时,才像界面一样使用。

    例如。。。

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