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

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

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

Регистрация: Dec 2009
Сообщений: 125
Записей в блоге: 1
По умолчанию Bitmap на сцене не изменяется, если ему присвоить другое значение

При клике photo1 присваивается другое значение, но на сцене это изменение не перерисовывается...

Код AS3:
sp1.addChild(photo1);
addEventListener(MouseEvent.CLICK, nextPhoto);
 
		public function nextPhoto(e:MouseEvent):void {
			photo1 = massiv[i+1];
                 }
А так меняется

Код AS3:
sp1.addChild(photo1);
addEventListener(MouseEvent.CLICK, nextPhoto);
 
		public function nextPhoto(e:MouseEvent):void {
			sp1.removeChild(photo1);
			photo1 = massiv[i+1];
			sp1.addChild(photo1);
                 }
Там что нужно какой-то метод перерисовки вызывать?

Добавлено через 9 минут
Какая прелесть...
Код AS3:
sp1.addChild(photo1);
addEventListener(MouseEvent.CLICK, nextPhoto);
 
		public function nextPhoto(e:MouseEvent):void {
			photo1.bitmapData = massiv[i+1].bitmapData;
                 }
И этот работает. Вопрос в силе, почему первый код не пашет?

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

Регистрация: Nov 2008
Адрес: Казахстан
Сообщений: 204
Отправить сообщение для Fillini с помощью ICQ
Цитата:
Вопрос в силе, почему первый код не пашет?
photo1 - это всего лишь ссылка на объект Bitmap.
photo1 = massiv[i+1]; - тут ссылку переопределили на другой объект. прежний остался без ссылки но он существует в дисплей листе.

Старый 06.01.2012, 03:19
SvetozarPNZ вне форума Посмотреть профиль Отправить личное сообщение для SvetozarPNZ Найти все сообщения от SvetozarPNZ
  № 3  
Ответить с цитированием
SvetozarPNZ
 
Аватар для SvetozarPNZ

Регистрация: Dec 2009
Сообщений: 125
Записей в блоге: 1
Спасибо. Да у меня все представление об объектах перевернулось. С головы на ноги.

Старый 06.01.2012, 03:32
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 4  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Цитата:
Какая прелесть...
Код AS3:
sp1.addChild(photo1);
addEventListener(MouseEvent.CLICK, nextPhoto);
 
		public function nextPhoto(e:MouseEvent):void {
			photo1.bitmapData = massiv[i+1].bitmapData;
                 }
Этот вариант самый правильный в данной ситуации, хотя вам виднее, ваша софтинка.
Если массив нужен только чтобы картинки менялись то лучше хранить только битмапДаты, во-парвых меньше памяти на хранение (хотя там фигня экономится), а во вторых минус всякие РемувЧилд АддЧилд.

Добавлено через 36 секунд
Ну и соответственно убрать из массива битмапы и хранить только битмапдаты напрямую.
__________________
Кто к нам с чем для чего - тот у нас того от того.

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

Регистрация: Dec 2009
Сообщений: 125
Записей в блоге: 1
А такое присвоение никак не влияет на элементы массива? А то, че-то он через круг последний рисунок стал выдавать

Код AS3:
		public function nextPhoto(e:MouseEvent):void {
			photo1.bitmapData = massiv[i].bitmapData;
			photo1.scaleX = .1;
			photo1.scaleY = .1;
			if (i>=massiv.length-1) {
				i = 0;
			}
			trace(sp2.contains(photo2));
			photo2.bitmapData = massiv[i+1].bitmapData;
			i++;
		}

Старый 06.01.2012, 04:49
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 6  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Код AS3:
		public function nextPhoto(e:MouseEvent):void 
		{
			photo1.bitmapData = photo2.bitmapData;
			photo1.scaleX = photo1.scaleY = .1;
 
			i<massiv.length - 1 ? i++ : i = 0 ;
 
			trace(sp2.contains(photo2));
 
			photo2.bitmapData = massiv[i].bitmapData;
		}
Я бы примерно так сделал.
__________________
Кто к нам с чем для чего - тот у нас того от того.

