【问题标题】:Haxe -- code refuses to workHaxe——代码拒绝工作
【发布时间】:2010-09-02 22:25:52
【问题描述】:

我有以下代码:

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

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

【问题讨论】:

  • 我建议你安装一个调试播放器:adobe.com/support/flashplayer/downloads.html。它的性能比发布播放器差,但是您会收到错误消息和堆栈跟踪(对于从 FlashDevelop(您似乎使用)进行测试,独立调试器就足够了)。此外,与 C# 不同,在 haXe 中,按照约定,PascalCase 保留给类型和枚举构造函数
  • 哎呀,不知怎么的,我跳过了调试投影仪>。
  • @back2dos: 哎呀,拿到调试播放器后还是不行。有关我的问题,请参阅 stackoverflow.com/questions/3623363/…

标签: flash haxe


【解决方案1】:

来自 AS3 语言参考:

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

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

【讨论】:

    【解决方案2】:

    自从

        trace("Game constructor");
    

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

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

    将它们注释掉并一次引入它们,直到不再显示“游戏构造函数”。然后你就知道从哪里开始调查了。

    【讨论】:

    • 试过了,还是一无所获。
    • 那么如果你注释掉除了跟踪之外的整个构造函数它不起作用?
    • 进一步的研究表明,如果我扩展 DisplayObject(甚至不必调用 super();)或离开 screenBounds = Lib.current.getBounds(new DisplayObject()); 行,那么它就会失败。
    • 在这种情况下,我建议您需要查看 Lib.current.getBounds 的 API 如何传入当前的 Game 实例
    • API 参考没有帮助——haxe.org/api/flash/movieclip(搜索 getBounds)。我只是想获得屏幕边界;也许我应该把它分成多个单独的问题?
    【解决方案3】:

    正如安迪所说,不要使用 DisplayObject。我建议你使用雪碧。例如,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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      相关资源
      最近更新 更多