Flash Haxe——代码拒绝工作

Flash Haxe——代码拒绝工作,flash,haxe,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.geo

我有以下代码:

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();
 }
}
包;
导入flash.display.DisplayObject;
导入flash.display.Graphics;
导入flash.display.MovieClip;
导入flash.display.Shape;
导入flash.display.Sprite;
导入flash.events.Event;
导入flash.events.MouseEvent;
导入flash.geom.Rectangle;
导入flash.Lib;
导入flash.utils.Timer;
/**
* ...
*@作者RCIX
*/
班长
{
静态函数main()
{
跟踪(“游戏开始”);
var游戏:游戏=新游戏();
game.Run();
跟踪(“游戏完成”);
}
}
类游戏扩展了DisplayObject
{
var-rectX:Int;
变量:Int;
var-velocityX:Int;
var-velocityY:Int;
变量:矩形;
var图形:图形;
公共职能(新增)
{
超级();
screenBounds=Lib.current.getBounds(新的DisplayObject());
图形=Lib.current.graphics;
Lib.current.addChild(this);
跟踪(“游戏构造函数”);
}
公共功能运行()
{
跟踪(“运行”);
Lib.current.addEventListener(Event.ENTER_FRAME,OnFrameEnter);
速度x=1;
速度y=1;
}
函数OnFrameEnter(事件:event)
{
跟踪(“OnFrameEnter”);
graphics.beginll(0xFFFFFF,0xFFFFFF);
graphics.drawRect(0,0,screenBounds.width,screenBounds.height);
graphics.endFill();
更新();
}
函数更新()
{
跟踪(“更新”);
如果(rectX+50>screenBounds.width ||
rectX<0)
{
速度x*=-1;
}
如果(rectY+50>screenBounds.height | |
直肠<0)
{
速度y*=-1;
}
rectX+=1;
rectY+=1;
图形填充(0xFF0000);
graphics.drawRect(rectX,rectY,50,50);
graphics.endFill();
}
}
但我得到的唯一跟踪输出是“游戏开始”;没有其他东西在跟踪或工作。为什么?

更新:修复屏幕边界问题后,仍存在以下问题:

  • 我的OnFrameEnter或Update调用都没有跟踪;为什么?
  • 从DisplayObject扩展我的游戏类会使事情陷入停顿,并且永远无法访问我的任何其他代码,无论我是否调用
    super()
更新:因为第一个问题是一个单独的问题,所以我将其拆分为另一个问题

    trace("Game constructor");
没有打印,我认为错误在上面的一行

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

注释出来,一次介绍一个,直到不再显示“游戏构造器”。然后你就知道从哪里开始调查了。

来自AS3语言参考: DisplayObject是一个抽象基类;因此,不能直接调用DisplayObject。调用new DisplayObject()会引发ArgumentError异常


所以基本上你应该扩展
Shape
Sprite
,而不是像Andy说的那样扩展
DisplayObject

,不要使用DisplayObject。我建议你用雪碧。例如,DisplayObject是父对象的返回类型,这可能很棘手,DisplayObject只应在一般处理精灵、形状、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;
}

尝试过之后,仍然没有其他结果。因此,如果你注释掉整个构造函数(除了跟踪),它就不起作用了?进一步的研究表明,如果我扩展DisplayObject(甚至不必调用
super();
),或者保留在
screenBounds=Lib.current.getBounds(new DisplayObject())然后失败。在这种情况下,我建议您需要查看Lib.current.getBounds的API如何在当前游戏实例中传递API引用没有帮助--(搜索getBounds)。我只是想得到屏幕的界限;也许我应该把这个问题分成多个独立的问题?我建议你安装一个调试播放器:。它的性能比发行版播放器差,但您会收到错误消息和堆栈跟踪(对于从FlashDevelop(您似乎使用的)进行的测试,独立的调试器应该足够了)。另外,与C#不同的是,按照惯例,在haXe中,PascalCase保留给类型和枚举构造函数。哎呀,不知怎的,我跳过了调试投影仪>@back2dos:oik,在获得调试播放器后它仍然不起作用。看看我的问题