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

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

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

Регистрация: Dec 2010
Адрес: Химки МО
Сообщений: 95
По умолчанию Помогите разобраться с кнопкой

Привет всем!
Мне нужна панель из пяти одинаково выглядящих нестандартного вида кнопок с разными текстами: "min", "2 x min", "3 x min", "pot", "all-in".

Так как я сугубый нуб в флеше, я сначала решил, что надо распотрошить стандартную кнопку компонент и привести ее к нужному виду. Я вставил кнопку на сцену и дважды кликнул на нее, и она "распалась" на ряд изображений ее отдельных фаз, но мне показалось сложным править их все, и потом я не знал как их собрать обратно, и что еще надо будет допилить, поэтому я пошел другим путем - путем создания кнопки с нуля. И столкнулся с проблемами. Прошу помочь.

Свою кнопку я сделал так:
Создал в Flash CS4 новый символ типа Button, создал изображения для up, down, over кадров. Проверил, что кнопка нажимается. Далее т.к. мне нужна была панель из одинаково выглядящих кнопок, но с разными надписями, я создал новый символ типа MovieClip - панель кнопок и разместил на ней пять моих одинаковых кнопок.

Но надписи на кнопках должны быть разными! Пробовал менять надписи на кнопках, но сделать это получилось только редактированием символа, а при этом надписи менялись синхронно на всех 5 кнопках на панели. Я обломался делать пять похожих символов и решил изменить текст экземпляров каждой кнопки-символа на панели из конструктора класса, наследующего от класса панели.

Я указал имена экземпляров для кнопок, для панели кнопок, и для динамик текстов на кнопках.

Тут столкнулся с проблемами.
1) поскольку кнопка в кадрах up и down имеет различное положение (утапливается), то и текст на кнопке тоже должен утапливаться. Значит надо делать несколько Dynamic Text объектов сообразно кол-ву кадров? Правильно рассуждаю или надо как-то по-другому?
2) Если да, то значить им надо давать уникальные имена (Instance name), получается как-то избыточно что-ли.
3) Несмотря на то, что переменные, которые автоматом создаются если назначишь объекту Instance name, выбирались из списка автоподстановки после нажатия "." значение переменной title (динамик текст на кнопке) оказалось null. Почему?
Вот мой код в конструкторе лейаута флешки:

Код AS3:
// Поменять текст на кнопках рейз панели
var p:RaisePanelButtonGroupDesign = this.layoutDesign.blockLower.raisePanel.raisePanelButtonGroup
var btn_array:Array = [p.btn1, p.btn2, p.btn3, p.btn4, p.btn5]; // btn1-5 автоподстанавливаются имена экз. кнопок
var btn_names:Array = ["min", "2 x min", "3 x min", "pot", "all-in"];
for (var i:int = 0;  i < btn_array.length; i++) {
  //RaisePanelButtonDesign (btn_array[i]).title.text = btn_names[i]; // вылетает, т.к. title == null
  trace(RaisePanelButtonDesign (btn_array[i]).title); // почему выводит null???
}
ps
Dynamic Text с именем экземпляра title я создал для проверки идеи только на кадре up, может в этом дело?


Последний раз редактировалось zhoran; 27.12.2010 в 22:49.
Старый 28.12.2010, 00:44
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 2  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Вспоминаю себя во времена Flash 4. Такие же проблемы с пониманием отношений класс - экземпляр были.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

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

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
1. если кнопки все одинаковые и отличаются только текстом - достаточно нарисовать одну кнопку.
2. Чтобы текст при нажатии сделать "утопленным" - можно на текстовое поле навесить парочку пост-эффектов типа блюров или теней. Ну и чтоб они отличались на этих 4-х кадрах кнопки.

Теперь собственно что надо сделать:
1. почитать документацию хотя бы официальную справку адоба.
2. у тайтла в символе кнопки сделать инстанс нейм.
3. если пишете в кадрах то в коде панели нужно пробежаться по всем инстансам кнопок и поменять текст тайтлов у всех кнопок на такой как вам надо(обращаться по инстансНеймам типа: myButton1.title) (хотя если кнопок всего пять, то проще будет сделать пять разных кнопок и не парить себе моск)
4. ну и далее по тексту.

