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

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

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

Регистрация: Feb 2006
Сообщений: 10
Attention непонятки с типами переменных AS 2.0

Доброго времени суток!
Я вообще php - разработчик, но вот возникла у меня необходимость написать некоторую преблуду на флэше.
Никак не могу разобраться с типами переменных. Т.е. почему то переменные объявленные в начале скрипта как :Number при операции сложения складываются как строковые о_О (строк дополняется второй). Собственно вопрос: это косяк языка или я что то не правильно делаю?

Код AS1/AS2:
var main_url = "http://static.my_site.ru/";
 
var u_name:String = _level0.user_name;
var u_level:Number = int(_level0.user_level);
var u_clan:String = _level0.user_clan;
 
var hp:Number = int(_level0.hp);
var max_hp:Number = int(_level0.max_hp);
var mana:Number = int(_level0.mana);
var max_mana:Number = int(_level0.max_mana);
 
var hp_speed:Number = _level0.hp_speed_up;
var mana_speed:Number = _level0.mana_speed_up;
var in_action:Boolean = _level0.in_action;
 
texta.text = u_name;
 
 
function set_stats(){
	user_hp.text = int(hp) + " / " + int(max_hp);
	user_mana.text = int(mana) + " / " + int(max_mana);
	textl.text = "[" + u_level + "]";
 
	_root.hp_bar._width = int(hp / max_hp * 135);
	_root.mana_bar._width = int(mana / max_mana * 112);
}
 
function recieveFromJS(t) {
	if(t.hp != "") hp = int(t.hp);
	if(t.max_hp != "") max_hp = int(t.max_hp);	
	if(t.mana != "") mana = int(t.mana);
	if(t.max_mana != "") max_mana = int(t.max_mana);	
	if(t.user_level != "") u_level = int(t.user_level);
	if(t.in_action != "") in_action = t.in_action;
}
 
function stats_up(){
	if(!in_cation){
		if(hp < max_hp) hp = Number(hp) + Number(hp_speed);
		if(mana < max_mana) mana = Number(mana) + Number(mana_speed);
	}
		set_stats();
}
setInterval(stats_up, 1000);
 
_root.user_home_button.onRelease = function() {
	flash.external.ExternalInterface.call("set_turn", "user_home");
};
 
flash.external.ExternalInterface.addCallback("set_vars",null,recieveFromJS);
тут начальные данные подгружаются через flashvars, далее данные могут подгружаться через externalinterface в произвольный момент времени.

на данный момент я вродебы победил большую часть глюков указывая тип данных при КАЖДОЙ!!! операции.
остался одн косяк с кторым бьюсь второй день. это переменная in_action. вот не могу заставить ее работать, а в чем косяк не пойму.


Последний раз редактировалось NaFigator; 20.12.2010 в 22:18.
Старый 21.12.2010, 01:55
dark256 вне форума Посмотреть профиль Отправить личное сообщение для dark256 Посетить домашнюю страницу dark256 Найти все сообщения от dark256
  № 2  
Ответить с цитированием
dark256
 
Аватар для dark256

блогер
Регистрация: Apr 2008
Адрес: SPb
Сообщений: 3,718
Записей в блоге: 5
Отправить сообщение для dark256 с помощью ICQ Отправить сообщение для dark256 с помощью Skype™
Нууу... скажем так. Флэшу сугубо ортогонально на типы данных. Он все это преобразует туда сюда как угодно совершенно не вдаваясь практически ни во что.
Поэтому все что приходит из рнр - изначально считайте ТЕКСТОМ. Куда бы вы это не присваивали.

Скажу по секрету - флэш хавает даже деление на ноль, без каких-либо зависаний и выдачи ошибок. Ибо хитрые макромедийщики ввели в него константу - infinity

Чтобы четко получать именно числовое значение переменной, пишите
Код:
a = Math.round( Number( b ) )
int - это из флэш-5. Очень deprecated.
__________________
FLASHER.MAP SOUNDSTAGE / CS3 / AS2

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

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
parseInt или parseFloat еще.
__________________
Идите первым!

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

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Цитата:
Флэшу сугубо ортогонально на типы данных. Он все это преобразует туда сюда как угодно совершенно не вдаваясь практически ни во что.
Стоит уточнить, что ему параллельно на типы только в AS 1/2, в AS3 - нет.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 21.12.2010, 02:54
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 5  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
NaFigator, а в каком виде у вас Boolean передается? "true"/"false", "1"/"0", "yes"/"no"? Почитайте в хелпе про правила преобразования строки в Boolean.
Цитата:
Т.е. почему то переменные объявленные в начале скрипта как :Number при операции сложения складываются как строковые о_О
Складываются как строковые от того, что складываются со строкой.


