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

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

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

Регистрация: Oct 2004
Сообщений: 141
Цитата:
Сообщение от __etc
Квадратные скобки неудобны никогда. Их количество не должно превышать одной штуки на подобный блок кода.
Ну допустим, принимаю как аксиому. Теперь осталось только сказать почему. Тогда, возвращаясь к примеру, как реализовать функцию изменяющую, например, альфу у блока объектов находящихся в муве контейнере "mc" ? Опять же для примера - искомому 100% остальным - 75.
Я написал ее так (простим мне ламеру использование _root всуе):
Код:
function func(x,y){
// Искомый тайл
_root.mc["tile" +x+"_"+y]._alpha=100 ;
// Тайлы по кресту (изометрия)
_root.mc["tile" +(x-1)+"_"+(y)]._alpha=75; 
_root.mc["tile" +(x+1)+"_"+(y)]._alpha=75;  
 _root.mc["tile" +(x)+"_"+(y-1)]._alpha=75;  
_root.mc["tile" +(x)+"_"+(y+1)]._alpha=75; 
// Тайлы по диагоналям (изометрия)
_root.mc["tile" +(x-1)+"_"+(y-1)]._alpha=75;  
_root.mc["tile" +(x-1)+"_"+(y+1)]._alpha=75;  
_root.mc["tile" +(x+1)+"_"+(y-1)]._alpha=75; 
_root.mc["tile" +(x+1)+"_"+(y+1)]._alpha=75; 

}
А как надо было?

Цитата:
Leezard вы усложняете себе жизнь, ссылками намного легче работать, их намного легче проверять и при желании их можно назвать как надо а не "tile" +(x-1)+"_"+(y).

iNils и __etc пытаются вам объяснить это, а вы уперлись и отказываетесь понимать, если вы ждете от них что они разжуют и плюнут перевареную пищу вам в рот, то недождетесь =) поищите по форуму, зайдите на flash-ripper.com и посмотрите что пишут люди которые с флэшом уже даже не с пятой а 4-3 версии.
Я не упираюсь ни в коем случае, мало того, я абсолютно согласен, что ссылками работать очень удобно, мало того я с ними работаю, кроме того практически всегда
Но, я привожу пример конструкции, где по моему личному, абсолютно не проффесиональному, мнению, использования [], весьма удобно. И в ответ, вместо конкретики или хотя бы объяснения в двух словах (не оптимально по скорости, приводит к багам...) получаю фразы типа:
Цитата:
Leezard, вы говорите не понимая о чем. Ваш подход это вчерашний день...
Цитата:
Квадратные скобки неудобны никогда. Их количество не должно превышать одной штуки на подобный блок кода.
Цитата:
Leezard вы усложняете себе жизнь
Честное слово, я не хочу спорить, я просто не понимаю, почему "никогда", "вчерашний день", "не более одной штуки".
Есть конкретный, очень короткий (см.функцию выше) пример. Покажите как это можно сделать короче, быстрей и понятней.
Поскольку я хочу писать код в стиле завтрашнего дня, на AS2 вчерашнего, я попробую разжевать для себя сам, поправьте меня...
Создаем объекты с именами "tile1","tile2",..."tile900" для локации (карты)
30х30.
Типа так:
---Создаем---
Код:
var counter=1;
var names=[];
for(var i=1;i<=30;i++){
names[i]=[];
 for(var j=1;j<=30;j++){
  counter++;
  //[] - зло, но как создать "собранный" линк? set? eval?
   set("tile"+counter,mc.attachMovie("tiles","anyname"+counter,someDepth,{x:i,y:j}))
  //согласно совету iNils воодим масив для хранения имен, а по сути соответствий координаты - мувики.
  names[i][j]="tile"+counter;
  }
}
Если писать неправильно то имеем следующее:
Код:
for(var i=1;i<=30;i++){
 for(var j=1;j<=30;j++){
    mc.attachMovie("tiles","tile"+i+"_"+j,someDepth,{x:i,y:j}))
  }
}
---Обращение к блокам тайлов---

