Отображать текстовый центральный экран

#flash #actionscript-3

#flash #actionscript-3

Вопрос:

Привет, ребята, мне нужно отобразить сообщение в проекте Flash, над которым я работаю. Сообщение должно располагаться по центру экрана и может быть создано только с помощью кода.

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

Спасибо, Макс

Ответ №1:

Я бы создал класс, в центре которого находится текстовое поле. Затем создайте новый экземпляр, когда вам нужно отобразить сообщение, и добавьте его на сцену. Вот очень упрощенный пример:

 package
{
     import flash.display.Sprite;
     import flash.text.TextField;
     import flash.text.TextFieldAutoSize;

     public class Message extends Sprite {

          private var tf:TextField;
          private var s:Sprite;

          public function Message(msg:String) {
               s = new Sprite();
               s.graphics.beginFill(0,0);
               s.graphics.drawRect(0,0,800,600);
               s.graphics.endFill();
               addChild(s);

               tf = new TextField();
               tf.autoSize = TextFieldAutoSize.CENTER;
               tf.width = 400;
               tf.text = msg;
               tf.x = (s.width-tf.textWidth)*0.5;
               tf.y = (s.height-tf.textHeight)*0.5;
               addChild(tf);
          }
     }
}
  

Я бы добавил к этому другие функции и, возможно, даже добавил прослушиватель изменения размера, чтобы сохранить его в центре. Вы также могли бы добавить несколько кнопок для закрытия сообщения. Спрайт добавляется только для отключения любых щелчков мыши под сообщением. Помогает ли это?

Комментарии:

1. На самом деле, что касается приведенного выше кода, он хорош, за исключением того, что для автоматического изменения размера по центру вам просто нужно поместить x / y в stage.stageWidth * .5 и stage.stageHeight * .5 без установки свойства width текстового поля или установки его в 0. Затем, после выполнения этих преобразований, установите свойство text. Это будет идеально отцентрировано. Единственная незначительная корректировка, которую вам нужно будет сделать, это добавить TextField.TextHeight * .5 к свойству y текстового поля, чтобы текст был центрирован точно посередине.

2. Извините, забыл упомянуть, что прямоугольник «800×600» должен соответствовать ширине и высоте вашей сцены. Единственная причина, по которой я не поместил stage.stageWidth и т.д., Заключается в том, что из функции конструктора этого класса stage еще не существует. Вы могли бы либо передать ширину / высоту через параметры, либо добавить прослушиватель событий «ADDED_TO_STAGE», а затем изменить размер в соответствии с шириной / высотой сцены. Опять же, это очень упрощенный класс, но, как указала @Ascension Systems, вы можете просто использовать автоматический центр размера для центрирования поля.

Ответ №2:

Динамически центрировать содержимое во Flash довольно просто; свойства stage.stageWidth и stage.stageHeight можно использовать для определения размера холста Flash Player. Все DisplayObject, прикрепленные к DisplayList, имеют доступ к свойству stage; единственная проблема заключается в том, что это свойство будет иметь значение null в функции конструктора, поскольку оно еще не было добавлено в DisplayList; однако мы можем легко обойти это с помощью прослушивателя событий:

 public class AutoStageCenterSprite extends Sprite
{
    public function AutoStageCenterSprite()
    {
        if (stage == null) {
            // Wait to be added to Stage before we activate the Resize Listener.
            addEventListener(Event.ADDED_TO_STAGE, onAddedToStageEvent);
        }
        else {
            centerOnStage();
        }
    }

    private function onAddedToStageEvent(event : Event) : void
    {
        // Now we've been added we can center ourselves...
        centerOnStage();

        // We will also register for Resize  Events so we can update our position
        // is the Stage dimensions change.
        stage.addEventListener(Event.RESIZE, onResizeEvent);
    }

    private function centerOnStage() : void
    {
        x = (stage.stageWidth / 2) - (width / 2);
        y = (stage.stageHeight / 2) - (height / 2);
    }

    private function onResizeEvent(event : Event) : void
    {
        // This event listener will be tripped each the Stage is resized.
        if (stage != null) {
            centerOnStage();
        }
    }
}
  

Следующая часть вашего вопроса касается того, как добавить текстовое поле в уравнение. API Flash TextField. Вы могли бы либо расширить класс TextField и добавить код центрирования; или вместо этого использовать composition и создать новый экземпляр TextField внутри вашего AutoStageCenterSprite.