Последний раз редактировалось udaaff; 21.12.2010 в 02:57.
Старый 21.12.2010, 07:40
NaFigator вне форума Посмотреть профиль Отправить личное сообщение для NaFigator Найти все сообщения от NaFigator
  № 6  
Ответить с цитированием
NaFigator

Регистрация: Feb 2006
Сообщений: 10
так всетаки как правильнее?
Код AS1/AS2:
a = Math.round( Number( b ) )
или
Код AS1/AS2:
a = parseInt(b);
Достаточно ли вызывать данные функции только при получении данных или всеравно нужно будет их использовать в теле скрипта при каждой математической операции?

Цитата:
Сообщение от udaaff Посмотреть сообщение
NaFigator, а в каком виде у вас Boolean передается? "true"/"false", "1"/"0", "yes"/"no"? Почитайте в хелпе про правила преобразования строки в Boolean.
Флэшка динамически вставляется на страницу с помощью SWFObject 2.2

Код:
var flashvars_top_user = {user_name: "NaFigator",user_level: "12",hp_speed_up: "0.36",mana_speed_up: "0.266",in_action: "1",hp: "1350",max_hp: "1350",mana: "770",max_mana: "770",user_clan: "myst"};
var params_top_user = {menu: "false",quality: "high",bgcolor: "#000000",wmode: "opaque",allowscriptaccess: "always"};
var attributes_top_user = {};
swfobject.embedSWF("http://my_site.ru/flash/top_user3.swf", "top_user", "450", "70", "9.0.0", false, flashvars_top_user, params_top_user, attributes_top_user);
Соответственно ставится 0 или 1.

Цитата:
Сообщение от udaaff Посмотреть сообщение
Складываются как строковые от того, что складываются со строкой.
Так разве не достаточно при объявлении переменной объявить ей числовой тип? к примеру
Код AS1/AS2:
var u_level:Number = int(_level0.user_level);
Или при этом всеравно данные будут считаться строкой? о_О

Как то я честно говоря в легком шоке от ситуации с ActionScript...


Последний раз редактировалось NaFigator; 21.12.2010 в 07:50.
Старый 21.12.2010, 08:13
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 7  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
Так разве не достаточно при объявлении переменной объявить ей числовой тип? к примеру
Цитата:
Или при этом всеравно данные будут считаться строкой? о_О
Вот ответ:
Цитата:
Складываются как строковые от того, что складываются со строкой.

На счет этого:
Цитата:
так всетаки как правильнее?
parseFloat() преобразует значение в число с плавающей точкой
parseInt() - в целое.

Код AS3:
a = Math.round( Number( b ) )
Округлит число по правилам математики и выдаст целое

Я исползую такие конструкции
Код AS3:
parseInt();
parseFloat();

Старый 21.12.2010, 12:32
dark256 вне форума Посмотреть профиль Отправить личное сообщение для dark256 Посетить домашнюю страницу dark256 Найти все сообщения от dark256
  № 8  
Ответить с цитированием
dark256
 
Аватар для dark256

блогер
Регистрация: Apr 2008
Адрес: SPb
Сообщений: 3,718
Записей в блоге: 5
Отправить сообщение для dark256 с помощью ICQ Отправить сообщение для dark256 с помощью Skype™
Цитата:
Сообщение от iNils Посмотреть сообщение
Стоит уточнить, что ему параллельно на типы только в AS 1/2, в AS3 - нет.
Господин модератор - не докопаетесь. Ответ был строго с учетом раздела

Добавлено через 7 минут
Цитата:
Сообщение от NaFigator Посмотреть сообщение
так всетаки как правильнее?
Код AS1/AS2:
a = Math.round( Number( b ) )
или
Код AS1/AS2:
a = parseInt(b);
Достаточно ли вызывать данные функции только при получении данных или всеравно нужно будет их использовать в теле скрипта при каждой математической операции?.
Функции преобразования можно и нужно использовать со всеми числовыми данными, получаемыми извне.
Скрипты, флэшварсы и т.п. После того как данные получены, преобразованы и вставлены во внутренние переменные вашей флэшки - работаете уже с тем типом, который вы задали при обработке.

Как правильнее - да собственно и так и этак. В любом случае имеет смысл почитать мануал. Ключевые слова озвучены, а далее - все в ваших руках
__________________
FLASHER.MAP SOUNDSTAGE / CS3 / AS2

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

Регистрация: Feb 2006
Сообщений: 10
Всем большое спасибо, проблемы решил, все работает =)

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

блогер
Регистрация: Apr 2008
Адрес: SPb
Сообщений: 3,718
Записей в блоге: 5
Отправить сообщение для dark256 с помощью ICQ Отправить сообщение для dark256 с помощью Skype™
Ха... это было только начало ))
__________________
FLASHER.MAP SOUNDSTAGE / CS3 / AS2

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

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

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


 


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


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