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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.10.2009, 15:31
nikewist вне форума Посмотреть профиль Отправить личное сообщение для nikewist Найти все сообщения от nikewist
  № 1  
Ответить с цитированием
nikewist
[+4 12.05.09]

Регистрация: Apr 2009
Сообщений: 23
По умолчанию Синтаксис неведомый мне

Всем добрый день! Недавно изучал скролл многоуважаемого Walsh и наткнулся на строки, которые привели меня в некоторое замешательство, потому как я такого синтаксиса еще не видел. Объясните кто-нибудь, пожалуйста, что это такое и с чем его едят
Код AS1/AS2:
pimp._y = pimp._y < pimp_start ? pimp_start : pimp._y > pimp_stop ? pimp_stop : pimp._y;
И второе, там же есть еще один интересный момент. В хэлпе сказано русским по белому:

Код AS1/AS2:
someListener.onMouseMove = function() { ... };
А у Walsh вот так. Это как? Там же справа должна быть функция!

Код AS1/AS2:
this.onMouseMove = scrolling;

Старый 19.10.2009, 15:58
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 3  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
1.Буквальный "перевод" строки
Цитата:
pimp._y = pimp._y < pimp_start ? pimp_start : pimp._y > pimp_stop ? pimp_stop : pimp._y;
если ничего ненапутал такой:
Код:
if (pimp._y < pimp_start) {
	pimp._y = pimp_start;
} else {
	if (pimp._y > pimp_stop) {
		pimp._y = pimp_stop;
	} else {
		pimp._y = pimp._y;
	}
}
более просто
Код:
a = c < b ? c : b;
//что эквивалентно
if (c < b) {
	a = c;
} else {
	a = b;
}
2. В примере из хэлпа справа стоит анонимная функция.
у Wolsh'a справа стоит ссылка на функцию, которая была объявлена где-то в коде как
Код:
function scrolling(){
...
}
или как
Код:
scrolling = function(){
...
}
Ссылками вцелом удобнее пользоваться.
Вобщем, такой вот стиль.


Последний раз редактировалось alexcon314; 19.10.2009 в 16:01.
Старый 19.10.2009, 16:25
nikewist вне форума Посмотреть профиль Отправить личное сообщение для nikewist Найти все сообщения от nikewist
  № 4  
Ответить с цитированием
nikewist
[+4 12.05.09]

Регистрация: Apr 2009
Сообщений: 23
Спасибо Вам, добрые люди!

Старый 19.10.2009, 16:27
Волгоградец вне форума Посмотреть профиль Отправить личное сообщение для Волгоградец Найти все сообщения от Волгоградец
  № 5  
Ответить с цитированием
Волгоградец
 
Аватар для Волгоградец

блогер
Регистрация: Sep 2007
Адрес: Гамбург
Сообщений: 1,648
Записей в блоге: 12
Интересный вопрос. В случае одного использования тернарного оператора все понятно. Но в коде Walsh'а их два. А если их два, то выполнение идет справа налево. Как выглядит аналог if/else в таком случае?

Старый 19.10.2009, 17:47
nikewist вне форума Посмотреть профиль Отправить личное сообщение для nikewist Найти все сообщения от nikewist
  № 6  
Ответить с цитированием
nikewist
[+4 12.05.09]

Регистрация: Apr 2009
Сообщений: 23
По первому вопросу более или менее ясно. Немного порылся в инете, но так и не понял зачем анонимная функция в данном примере? Почему надо писать scrolling, а не scrolling()? Тем более, что объявлялась она как
Код AS1/AS2:
function scrolling(){
...
}
И что самое ужасное, это то, что даже если прописать scrolling(), то оно так не работает! Вообщем кипят мои мозги...

Старый 19.10.2009, 17:56
.true вне форума Посмотреть профиль Отправить личное сообщение для .true Посетить домашнюю страницу .true Найти все сообщения от .true
  № 7  
Ответить с цитированием
.true
 
Аватар для .true

Регистрация: Oct 2009
Адрес: Москва
Сообщений: 73
Отправить сообщение для .true с помощью ICQ
Код AS1/AS2:
this.onMouseMove = scrolling; == this.onMouseMove = function(){scrolling();}
прописать можно или так или так. Но. в первом случае ты подразумеваешь просто название функции, ты и так знаешь, что вызвать так можно только функцию.

А в блоке function(){

}

ты описываешь свои действия, выражения, и необязательно функции. Во втором примере можно написать более 1 выполняемой функции если нужно, в первом - только 1.
__________________
Если ты не часть решения, тогда ты – часть проблемы.


