Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Синхронизация событий (http://www.flasher.ru/forum/showthread.php?t=175749)

AlexLeo 23.02.2012 12:49

Синхронизация событий
 
Не судите строго, AS изучаю буквально второй день... Знаю несколько других языков прикладных, и там как-то проще все это. В двух словах что реализуется: есть массив карты с координатами и индексами текстур, через load делаю подгрузку двух картинок(по мне очень криво), далее должен идти вывод карты на экран, но тут первая проблема, load живет своей жизнью, и весь скрипт его не ждет... т.е должен происходить вывод картинок, а их как бы нет. И 2 вопрос, как можно создать массив текстур (1.jpg,2.jpg,3.jpg,4.jpg) с подгрузкой картинок, и далее накладывать (копировать,клонировать) их на другие объекты? Пожалуйста не судите строго..

Код AS3:

package 
{
        import flash.events.*;
        import flash.display.*;
        import flash.net.*;
        import flash.geom.*;
        import flash.text.*;
 
        public class Main extends Sprite
        {               
 
                public var imageLoader:Loader = new Loader();
                public var imageLoader1:Loader = new Loader();
                public static var masmap:Array = new Array();
                public static var masmap_texture:Array = new Array();
 
                public static var bmp:Bitmap;
                public static var bmp1:Bitmap;
                public static var bmpmas:Array = new Array();
                public static var bmpmasindex:int;
 
                public function Main():void
                {
                        bmpmasindex = 0;
 
                        masmap[0] = 'x0y0';
                        masmap_texture[0] = 0;
                        masmap[1] = 'x1y0';
                        masmap_texture[1] = 0;
                        masmap[2] = 'x2y0';
                        masmap_texture[2] = 1;
                        masmap[3] = 'x0y1';
                        masmap_texture[3] = 0;
                        masmap[4] = 'x1y1';
                        masmap_texture[4] = 1;
                        masmap[5] = 'x2y1';
                        masmap_texture[5] = 0;
                        masmap[6] = 'x0y2';
                        masmap_texture[6] = 0;
                        masmap[7] = 'x1y2';
                        masmap_texture[7] = 0;
                        masmap[8] = 'x2y2';
 
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
 
 
                        var theURL:String = "../img/map/mapmini1.png";
                        var imageRequest:URLRequest = new URLRequest(theURL);
                        imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
                        imageLoader.load(imageRequest);
 
                        var theURL1:String = "../img/map/mapmini2.png";
                        var imageRequest1:URLRequest = new URLRequest(theURL1);
                        imageLoader1.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete1);
                        imageLoader1.load(imageRequest1);
 
                        var index_texture:int; var selectindex:int; var temp_string:String;
 
                        for (var ix:int = 0; ix <= 3; ix++) {
                                for (var iy:int = 0; iy <= 3; iy++) {
                                        temp_string = String('x') + String(ix) + String('y') + String(iy);
                                        selectindex = masmap.indexOf(temp_string);
                                        trace(temp_string);
                                        switch (index_texture)
                                        {
                                                case 0:
                                                        trace ("Вывод первой текстуры");
                                                        break;
                                                case 1:
                                                        trace ("Вывод сторой текстуры");
                                                        break;
                                        }       
                                }                       
                        }
                }
 
                public function onComplete(evt:Event):void
                {
                        bmp = imageLoader.content as Bitmap;
                        //addChild(imageLoader.content);
                        bmpmas[bmpmasindex] = new Bitmap(bmp.bitmapData);
                        bmpmas[bmpmasindex].x = 100;
                        bmpmas[bmpmasindex].y = 100;
                        addChild(bmpmas[bmpmasindex]);
                        bmpmasindex++;
 
                        //bmpmas[bmpmasindex] = new Bitmap(bmp.bitmapData);
                        //bmpmas[bmpmasindex].x = 100;
                        //bmpmas[bmpmasindex].y = 100;
                        //addChild(bmpmas[bmpmasindex]);
                        //bmpmasindex++;
 
                        var bmp3 = new Bitmap(bmp.bitmapData);
                        bmp3.x = 200;
                        bmp3.y = 200;
                        addChild(bmp3);               
                        trace ("Img Complete");
                }
 
                public function onComplete1(evt:Event):void{
                        bmp1 = imageLoader1.content as Bitmap;
                        //addChild(imageLoader1.content);
                        //imageLoader1.content.x = 200;
 
                        //var bmp2 = new Bitmap(bmp.bitmapData);
                        //bmp2.x = 300;
                        //bmp2.y = 300;
                        //addChild(bmp2);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                }
 
        }
 
}


Wolsh 23.02.2012 13:07

0. Как Вы думаете, что означает фраза "// entry point" в шаблоне класса?
1. Ну так ждите. Нет картинок – нет мультиков.
2. Загрузить картинки и сложить их в массив?
Непонятно, Вы хотите чтобы картинки были до того, как они загрузятся? Объясните логику вопроса.

AlexLeo 23.02.2012 13:29

0. Почитал почитал, так и не понял .. буду очень благодарен за объяснения.
1. Насчет картинок как бы стало понятно...
2. Есть карта (массив с координатами и индексом текстуры - каждая ячейка).
должна быть функция, которая подгрузит картинки(текстуры карты) и сохранит их в виде массива.
должно получиться примерно так:

Код:

textura_name[0]= "карта1";
textura_data[0] = bitmap;
textura_name[1]= "карта2";
textura_data[1] = bitmap;

далее идет стандартный цикл на вывод карты:

Код:

for(x,x,x){
  for(y,y,y){
        //Получаем координаты выводимого блока x,y
        //Узнаем с каким именем текстура в этой блоке
        //Получаем индекс текстуры по имени
        //Выводим на экран (допустим) textura_data[1] (причем должна быть копия объекта как я понимаю)
        //либо что-то типа bitblt в буфер вывода по координатам экрана
  }
}

готов даже материально отблагодарить, за помощь в этом деле...

Yahen 23.02.2012 14:23

AS - асинхронный язык. Программирование на нем осуществляется методом "пнул и забыл". А Вы пытаетесь использовать его как синхронный язык. То бишь программировать методом "Вызвал и получил результат".
Вот Вам простой пример на псевдоязыке синхронного сложения двух чисел и вывода результата:

f
PHP код:

unction SUM (ab)
{
return 
a+b
}

function 
OUPUT(c)
{
print (
c);
}

И его использование
с 
SUM(1,2);
OUPUT(c); 

А вот аналогичный пример, но асинхронный.


PHP код:

function SUM (abcallback)
{
callback(a+b);
}

function 
OUPUT(c)
{
print (
c);
}

SUM(a,b,OUTPUT); 

Улавливаете разницу?

Цитата:

Сообщение от AlexLeo (Сообщение 1064897)
должна быть функция, которая подгрузит картинки(текстуры карты) и сохранит их в виде массива.

В рамках асинхронного программирования неправильно ставите задачу.
Должны быть две функции. Первая - инициирует загрузку картинок. Вторая - умеет что-то делать с загруженной картинкой ( куда-то складывать, показывать и т п.) Первую вызываете Вы. Вторая - обратный вызов вызывается в потоке самим loader-ом

Wolsh 23.02.2012 14:58

Цитата:

0. Почитал почитал, так и не понял .. буду очень благодарен за объяснения.
Шаблон подсказывает, что именно здесь находится "точка входа", то есть код инициализации экземпляра класса должен начинаться "здесь".
У Вас в конструкторе осталась подписка на событие добавления экземпляра на стейдж. Это момент, когда надо начать инициализацию (так как в подавляющем большинстве случаев визуальному экземпляру надо иметь ссылку на стейдж, а она доступна после добавления этого экземпляра на стейдж))). Что эта подписка сейчас делает в Вашем коде, Вы наверное сами не понимаете – вызывает метод init(), но зачем, если все что в этом методе есть – это отписка от события, которое его вызвало))))
Дело вобщем в том, что весь код, который сейчас у Вас в конструкторе (кроме упомянутой подписки), должен располагаться в методе init(), то есть вызываться только после того, как экземпляр будет добавлен на сцену. Это не относится к вопросу топика, не решает его проблему. Это просто замечание, что класс написан в корне неверно.
Цитата:

должна быть функция, которая подгрузит картинки(текстуры карты) и сохранит их в виде массива.
Используйте загрузчик с очередью или многопоточный, например популярный BulkLoader или свою более узкую реализацию напишите. В любом случае мыслите событиями, они не последовательны, они возникают через какое-то время (требующееся на загрузку например, как в данном случае), в то время как код выполняется "до конца блока кода". Необходимо сначала все загрузить и сформировать массив, а потом уже с ним работать. То есть код представляет собой не просто одну длинную функцию с вызовом "подпрограмм", а набор из нескольких [десятков, сотен?] обработчиков событий, вызываемых в неизвестный момент времени и в неизвестной заранее последовательности. Все что Вы можете сделать в этом хаосе – определить, после какого события вы будете слушать другое событие. Так понятней?

AlexLeo 23.02.2012 18:53

Более менее стало понятно, но вопросов еще больше появилось... Вот что получилось сейчас http:// coolfuns. net/ ... Безграничная карта с динамично подгружающимися текстурами.


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

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