Код:
function func(x,y){
// Как найти искомый тайл?
//по умному тут у нас должно быть что-то вида ссылка._alpha=100
//и мы даже знаем как эта ссылка обзывается - name[x][y]
// но что делать дальше, я честно говоря не знаю  
// я могу записать в виде _root[name[x][y]].alpha=100
// но это опять те же квадратные скобки, мало того еще и с упоминанием рута.
}
Вопросы которые меня терзают прямо сейчас:
Какие еще методы обращения к свойствам объектов существуют?
Каким образом я могу реализовать ссылка._alpha=100 без квдратных скобок, где ссылка - сложносочиненный стринг.
Зачем превращать квадратное, в длинное, для того чтобы затем сделать опять квадратным?

Старый 02.01.2007, 18:46
Nirth вне форума Посмотреть профиль Отправить личное сообщение для Nirth Посетить домашнюю страницу Nirth Найти все сообщения от Nirth
  № 2  
Ответить с цитированием
Nirth
4AM Games
 
Аватар для Nirth

блогер
Регистрация: Nov 2002
Адрес: Sofia
Сообщений: 6,264
Записей в блоге: 1
Отправить сообщение для Nirth с помощью ICQ Отправить сообщение для Nirth с помощью AIM Отправить сообщение для Nirth с помощью MSN Отправить сообщение для Nirth с помощью Yahoo Отправить сообщение для Nirth с помощью Skype™
Leezard вы усложняете себе жизнь, ссылками намного легче работать, их намного легче проверять и при желании их можно назвать как надо а не "tile" +(x-1)+"_"+(y).

iNils и __etc пытаются вам объяснить это, а вы уперлись и отказываетесь понимать, если вы ждете от них что они разжуют и плюнут перевареную пищу вам в рот, то недождетесь =) поищите по форуму, зайдите на flash-ripper.com и посмотрите что пишут люди которые с флэшом уже даже не с пятой а 4-3 версии.
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^

Старый 03.01.2007, 16:28
Leezard вне форума Посмотреть профиль Отправить личное сообщение для Leezard Посетить домашнюю страницу Leezard Найти все сообщения от Leezard
  № 3  
Ответить с цитированием
Leezard
 
Аватар для Leezard

Регистрация: Oct 2004
Сообщений: 141
Во первых огромный респект за внимание и найденное время для написания кода. На самом деле многого стоит.
Во вторых записки деревенского казуала о сути диспута.
Существует два способа обращения к объекту , его методам и свойствам:
- Через ссылку;
- Непосредственно.
Что я собственно хотел услышать и не услышал, это обоснование применения первого и предание анафеме второго.
Давайте посмотрим что мы имеем в обоих случаях.
1. обращения к объекту через ссылку.
[+] имеем некоторый уровень абстрактности создаваемого кода. То есть создавая некоторую алгоритмическую последовательность будь-то функция или метод класса, абстрагируемся от конкретики и пишем универсальный код. И действительно, если нам нужно, к примеру, написать алгоритм взаимодействия некоторых объектов, все это записывается как в школьной задачке:
Код:
объект А имеет 50 процентов прозрачности от объекта Б 
и глубину меньшую чем у объекта С.
Замечательно, все четко понятно и красиво.
[+] простота записи, как частный случай первого плюсика. И действительно, ну кому хочется писать
Код:
_root.qqq.www.eee.rrr.ttt.yyy.uuu.iii......_alpha=50;
_root.qqq.www.eee.rrr.ttt.yyy.uuu.iii......_x=150;
_root.qqq.www.eee.rrr.ttt.yyy.uuu.iii......_y=250;
_root.qqq.www.eee.rrr.ttt.yyy.uuu.iii......_rotation=180;
...
когда то же самое можно написать в виде
Код:
mc._alpha=50;
mc._x=150;
mc._y=250;
mc._rotation=180;
...
Мало того мы избавляемся от необходимости абсолютного указания объекта, мы используем относительную адресацию внутри функции, так же как мы используем относительное обращение при помощи this и _parent в методах объектов, и наш код становится более мобильным. Кроме того это приводит к возможности портирования наших решений в другие наши проекты, проекты наших коллег и к тому же бережет их психику. Им не прийдется вскакивать теперь среди ночи с криками
Цитата:
О боже...
в холодном поту.