Последний раз редактировалось .true; 19.10.2009 в 17:58.
Старый 19.10.2009, 17:58
TihelpER вне форума Посмотреть профиль Отправить личное сообщение для TihelpER Найти все сообщения от TihelpER
  № 8  
Ответить с цитированием
TihelpER
 
Аватар для TihelpER

Регистрация: May 2007
Адрес: Moskow
Сообщений: 47
Отправить сообщение для TihelpER с помощью ICQ
nikewist

Следующий код даёт ссылку на функцию scrolling()
Код AS1/AS2:
mc.onPress = scrolling
Если мы пишем scrolling(), то есть со скобочками, то мы либо объявляем её:
Код AS1/AS2:
function scrolling() {
...
}
Либо вызываем её:
Код AS1/AS2:
if(какое либо условие) {
scrolling()
}
Когда мы пишем только название функции мы именно даём ссылку на неё.

Если более дотошно, то, грубо говоря, следующий код:
Код AS1/AS2:
mc.onPress = scrolling;
является аналогом вот такого, возможно более привычного Вам:
Код AS1/AS2:
mc.onPress = function() { // Событие - нажали на клип
scrolling() //вызываем функцию
}

Старый 19.10.2009, 23:36
nikewist вне форума Посмотреть профиль Отправить личное сообщение для nikewist Найти все сообщения от nikewist
  № 9  
Ответить с цитированием
nikewist
[+4 12.05.09]

Регистрация: Apr 2009
Сообщений: 23
Фуууухххх...В принципе я понял. Понял, что вместо того, чтобы вызвать напрямую функцию, мы вызываем анонимную функцию, которая вызовет ту функцию, которая мне нужна. Действительно, так проще и удобнее Вероятно, я отношусь к категории товарищей, которым надо пользоваться только if...
Но если серьёзно, если мы вызываем анонимную функцию, которая фактически вызывает довольно определенную функцию, то зачем эти телодвижения, где логика, где рациональное зерно?
В чем отличие в принципе работы. В математическом смысле. Потому что если я прописываю не ссылку на функцию, а напрямую вызываю функцию, то программа не работает...А с ссылкой работает. Работает, не работает, работает, не работает...

Старый 19.10.2009, 23:57
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 10  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Автор, часто бывает удобнее задать для какого-то действия функцию, и ее вызывать из разных мест - например, либо по нажатию кнопки, либо по какому-то другому событию. Например.
Код AS1/AS2:
function doIt() {  //эта функция делает полупрозрачными сто объектов mc1....mc100
	for (i = 1; i <= 100; i++) {
		_root['mc' + i]._alpha = 50;
	}
}
 
btn.onPress = doIt; //функция doIt сработает при нажатии на кнопку btn
btn.onRelease = doIt; //функция doIt сработает также при отпускании кнопки btn
 
text_tf.onChanged = doIt; //функция doIt сработает при вводе нового символа в текстовое поле text_tf
 
//постоянно проверяем изменение триггера val, если = 1, также сработает функция doIt 
this.onEnterFrame  = function() { 
  if (val == 1) {
    doIt();
  }
}
Другой пример. Назначаем обработчики onRelease для 20-ти кнопок в цикле:
Код AS1/AS2:
function goThere () {
       _root['mc' + this.num].gotoAndPlay(50); 
}
 
for (i = 1; i <= 20; i++) {
        this['btn' + i].num = i;
	this['btn' + i].onRelease = goThere;
}
//this внутри функции goThere указывает на соответствующую кнопку, для которой данная функция работает, то есть btn1... btn20
//поэтому this.num  тут будет равно последовательно btn1.num... btn20.num, то есть 1....20
Третий пример. Меняем поведение кнопки:
Код AS1/AS2:
function doOne () {
       trace('Делай раз!')
}
 
function doTwo () {
       trace('Делай два!')
}
 
//В одной части кода:
btn.onRelease = doOne;
....
//Где-то в другом месте, при других обстоятельствах, но для той же кнопки:
btn.onRelease = doTwo;
 
//либо:
if (val == 0) {
       btn.onRelease = doOne;
} 
else {
      btn.onRelease = doTwo;
}
При такой записи код становится гибче, удобнее для модернизации, переноса в другие места и т.д.

И еще. Поймите простую вещь - вот здесь:
Код AS1/AS2:
btn.onPress = doIt;
в правой части не определяется никакая функция, а только для события onPress указываем ссылку на функцию doIt по ее имени.
Эта запись сродни
Код AS1/AS2:
a = b;
То есть присваиваем одной переменной ссылку на другую.


Последний раз редактировалось mooncar; 20.10.2009 в 00:26.
Создать новую тему Ответ Часовой пояс GMT +4, время: 19:46.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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