#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.