Старый 06.01.2012, 12:51
SvetozarPNZ вне форума Посмотреть профиль Отправить личное сообщение для SvetozarPNZ Найти все сообщения от SvetozarPNZ
  № 7  
Ответить с цитированием
SvetozarPNZ
 
Аватар для SvetozarPNZ

Регистрация: Dec 2009
Сообщений: 125
Записей в блоге: 1
Только там i++ и i = 0 местами надо поменять. Че-то все равно доходит до последней фотки, а та на первую уже не меняется. Вывел содержимое массива на сцену - все элементы вдруг стали одной фоткой... Где ж я массив-то изменил?

Код AS3:
package {
 
	import flash.display.*;
	import flash.text.*;
	import flash.events.MouseEvent;
	import flash.events.*;
	import flash.geom.*;
	import flash.net.*;
 
	public class ChangePhoto extends Sprite {
		var photo1:Bitmap; // верхний битмап
		var photo2:Bitmap; // нижний битмап
		var sp1:Sprite = new Sprite; //верхний спрайт
		var sp2:Sprite = new Sprite; //нижний спрайт
		var massiv:Array = []; //массив фоток
		var i = 0; //номер фотки, которая отображается сейчас
 
		public function ChangePhoto(massOfPhoto) {
			addChildAt(sp2,0);
			addChildAt(sp1,1);
			massiv = massOfPhoto;
			photo1 = massiv[i];
			massiv.length<2 ? photo2 = massiv[i] : photo2 = massiv [i+1];
			i++;
			photo1.scaleX =	photo1.scaleY = photo2.scaleX =	photo2.scaleY = .1;
			photo2.x = photo2.y = 10;
			sp1.addChild(photo1);
			sp2.addChild(photo2);
			addEventListener(MouseEvent.CLICK, nextPhoto);
		}
		public function nextPhoto(e:MouseEvent):void {
			photo1.bitmapData = massiv[i].bitmapData;
			photo1.scaleX = photo1.scaleY = .1;
			i>=massiv.length-1 ? i = 0 : i++; 
			photo2.bitmapData = massiv[i].bitmapData;
		}
	}
}
Добавлено через 3 часа 36 минут
Не без помощи умных людей проблема разрешилась. Загвоздка все в тех же ссылках на объекты. Я изменил photo1 и photo2 на элементы массива и управлял ими, а не объектами на сцене.
Рабочий код класса, который принимает в качестве параметра массив битмапов и чередует их на сцене на событие клика:

Код AS3:
package {
 
	import flash.display.*;
	import flash.text.*;
	import flash.events.MouseEvent;
	import flash.events.*;
	import flash.geom.*;
	import flash.net.*;
 
	public class ChangePhoto extends Sprite {
		var photo1:Bitmap; // верхний битмап
		var photo2:Bitmap; // нижний битмап
		var sp1:Sprite = new Sprite; //верхний спрайт
		var sp2:Sprite = new Sprite; //нижний спрайт
		var massiv:Array = []; //массив фоток
		var i = 0; //номер фотки, которая отображается сейчас
 
		public function ChangePhoto(massOfPhoto) {
			addChildAt(sp2,0);
			addChildAt(sp1,1);
			massiv = massOfPhoto;
			photo1 = new Bitmap(massiv[i].bitmapData);
			massiv.length<2 ? photo2 = new Bitmap(massiv[i].bitmapData) : photo2 = new Bitmap(massiv[i+1].bitmapData);
			i++;
			photo2.x = photo2.y = 10;
			sp1.addChild(photo1);
			sp2.addChild(photo2);
			addEventListener(MouseEvent.CLICK, nextPhoto);
		}
		public function nextPhoto(e:MouseEvent):void {
			photo1.bitmapData = massiv[i].bitmapData;
			i>=massiv.length-1 ? i = 0 : i++; 
			photo2.bitmapData = massiv[i].bitmapData;
		}
	}
}

Старый 06.01.2012, 18:39
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 8  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Цитата:
Только там i++ и i = 0 местами надо поменять.
Я там вообще-то условие тоже менял и в моем варианте всё ок с этим было))

Ну разрешился вопрос и ок
__________________
Кто к нам с чем для чего - тот у нас того от того.

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

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

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


 


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


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