Код AS3:
// Поменять текст на кнопках рейз панели
var p:RaisePanelButtonGroupDesign = this.layoutDesign.blockLower.raisePanel.raisePanelButtonGroup
var btn_array:Array = [p.btn1, p.btn2, p.btn3, p.btn4, p.btn5]; // btn1-5 автоподстанавливаются имена экз. кнопок
var btn_names:Array = ["min", "2 x min", "3 x min", "pot", "all-in"];
for (var i:int = 0;  i < btn_array.length; i++) {
    //RaisePanelButtonDesign (btn_array[i]).title.text = btn_names[i]; // вылетает, т.к. title == null
    //Вылетает так как вы пытаетесь привести батон к типу_с_длинным_названием
 
    //trace(RaisePanelButtonDesign (btn_array[i]).title); // почему выводит null??? 
    //null у нас тут по той же причине
 
    btn_array[i].title.text = btn_names[i];
    trace(btn_array[i].title.text); //пробуйте так;)
}
__________________
Кто к нам с чем для чего - тот у нас того от того.

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

Регистрация: Dec 2010
Адрес: Химки МО
Сообщений: 95
Спасибо за ответы. Не получается.

Теперь собственно что надо сделать:
1. почитать документацию хотя бы официальную справку адоба. - Пока не нашел в ней ответ, но читаю.
2. у тайтла в символе кнопки сделать инстанс нейм. - это я сделал когда писал, иначе имя title не автоподставилось бы в редакторе.
3. если пишете в кадрах то в коде панели нужно пробежаться по всем инстансам кнопок и поменять текст тайтлов у всех кнопок на такой как вам надо(обращаться по инстансНеймам типа: myButton1.title) (хотя если кнопок всего пять, то проще будет сделать пять разных кнопок и не парить себе моск) - ну вроде в коде видно что я так и делаю, а рисовать пять почти одинаковых кнопок не хочу потому что не красиво.
4. ну и далее по тексту.
trace(btn_array[\i].title.text); //пробуйте так

- я же пишу, что btn_array[i].title == null, соответственно btn_array[i].title.text прекращает выполнение по причине вызова метода у null


Уточняю, у меня в редакторе, когда я после btn_array[i] ставлю точку, появляется список, в котором есть свойство title, а когда я ставлю точку после btn_array[i].title в списке есть методы и свойства title, но в процессе выполнения почему-то title == null, хотя в кнопках текст есть.

Не понимаю (
Может кто-нить сампл код привести который работает, чтобы у кнопки Dynamic Text поменялся?


Последний раз редактировалось zhoran; 28.12.2010 в 23:31.
Старый 28.12.2010, 23:52
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 5  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
В своем ответе я объяснил почему там null и исправил код.

Так тоже не работает?
__________________
Кто к нам с чем для чего - тот у нас того от того.

Старый 29.12.2010, 13:06
zhoran вне форума Посмотреть профиль Отправить личное сообщение для zhoran Найти все сообщения от zhoran
  № 6  
Ответить с цитированием
zhoran

Регистрация: Dec 2010
Адрес: Химки МО
Сообщений: 95
//Вылетает так как вы пытаетесь привести батон к типу_с_длинным_названием
Нет, вылетает не поэтому, он пишет: [Fault] exception, information=TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".

Переделал немного, чтобы не было явного приведения типа:
Код AS3:
for (var i:int = 0;  i < btn_array.length; i++) {
  var btn:RaisePanelButtonDesign =  btn_array[i];
  trace(btn.title); // тут выводит null
  trace(btn.title.text); // а так выводит "[Fault] ... как в сообщении выше
}
Ваш код не нработает - тоже пишет null.

зы
А рабочий короткий пример можете выложить?


Последний раз редактировалось zhoran; 29.12.2010 в 13:19.
Старый 29.12.2010, 14:07
zhoran вне форума Посмотреть профиль Отправить личное сообщение для zhoran Найти все сообщения от zhoran
  № 7  
Ответить с цитированием
zhoran

Регистрация: Dec 2010
Адрес: Химки МО
Сообщений: 95
Прикладываю StrangeButton.fla, StrangeButton.swc - в них только моя кнопка с Dynamic Text
а Main.as для примера вот:

Код AS3:
package 
{
	import flash.display.MovieClip;
	import poker.view.RaisePanelButtonView;
	import flash.events.Event;
 
	public class Main extends MovieClip
	{
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			var button:RaisePanelButtonView = new RaisePanelButtonView();
			this.addChild(button);
			trace(button.title); // почему null???
		}
 
	}
 
}
Вложения
Тип файла: rar StrangeButton.fla.swc.rar (9.8 Кб, 55 просмотров)

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

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Хз, короче У меня собственно тоже тайтл у кнопки поменять не получилось.
Но получилось его поменять, если делать кнопку не SimpleButton'ом а MovieClip'ом. Видимо батон не умеет с чилдами работать, мож кто более опытный подскажет.
Единственное что если делать мувиклипом - то самому надо следить за событиями и менять визуальный образ. К тому же следует помнить что тайтл в кажддом кадре свой. И его надо менять во всех кадрах, если динамически ставить. С этим думаю разберетесь.