[-] А что в минусах? Почти ничего. Существует правда необходимость дополнительных телодвижений для поддержки работоспособности наших методов и функций. Например в случае с построением карты из объектов - тайлов. Получаем дополнительный массив аналогичной размерности. При обращении к объекту, одна строчка при прямом обращении становится двумя при обращении через ссылку. Почему? Правильно в любом случае надо сначала назначить ссылку при "случайной" выборке объекта из подмножества, и только потом мы можем ее использовать. А в остальном. Все тоже самое, и работа с индексами тайлов, абсолютно таже самая, что в масиве, что при прямом обращении к объекту. Мало того никто не мешает выстроить поле тайлов построчно и тогда прямое обращение к объекту будет иметь вид
Код:
mc[i][j]._alpha=...
//где mc - мувик контейнер.
и в этом случае удобства вроде как особо и не видно, если только не помнить о правилах хорошего кода и возможности создания универсальных методов.

2. О [+]и[-] прямого обращения говорить не имеет смысла, достаточно инвертировать то что сказано выше. И добавить что это метод для эгоистов.

Так какие выводы делает деревенский казуал, писатель вчерашенго дня?
Если гламурные флэшеры говорят "о боже, фе какая гадость, больше одной штуки на функцию не использовать", в этом наверняка есть смысл! Но если при этом они не говорят почему, значит они полюбому это скрывают, чтобы ты не казался таким же умным как они.

Шучу. Вы парни достойные.

P.S. Друзья, давайте будем немного проще
То что я здесь нагородил, на самом деле умещается в две фразы, которые и стоило написать с самого начала. Всем ОГРОМНОЕ спасибо, заставили подумать , переосмыслить.
iNils - тебе особый респект, не первый раз ты тратишь на меня свое время, да и не только на меня. Я бы так не смог. Не обижайся если что, я по доброму.
Еще раз огромное всем спасибо, всех с прошедшим новым годом и наступающим рождеством христовым. Всего самого лучшего, интересных проектов и незлых заказчиков.

Старый 02.01.2007, 20:43
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 4  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Код:
_root[name[x][y]].alpha=100
О боже...
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 02.01.2007, 20:49
Leezard вне форума Посмотреть профиль Отправить личное сообщение для Leezard Посетить домашнюю страницу Leezard Найти все сообщения от Leezard
  № 5  
Ответить с цитированием
Leezard
 
Аватар для Leezard

Регистрация: Oct 2004
Сообщений: 141
Цитата:
Сообщение от iNils
Код:
_root[name[x][y]].alpha=100
О боже...
Очень конструктивно, а еще что нибудь?

Старый 02.01.2007, 21:24
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 6  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Проще использовать ссылки и связать каждый тайл с другим. tile_mc.leftUpTile, tile_mc.leftBottomTile, …
Тебе же говорят — нужно использовать ссылки, а не обращаться по имени напрямую.
В идеале вообще написать базовый класс Tile с предусмотренными ссылками на восемь соседних клеток. И никакого геморроя не будет. Обратился к искомому тайлу по имени (одни единственные скобки), а ко всем остальным по ссылкам.
Это облегчает читабельность кода просто многократно. Более того, в твоем подходе будут ошибки у крайних тайлов, а в случае ссылок можно просто поставить проверку на null. А если пытаться обратиться напрямую, то будет плохо.


