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,在获得调试播放器后它仍然不起作用。看看我的问题