Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 23.02.2012, 12:49
AlexLeo вне форума Посмотреть профиль Отправить личное сообщение для AlexLeo Найти все сообщения от AlexLeo
  № 1  
Ответить с цитированием
AlexLeo

Регистрация: Feb 2012
Сообщений: 3
По умолчанию Синхронизация событий

Не судите строго, 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
		}
 
	}
 
}

Старый 23.02.2012, 13:07
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
0. Как Вы думаете, что означает фраза "// entry point" в шаблоне класса?
1. Ну так ждите. Нет картинок – нет мультиков.
2. Загрузить картинки и сложить их в массив?
Непонятно, Вы хотите чтобы картинки были до того, как они загрузятся? Объясните логику вопроса.
__________________
Reality.getBounds(this);

Старый 23.02.2012, 13:29
AlexLeo вне форума Посмотреть профиль Отправить личное сообщение для AlexLeo Найти все сообщения от AlexLeo
  № 3  
Ответить с цитированием
AlexLeo

Регистрация: Feb 2012
Сообщений: 3
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 в буфер вывода по координатам экрана
   }
}
готов даже материально отблагодарить, за помощь в этом деле...

Старый 23.02.2012, 14:23
Yahen вне форума Посмотреть профиль Отправить личное сообщение для Yahen Посетить домашнюю страницу Yahen Найти все сообщения от Yahen
  № 4  
Ответить с цитированием
Yahen

Регистрация: Jan 2012
Сообщений: 35
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 Посмотреть сообщение
должна быть функция, которая подгрузит картинки(текстуры карты) и сохранит их в виде массива.
В рамках асинхронного программирования неправильно ставите задачу.
Должны быть две функции. Первая - инициирует загрузку картинок. Вторая - умеет что-то делать с загруженной картинкой ( куда-то складывать, показывать и т п.) Первую вызываете Вы. Вторая - обратный вызов вызывается в потоке самим loader-ом

Старый 23.02.2012, 14:58
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 5  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
0. Почитал почитал, так и не понял .. буду очень благодарен за объяснения.
Шаблон подсказывает, что именно здесь находится "точка входа", то есть код инициализации экземпляра класса должен начинаться "здесь".
У Вас в конструкторе осталась подписка на событие добавления экземпляра на стейдж. Это момент, когда надо начать инициализацию (так как в подавляющем большинстве случаев визуальному экземпляру надо иметь ссылку на стейдж, а она доступна после добавления этого экземпляра на стейдж))). Что эта подписка сейчас делает в Вашем коде, Вы наверное сами не понимаете – вызывает метод init(), но зачем, если все что в этом методе есть – это отписка от события, которое его вызвало))))
Дело вобщем в том, что весь код, который сейчас у Вас в конструкторе (кроме упомянутой подписки), должен располагаться в методе init(), то есть вызываться только после того, как экземпляр будет добавлен на сцену. Это не относится к вопросу топика, не решает его проблему. Это просто замечание, что класс написан в корне неверно.
Цитата:
должна быть функция, которая подгрузит картинки(текстуры карты) и сохранит их в виде массива.
Используйте загрузчик с очередью или многопоточный, например популярный BulkLoader или свою более узкую реализацию напишите. В любом случае мыслите событиями, они не последовательны, они возникают через какое-то время (требующееся на загрузку например, как в данном случае), в то время как код выполняется "до конца блока кода". Необходимо сначала все загрузить и сформировать массив, а потом уже с ним работать. То есть код представляет собой не просто одну длинную функцию с вызовом "подпрограмм", а набор из нескольких [десятков, сотен?] обработчиков событий, вызываемых в неизвестный момент времени и в неизвестной заранее последовательности. Все что Вы можете сделать в этом хаосе – определить, после какого события вы будете слушать другое событие. Так понятней?
__________________
Reality.getBounds(this);

Старый 23.02.2012, 18:53
AlexLeo вне форума Посмотреть профиль Отправить личное сообщение для AlexLeo Найти все сообщения от AlexLeo
  № 6  
Ответить с цитированием
AlexLeo

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 12:43.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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