PDA

Просмотр полной версии : Размеры Stage в IE и Standalone FP


Astraport
27.10.2011, 13:16
Пытаюсь разобраться в pure AS3. Работаю в FB 4.5
Создаю новый AS3 проект. Задаю параметры SWF
[SWF(width='200', height='500', backgroundColor='#E4CFA8', frameRate='30')]
Инициализирую Stage.
public function Shuffle()
{
if (stage) init();
else this.addEventListener(Event.ADDED_TO_STAGE, init);
}

public function init(e:Event = null):void {
this.removeEventListener(Event.ADDED_TO_STAGE, init);
stage.align = StageAlign.BOTTOM;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.stageWidth = 200; //это вообще ни на что не влияет
stage.stageHeight = 500; //это вообще ни на что не влияет
}

Трейсю в врапере (IE):
trace (stage.stageWidth); //0
Тресю стендалон плеер:
trace (stage.stageWidth); //500 - вообще мрак

Откуда это? И как правильно задать параметры флэшки?

Inet_PC
27.10.2011, 14:23
Добавьте в init:
var g: Graphics = this.graphics;
g.beginFill(0, 0);
g.drawRect(0, 0, 200, 500);
g.endFill();

trace(stage.width);
trace(stage.height);

stageWidth (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/display/Stage.html?filter_flash=cs5&filter_flashplayer=10.2&filter_air=2.6#stageWidth)

Astraport
27.10.2011, 15:44
Спасибо.
Но видел проекты, где этого не делают.

Inet_PC
27.10.2011, 15:56
где этого не делают
Чего этого? Вы о теге SWF? Ну так как же без него?

Astraport
27.10.2011, 16:05
Я о var g: Graphics = this.graphics;

Inet_PC
27.10.2011, 16:09
Это просто пример. Никто не заставляет Вас так делать. А в чем проблема то?

Astraport
27.10.2011, 16:11
Проблема в том, что без этого stage.stageWidth = 0 (к примеру) и невозможно позиционировать элементы не указывая абсолютные величины.

Inet_PC
27.10.2011, 16:16
В приведенной выше ссылке, написано что-такое stageWidth, эта величина зависит от размеров окна браузера или standAlone плеера. А stage.width зависит от содержимого, вот поэтому когда мы отрисовали что-то, stage.width изменилась. Возможно Вам следует слушать Event.RESIZE у Stage.

Astraport
27.10.2011, 16:17
Ясно. Спасибо.

Добавлено через 3 часа 30 минут
Продолжение следует...

Скомпилированная флэшка отлично отображается в браузере, но в CMS криво. Вернее отображается ТОЛЬКО то, что добавлено на stage.
Если же я добавлял элемент как this.addChild(myElement), то его не видно на сайте, но он есть в отдельном HTML.
Мистика какая-то...

Конечно, я могу везде переписать на stage.addChild(myElement) и все будет отображаться, но в флэшке у меня задействована сложная анимация и возникают ошибки в getChildIndex(myElement).
Самое интересное, на этот сайт постоянно флексовские флэшки размещаю - никогда проблем не было. А здесь решил сделать на чистом AS3, из-за размера и такая засада:(

Inet_PC
28.10.2011, 09:47
Может this не добавлен на сцену? Или координаты у this съехали?

Astraport
28.10.2011, 10:41
Что-то я вообще отстал от жизни... This нужно и можно добавлять на сцену? И как это делается и задаются координаты? Я просто всегда работал с Flex, возможно это основы, но там все это автоматом создается.

Тот прямоугольник, что вы советовали, отлично выводится (я его другим цветом закрасил для наглядности), кроме него, все что добавлено к this не выводится.
Флэшку вставил на сайт ifram`ом, но это же не дело.

Inet_PC
28.10.2011, 10:45
Трудно так ответить. Может в этом глюк:
stage.align = StageAlign.BOTTOM; на stage.align = StageAlign.TOP_LEFT;
Насчет, this. Если это главный класс приложения, то он добавлен на сцену. addChild добавляет любой визуальный объект(любой наследник от DisplayObject) в список отображения. Координаты - это свойста x, y визуального объекта.

Astraport
28.10.2011, 13:46
Трудно так ответить. Может в этом глюк:
Да нет. Эти мелочи я все по 10 раз перепроверил.

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

Даже делал вот так. Создавал var tf:TextField, добавляю как this.addChild(tf) - в HTML вижу, на сайте - не вижу. Добавляю как stage.addChild(tf) - вижу везде, но меня этот вариант не устраивает.

crazyone
28.10.2011, 14:08
Может код покажешь?

Astraport
28.10.2011, 14:15
Это главный класс, есть ещё Card, но он не важен.
package
{
import com.greensock.TweenLite;

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Graphics;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.HTTPStatusEvent;
import flash.events.MouseEvent;
import flash.filters.DropShadowFilter;
import flash.filters.GlowFilter;
import flash.net.URLRequest;
import flash.system.Security;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;

[SWF(width='200', height='310', backgroundColor='#E4CFA8', frameRate='30')]
public class Shuffle extends Sprite
{

private var card:Card;
private var bitmapData:BitmapData;
protected var deckX:Number = 104;
protected var deckY:Number = 400;
private var loader:Loader = new Loader();
[Embed(source = 'images/btn.png')]
private static const Btn:Class;
private var btn:Bitmap;
private var currentPic:int = 0;
private var currentPic2:int = 0;
public function Shuffle()
{
if (stage) init();
else this.addEventListener(Event.ADDED_TO_STAGE, init);
}

public function init(e:Event = null):void {
Security.allowDomain("*");
this.removeEventListener(Event.ADDED_TO_STAGE, init);
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
var g:Graphics = this.graphics;
g.beginFill(0xE4CFA8);
g.drawRect(0, 0, 200, 310);
g.endFill();
loadDeck();
}

protected function loadDeck():void
{
var n:int = this.numChildren;
for (var i:int = 0; i < n; i++){
this.removeChild(this.getChildAt(0));
}
currentPic = 0;
currentPic2 = 0;

loader = new Loader();
var rnd:Number = randomNumber();
var request:URLRequest = new URLRequest("images/cards/" + rnd + ".jpg");
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
loader.addEventListener(HTTPStatusEvent.HTTP_STATUS,onError);
loader.load(request);
}

protected function randomNumber(low:Number=0, high:Number=14):Number
{
return Math.floor(Math.random() * (1+high-low)) + low;
}

protected function onError(event:Event):void
{
}

protected function onComplete(event:Event):void
{
bitmapData = Bitmap(LoaderInfo(event.target).content).bitmapData;
showDeck();
}

private function showDeck():void
{
if (currentPic==5){
var myFormat:TextFormat = new TextFormat();
myFormat.size = 18;
myFormat.align = TextFormatAlign.CENTER;
var txt:TextField = new TextField;
txt.x = 5;
txt.y = 10;
txt.width = stage.width - 10;
txt.height = 48;
txt.multiline = true;
txt.wordWrap = true;
txt.setTextFormat(myFormat);
txt.defaultTextFormat = myFormat;
txt.selectable = false;
txt.text = 'Бла-бла';
addChild(txt);
animations2();
return;
}
card = new Card(currentPic, bitmapData);
card.x = deckX - card.width/2 - currentPic*5;
card.y = deckY - card.height/2 - currentPic*5;
card.addEventListener(MouseEvent.CLICK, onClick);
card.rotationX = 180;
card.filters = [new DropShadowFilter(1, 45, 0x000000, 0.8, 8, 8, 1)];
card.name = "card" + String (currentPic);
addChild(card);
deckAnimation(card);
currentPic++;
}

private function animations2():void
{
if(currentPic2==5){
return;
}
var cardA:Card = this.getChildByName("card" + String (currentPic2)) as Card;
if (currentPic2%2 == 0){
var xPos:Number = - 150;
} else {
xPos = 150;
}
TweenLite.to(cardA, 0.8, {x:cardA.x + xPos, onComplete:placeOnTop, onCompleteParams:[cardA, cardA.x]});
currentPic2++;
}

private function placeOnTop(mc:Card, xpos:int):void{
addChild(mc)
TweenLite.to(mc, 0.8, {x:xpos, onComplete:animations2});
}


private function deckAnimation(cardA:Card):void
{
TweenLite.to(cardA, 0.5, { x: cardA.x + 10, y: cardA.y + 10, onComplete: showDeck} );
}

protected function onClick(event:MouseEvent):void
{
var n:int = this.numChildren;
for (var i:int = 0; i < n; i++){
TweenLite.killTweensOf(this.getChildAt(i));
}
clearTable();
var card:Card = event.currentTarget as Card;
addChild(card);
TweenLite.to( card, 1, { x: 25, y: 90, rotationX: 0, onUpdate: card.reverse } );
}

protected function clearTable():void
{
var n:int = this.numChildren;
for (var i:int = 0; i < n; i++){
this.removeChild(this.getChildAt(0));
}
btn = new Btn() as Bitmap;
btn.x = 50;
btn.y = 40;
btn.smoothing = true
btn.addEventListener(MouseEvent.CLICK, onClickBtn);
var btnContainer:Sprite = new Sprite();
btnContainer.addEventListener(MouseEvent.CLICK, onClickBtn);
btnContainer.buttonMode = true;
btnContainer.addChild(btn);
addChild(btnContainer);
}

protected function onClickBtn(event:Event):void
{
loadDeck();
}
}
}

Inet_PC
28.10.2011, 15:16
Ваш, код вроде работает, загружается несколько картинок, к верх ногами, перемешиваются как карты, и по клику, становятся не к верх ногами.
public class Card extends Sprite
{
public function Card(n: int, bd: BitmapData)
{
super();
addChild(new Bitmap(bd));
}

public function reverse(...args):void
{

}
}
У Вас такой же класс?
Можете дать ссылку на сайт с флешкой?

Astraport
28.10.2011, 15:55
У Вас такой же класс?
Да такой.
Можете дать ссылку на сайт с флешкой?
Отправил в ПМ