Последний раз редактировалось etc; 02.01.2007 в 21:26.
Старый 02.01.2007, 21:33
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 7  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Пример класса. Белым выделенно то, о чем мы с __etc так долго твердили. Плюс я усложнил модель выбора нужного тайла. Выбираем 100% не прозрачен, его окружают с 75%, а следующие кольцо с 50%.
Код:
class MultiTile extends MovieClip {
	private var __tile:Array = null;
	
	function MultiTile () {
		__tile = new Array ();
	}
	
	function addTile (x:Number, y:Number):Void {
		if (!__tile[x]) {
			__tile[x] = new Array ();
		}
		__tile[x][y] = attachMovie ("tile", "", this.getNextHighestDepth (), {_x:x * 20, _y:y * 20});
	}
	
	function getTile (x:Number, y:Number):Void {
		for (var i:Number = x - 2; i < x + 3; i++) {
			for (var j:Number = y - 2; j < y + 3; j++) {
				var mc:MovieClip = __tile[i][j];
				if (mc) {
					if (i == x && j == y) {
						mc._alpha = 100;
					} else if (Math.abs (x - i) < 2 && Math.abs (y - j) < 2) {
						mc._alpha = 75;
					} else {
						mc._alpha = 50;
					}
				}
			}
		}
	}
	
}
Пример использования.
Код:
for (var i:Number = 0; i < 10; i++) {
	for (var j:Number = 0; j < 10; j++) {
		mt.addTile (i, j);
	}
}
mt.getTile (5,4)
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 02.01.2007, 21:35
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 8  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
iNils, хороший алгоритм
Со ссылками, правда, не будет вообще циклов в классе, но будет один большой с присвоением ссылок на соседей…

Старый 02.01.2007, 21:56
pkfun вне форума Посмотреть профиль Отправить личное сообщение для pkfun Посетить домашнюю страницу pkfun Найти все сообщения от pkfun
  № 9  
Ответить с цитированием
pkfun

Регистрация: Feb 2006
Сообщений: 580
А я попроще примерчик.
Код:
var mc:MovieClip = null;
var mc_links:Array = [];
//
for (i=0; i<10; i++) {
	mc_links[i] = [];
	for (j=0; j<10; j++) {
		mc = this.attachMovie('mc', 'mc'+i+'.'+j, this.getNextHighestDepth());
		mc._x = j*40+55;
		mc._y = i*40+55;
		mc_links[i][j] = mc;
		//
		mc.onPress = function():Void  {
			if (this._alpha<100) {
				this._alpha = 100;
			}
		};
		//
	}
}
//
function alphaActionDiag():Void {
	for (i=0; i<10; i++) {
		for (j=0; j<10; j++) {
			if (i == j) {
				mc_links[i][j]._alpha = 10;
			}
		}
	}
}
//
function alphaActionBackDiag():Void {
	for (i=0; i<10; i++) {
		for (j=0; j<10; j++) {
			if (mc_links[i].length-i-1 == j) {
				mc_links[i][j]._alpha = 10;
			}
		}
	}
}
//
setTimeout(alphaActionDiag, 2000);
//
setTimeout(alphaActionBackDiag, 4000);
Рисуем диагонали.
Вложения
Тип файла: rar pr031.rar (4.3 Кб, 39 просмотров)


Последний раз редактировалось pkfun; 02.01.2007 в 22:16.
Старый 03.01.2007, 16:52
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 10  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Все мое "о боже" не дает покоя? Я объясню.
Запись вида
Код:
_root[name[x][y]]
говорит о том, что значение элемента массива имеет тип String, и вместо того, чтобы напрямую получить ссылку к объекту, мы опять привязываемся непонятно к чему.

Цитата:
При обращении к объекту, одна строчка при прямом обращении становится двумя при обращении через ссылку. Почему? Правильно в любом случае надо сначала назначить ссылку при "случайной" выборке объекта из подмножества, и только потом мы можем ее использовать.
Это про то, что надо сделать:
Код:
var mc:MovieClip = _root.qqq.www.eee.rrr.ttt.yyy.uuu.iii;
а потом только можно mc использовать?
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

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

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


 


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


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