Haxe - код отказывается работать - PullRequest
0 голосов
/ 03 сентября 2010

У меня есть следующий код:

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 никогда не отслеживается; Зачем?
  • Расширение моего класса Game из DisplayObject заставляет вещи останавливаться и никогда не доходить ни до какого другого моего кода, независимо от того, вызываю ли я super(); в конструкторе.

Обновление: , поскольку первая проблема - это отдельная проблема, я делю ее на другой вопрос.

Ответы [ 3 ]

6 голосов
/ 03 сентября 2010

Из языковой ссылки AS3:

DisplayObject является абстрактным базовым классом; следовательно, вы не можете вызывать DisplayObject напрямую. Вызов нового метода DisplayObject () вызывает исключение ArgumentError.

Так что в основном вы должны расширять Shape или Sprite вместо DisplayObject.

1 голос
/ 03 сентября 2010

С

    trace("Game constructor");

не печатает. Я бы сказал, что ошибка в одной из строк над ней.

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

комментируйте их и вводите по одному, пока «Конструктор игры» больше не будет отображаться. Тогда вы знаете, с чего начать расследование.

0 голосов
/ 01 октября 2012

Как говорит Энди, не используйте 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;
}
...