PDA

Просмотр полной версии : непонятки с типами переменных AS 2.0


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

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. вот не могу заставить ее работать, а в чем косяк не пойму.

dark256
21.12.2010, 01:55
Нууу... скажем так. Флэшу сугубо ортогонально на типы данных. Он все это преобразует туда сюда как угодно совершенно не вдаваясь практически ни во что.
Поэтому все что приходит из рнр - изначально считайте ТЕКСТОМ. Куда бы вы это не присваивали.

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

Чтобы четко получать именно числовое значение переменной, пишите
a = Math.round( Number( b ) )

int - это из флэш-5. Очень deprecated.

mooncar
21.12.2010, 02:29
parseInt или parseFloat еще.

iNils
21.12.2010, 02:50
Флэшу сугубо ортогонально на типы данных. Он все это преобразует туда сюда как угодно совершенно не вдаваясь практически ни во что.Стоит уточнить, что ему параллельно на типы только в AS 1/2, в AS3 - нет.

udaaff
21.12.2010, 02:54
NaFigator, а в каком виде у вас Boolean передается? "true"/"false", "1"/"0", "yes"/"no"? Почитайте в хелпе про правила преобразования строки в Boolean.
Т.е. почему то переменные объявленные в начале скрипта как :Number при операции сложения складываются как строковые о_О
Складываются как строковые от того, что складываются со строкой.

NaFigator
21.12.2010, 07:40
так всетаки как правильнее?
a = Math.round( Number( b ) )
или
a = parseInt(b);
Достаточно ли вызывать данные функции только при получении данных или всеравно нужно будет их использовать в теле скрипта при каждой математической операции?

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.

Складываются как строковые от того, что складываются со строкой.
Так разве не достаточно при объявлении переменной объявить ей числовой тип? к примеру
var u_level:Number = int(_level0.user_level);

Или при этом всеравно данные будут считаться строкой? о_О

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

goodguy
21.12.2010, 08:13
Так разве не достаточно при объявлении переменной объявить ей числовой тип? к примеру
Или при этом всеравно данные будут считаться строкой? о_О

Вот ответ:
Складываются как строковые от того, что складываются со строкой.


На счет этого: так всетаки как правильнее?

parseFloat() преобразует значение в число с плавающей точкой
parseInt() - в целое.

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

Я исползую такие конструкции

parseInt();
parseFloat();

dark256
21.12.2010, 12:32
Стоит уточнить, что ему параллельно на типы только в AS 1/2, в AS3 - нет.

Господин модератор - не докопаетесь. Ответ был строго с учетом раздела :)

Добавлено через 7 минут
так всетаки как правильнее?
a = Math.round( Number( b ) )
или
a = parseInt(b);
Достаточно ли вызывать данные функции только при получении данных или всеравно нужно будет их использовать в теле скрипта при каждой математической операции?.

Функции преобразования можно и нужно использовать со всеми числовыми данными, получаемыми извне.
Скрипты, флэшварсы и т.п. После того как данные получены, преобразованы и вставлены во внутренние переменные вашей флэшки - работаете уже с тем типом, который вы задали при обработке.

Как правильнее - да собственно и так и этак. В любом случае имеет смысл почитать мануал. Ключевые слова озвучены, а далее - все в ваших руках :)

NaFigator
21.12.2010, 15:58
Всем большое спасибо, проблемы решил, все работает =)

dark256
21.12.2010, 16:07
Ха... это было только начало :)))

iNils
21.12.2010, 19:02
Ответ был строго с учетом разделаЯ и не докапываюсь. Просто уточнил, иначе может сложится впечатление (как и у автора, так и у тех, кто будет потом читать), что так во всем флеше, и при переходе на as3 будут ошибочно считать, что типизация в runtime не играет роли.

dark256
21.12.2010, 19:42
Ок. Учтем. Просто раз раздел - "АС2", то логично предположить что и так далее и тому подобнее.
А так... Да - "все что может быть понято неверно - будет понятно неверно" :)))