![]() |
|
||||||||||
|
|
|
||||||
|
Регистрация: Oct 2004
Сообщений: 141
|
Цитата:
Я написал ее так (простим мне ламеру использование _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;
}
Цитата:
Но, я привожу пример конструкции, где по моему личному, абсолютно не проффесиональному, мнению, использования [], весьма удобно. И в ответ, вместо конкретики или хотя бы объяснения в двух словах (не оптимально по скорости, приводит к багам...) получаю фразы типа: Цитата:
Цитата:
Цитата:
Есть конкретный, очень короткий (см.функцию выше) пример. Покажите как это можно сделать короче, быстрей и понятней. Поскольку я хочу писать код в стиле завтрашнего дня, на 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 без квдратных скобок, где ссылка - сложносочиненный стринг. Зачем превращать квадратное, в длинное, для того чтобы затем сделать опять квадратным? |
|
|||||
|
4AM Games
|
Leezard вы усложняете себе жизнь, ссылками намного легче работать, их намного легче проверять и при желании их можно назвать как надо а не "tile" +(x-1)+"_"+(y).
iNils и __etc пытаются вам объяснить это, а вы уперлись и отказываетесь понимать, если вы ждете от них что они разжуют и плюнут перевареную пищу вам в рот, то недождетесь =) поищите по форуму, зайдите на flash-ripper.com и посмотрите что пишут люди которые с флэшом уже даже не с пятой а 4-3 версии.
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^ |
|
|||||
|
Регистрация: Oct 2004
Сообщений: 141
|
Во первых огромный респект за внимание и найденное время для написания кода. На самом деле многого стоит.
Во вторых записки деревенского казуала о сути диспута. Существует два способа обращения к объекту , его методам и свойствам: - Через ссылку; - Непосредственно. Что я собственно хотел услышать и не услышал, это обоснование применения первого и предание анафеме второго. Давайте посмотрим что мы имеем в обоих случаях. 1. обращения к объекту через ссылку. [+] имеем некоторый уровень абстрактности создаваемого кода. То есть создавая некоторую алгоритмическую последовательность будь-то функция или метод класса, абстрагируемся от конкретики и пишем универсальный код. И действительно, если нам нужно, к примеру, написать алгоритм взаимодействия некоторых объектов, все это записывается как в школьной задачке: Замечательно, все четко понятно и красиво. [+] простота записи, как частный случай первого плюсика. И действительно, ну кому хочется писать _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; ... Мало того мы избавляемся от необходимости абсолютного указания объекта, мы используем относительную адресацию внутри функции, так же как мы используем относительное обращение при помощи this и _parent в методах объектов, и наш код становится более мобильным. Кроме того это приводит к возможности портирования наших решений в другие наши проекты, проекты наших коллег и к тому же бережет их психику. Им не прийдется вскакивать теперь среди ночи с криками Цитата:
[-] А что в минусах? Почти ничего. Существует правда необходимость дополнительных телодвижений для поддержки работоспособности наших методов и функций. Например в случае с построением карты из объектов - тайлов. Получаем дополнительный массив аналогичной размерности. При обращении к объекту, одна строчка при прямом обращении становится двумя при обращении через ссылку. Почему? Правильно в любом случае надо сначала назначить ссылку при "случайной" выборке объекта из подмножества, и только потом мы можем ее использовать. А в остальном. Все тоже самое, и работа с индексами тайлов, абсолютно таже самая, что в масиве, что при прямом обращении к объекту. Мало того никто не мешает выстроить поле тайлов построчно и тогда прямое обращение к объекту будет иметь вид и в этом случае удобства вроде как особо и не видно, если только не помнить о правилах хорошего кода и возможности создания универсальных методов. 2. О [+]и[-] прямого обращения говорить не имеет смысла, достаточно инвертировать то что сказано выше. И добавить что это метод для эгоистов. Так какие выводы делает деревенский казуал, писатель вчерашенго дня? Если гламурные флэшеры говорят "о боже, фе какая гадость, больше одной штуки на функцию не использовать", в этом наверняка есть смысл! Но если при этом они не говорят почему, значит они полюбому это скрывают, чтобы ты не казался таким же умным как они. Шучу. Вы парни достойные. P.S. Друзья, давайте будем немного проще То что я здесь нагородил, на самом деле умещается в две фразы, которые и стоило написать с самого начала. Всем ОГРОМНОЕ спасибо, заставили подумать , переосмыслить.iNils - тебе особый респект, не первый раз ты тратишь на меня свое время, да и не только на меня. Я бы так не смог. Не обижайся если что, я по доброму. Еще раз огромное всем спасибо, всех с прошедшим новым годом и наступающим рождеством христовым. Всего самого лучшего, интересных проектов и незлых заказчиков. ![]() |
|
|||||
|
Регистрация: Oct 2004
Сообщений: 141
|
Очень конструктивно, а еще что нибудь?
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Проще использовать ссылки и связать каждый тайл с другим. tile_mc.leftUpTile, tile_mc.leftBottomTile, …
Тебе же говорят — нужно использовать ссылки, а не обращаться по имени напрямую. В идеале вообще написать базовый класс Tile с предусмотренными ссылками на восемь соседних клеток. И никакого геморроя не будет. Обратился к искомому тайлу по имени (одни единственные скобки), а ко всем остальным по ссылкам. Это облегчает читабельность кода просто многократно. Более того, в твоем подходе будут ошибки у крайних тайлов, а в случае ссылок можно просто поставить проверку на null. А если пытаться обратиться напрямую, то будет плохо. Последний раз редактировалось etc; 02.01.2007 в 21:26. |
|
|||||
|
Негуру
администратор
Регистрация: 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;
}
}
}
}
}
}
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
iNils, хороший алгоритм
![]() Со ссылками, правда, не будет вообще циклов в классе, но будет один большой с присвоением ссылок на соседей… |
|
|||||
|
Регистрация: 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);
Последний раз редактировалось pkfun; 02.01.2007 в 22:16. |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
Все мое "о боже" не дает покоя? Я объясню.
Запись вида говорит о том, что значение элемента массива имеет тип String, и вместо того, чтобы напрямую получить ссылку к объекту, мы опять привязываемся непонятно к чему. Цитата:
а потом только можно mc использовать? |
![]() |
![]() |
Часовой пояс GMT +4, время: 20:07. |
|
|
« Предыдущая тема | Следующая тема » |
|
|