Ну а я обычно вот так подобные вопросы решаю (тут курсор пальчиком не становится если на текст наводишь, не стал играться. Вообще по правильному надо поверху натянуть какую-то прозрачную плашку):
Код AS3:
package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.filters.DropShadowFilter;
	import flash.text.TextField;
 
/**
 * @author Dukobpa3
 */
	public class Main extends Sprite 
	{
		private var btn_array:Array = [];
		private var btn_names:Array = ["min", "2 x min", "3 x min", "pot", "all-in"];
 
 
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
 
			for (var i:int = 0; i < 5 ; i++) 
			{
				var btn:Sprite = new Sprite();
				btn.name = String(i);
				btn_array[i] = btn;
 
				btn.graphics.beginFill(0x666666);
				btn.graphics.drawRoundRect(0, 0, 70, 30, 4, 4);
				btn.graphics.endFill();
 
				var title:TextField = new TextField();
				title.width = 60;
				title.height = 20;
				title.x = 5;
				title.y = 5;
				title.text = btn_names[i];
				title.selectable = false;
				title.autoSize = "center";
				title.textColor = 0xffffff;
				btn.addChild(title);
 
				btn.x = i * 100;
 
				btn.buttonMode = true;
 
				this.addChild(btn);
 
				btn.addEventListener(MouseEvent.CLICK, onClick);
				btn.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
				btn.addEventListener(MouseEvent.MOUSE_UP, onUp);
				btn.addEventListener(MouseEvent.ROLL_OVER, onOver);
				btn.addEventListener(MouseEvent.ROLL_OUT, onOut);
			}
 
		}
 
		private function onDown(e:MouseEvent):void 
		{
			var but:Sprite = e.currentTarget as Sprite;
 
			but.y += 2;
		}
 
		private function onUp(e:MouseEvent):void 
		{
			var but:Sprite = e.currentTarget as Sprite;
 
			but.y -= 2;
		}
 
		private function onOut(e:MouseEvent):void 
		{
			var but:Sprite = e.currentTarget as Sprite;
 
			but.filters = [];
		}
 
		private function onOver(e:MouseEvent):void 
		{
			var filter:DropShadowFilter = new DropShadowFilter();
			var but:Sprite = e.currentTarget as Sprite;
 
			but.filters = [filter];
		}
 
		private function onClick(e:MouseEvent):void 
		{
			/***************
			Do Something
			//****************/
			trace("click: " + e.currentTarget.name);
		}	
 
	}
 
}
__________________
Кто к нам с чем для чего - тот у нас того от того.

Старый 29.12.2010, 20:03
zhoran вне форума Посмотреть профиль Отправить личное сообщение для zhoran Найти все сообщения от zhoran
  № 9  
Ответить с цитированием
zhoran

Регистрация: Dec 2010
Адрес: Химки МО
Сообщений: 95
Ок, буду изучать.
Кстати, да припоминаю, вроде читал, что батон отличается от мувика тем, что не может содержать другие мувики, кажется. Если не путаю.
Спасибо за помощь!

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

Теги
button
Опции темы
Опции просмотра

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

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


 


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


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