Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   FlashDevelop AS3 Загрузка изображения из сети (http://www.flasher.ru/forum/showthread.php?t=214213)

DeeMOONger 10.05.2017 14:40

FlashDevelop AS3 Загрузка изображения из сети
 
Здравствуйте!
Я новичок в программировании AS3. Возникла проблема. Скажу сразу: Да, я искал ответ на этом форуме, и да - находил разные варианты. Но, видимо, мой случай несколько уникален, потому и спрашиваю.

Работаю в FlashDevelop + Flex. Код привожу нужный, ненужное выкинул.

Есть основной код:

main.as

Код AS3:

package
{
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.sampler.NewObjectSample;
 
  public class Main extends Sprite
  {
    private var usrprofile : Profile;
    private var provider : Provider;
    private var srvdata : ServerData;
    private var loadscr : LoadingScreen;
    private var gameData : GameData;
 
    public function Main()
    {
      if (stage) init();
      else addEventListener(Event.ADDED_TO_STAGE, init);
    }
 
    private function init(e:Event = null):void
    {
      removeEventListener(Event.ADDED_TO_STAGE, init);
 
      gameData = new GameData();
      provider = new Provider( stage, gameData );
      srvdata = new ServerData( gameData );
      usrprofile = new Profile( srvdata, gameData );
      loadscr = new LoadingScreen();
      loadscr.isvisible = false;
 
      addEventListener(Event.ENTER_FRAME, newFrame );
    }
 
    private function newFrame(e:Event = null):void
    {
      switch( sceneid )
      {
        case scene_id_profile:
            addChild( usrprofile );
            usrprofile.Update();
          }
          break;
      }
    }
  }
 
}

Как видно, из него вызывается Update профиля.

profile.as

Код AS3:

package 
{
  public class Profile extends Sprite
  {
    private var gd:GameData;
 
    public function Profile( serv:ServerData, gamedata:GameData )
    {
      super();
 
      srvdata = serv;
      gd = gamedata;
    }
 
    public function Update():void
    {
      gd.LoadAva();
    }
}

Уже здесь вызывается функция загрузки аватарки игрока из класса GameData.

GameData.as

Код AS3:

package 
{
  import flash.display.Bitmap;
  import flash.display.BitmapData;
  import flash.events.*;
  import flash.display.Loader;
  import flash.display.LoaderInfo;
  import flash.display.Sprite;
  import flash.net.URLRequest;
 
  public class GameData extends Sprite
  {
    public var user_photo:String;
    public var user_ava:Bitmap;
 
    public var loader:Loader;
    private var url:URLRequest;
    private var bitmapData:Bitmap;
 
    public function GameData()
    {
      user_photo = new String();
    }
 
    public function LoadAva():void
    {
      loader = new Loader;
      loader.contentLoaderInfo.addEventListener( Event.COMPLETE, onLoadComplete );
 
      url = new URLRequest( String("http://myweb.site/test.png") );
      loader.load( url );
      addChild(loader);
    }
 
    private function onLoadComplete(e:Event):void
    {
1:      bitmapData = e.target.loader.contentLoaderInfo.content as Bitmap;
2:      user_ava = new Bitmap( bmp.bitmapData );
    }
  }
 
}

Здесь я пронумеровал 2 строчки.

И вот она проблема: функция onLoadComplete обрывается на строке 1. Т.е. строка 2 не срабатывает, но при этом приложение работает, как ни в чем не бывало. Ни ошибок, ни Adobe FP Debug ничего не пишет. И в итоге изображения нет.

Пробовал строку 1 делать так:

Код AS3:

bitmapData = loader.contentLoaderInfo.content as Bitmap;

Результат тот же.

В чём проблема? Что я делаю не так?

FlashRus 10.05.2017 15:08

1. В e.target в методе onLoadComplete лежит ссылка на LoaderInfo, так-что бегать туда-сюда (e.target.loader.contentLoaderInfo...) смысла нет. Достаточно сделать:
Код AS3:

bitmapData = ((event.target as LoaderInfo).content as Bitmap).bitmapData;

Ну и по хорошему, всё-же должно быть так:
Код AS3:

bitmapData = (loader.contentLoaderInfo.content as Bitmap).bitmapData;

2. Вторая строка вообще никак не связана с первой т.к. в ней используется свойство bitmapData какого-то bmp, который в GameData даже не объявлен.

caseyryan 10.05.2017 18:12

Цитата:

Сообщение от FlashRus (Сообщение 1200564)
1. В e.target в методе onLoadComplete лежит ссылка на LoaderInfo, так-что бегать туда-сюда (e.target.loader.contentLoaderInfo...) смысла нет. Достаточно сделать:
Код AS3:

bitmapData = ((event.target as LoaderInfo).content as Bitmap).bitmapData;

Ну и по хорошему, всё-же должно быть так:
Код AS3:

bitmapData = (loader.contentLoaderInfo.content as Bitmap).bitmapData;

2. Вторая строка вообще никак не связана с первой т.к. в ней используется свойство bitmapData какого-то bmp, который в GameData даже не объявлен.

Оба предложенных варианта не сработают, потому что переменная называется bitmapData, но тип при этом объявлен как Bitmap (это не одно и тоже, bitmapData - это основа, из которой делаются объекты Bitmap, если так будет понятнее). Все это отвалится ещё на этапе компиляции

Во-первых, советую проверять типы в документации. Нужно переименовать (чтоб не путаться)
Код AS3:

 private var bitmapData:Bitmap;

в
Код AS3:

 private var bitmapData:BitmapData;

Ну а дальше уже как написал FlashRus

DeeMOONger 10.05.2017 18:46

Ага, спасибо! Вы правы и я был прав - делал также (просто код уже переломанный выложил).
Проблема оказалась грустнее - с локального сервера грузит, а с реального из интернета - нет. Не с протокола http, не с https. Есть рецепт?

caseyryan 10.05.2017 19:19

все дело в файле crossdomain.xml, который должен лежать в корне нужного домена, и разрешать загрузку для флешки, лежашей на указанном домене, либо для всех флешек *

DeeMOONger 10.05.2017 19:53

На моём сайте такой лежит. Т.е. получается, что если я захочу слизнуть во флеш изображение, то придется юзать php-прокладку на своём сайте между флеш и сторонним сайтом? А напрямую никак-никак совсем? Всё ясно...
Ладно, в любом случае, всем огроменное спасибо за помощь и консультации!
Креатива всем!

Добавлено через 15 минут
Добавляю: при выгрузке флеш в ВК всё заработало. А в режиме теста на локальной машине не грузит из ВК. Стрёмно так разработочку вести...

caseyryan 11.05.2017 07:18

Цитата:

Добавляю: при выгрузке флеш в ВК всё заработало. А в режиме теста на локальной машине не грузит из ВК. Стрёмно так разработочку вести...
У тебя точно отладочный плеер установлен? Отладочному должны быть пофиг все эти политики


Часовой пояс GMT +4, время: 17:08.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.