Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   непонятки с типами переменных AS 2.0 (http://www.flasher.ru/forum/showthread.php?t=148056)

NaFigator 20.12.2010 21:51

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

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

так всетаки как правильнее?
Код AS1/AS2:

a = Math.round( Number( b ) )

или
Код AS1/AS2:

a = parseInt(b);

Достаточно ли вызывать данные функции только при получении данных или всеравно нужно будет их использовать в теле скрипта при каждой математической операции?

Цитата:

Сообщение от udaaff (Сообщение 958846)
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 (Сообщение 958846)
Складываются как строковые от того, что складываются со строкой.

Так разве не достаточно при объявлении переменной объявить ей числовой тип? к примеру
Код AS1/AS2:

var u_level:Number = int(_level0.user_level);

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

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

goodguy 21.12.2010 08:13

Цитата:

Так разве не достаточно при объявлении переменной объявить ей числовой тип? к примеру
Цитата:

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

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

На счет этого:
Цитата:

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

Код AS3:

a = Math.round( Number( b ) )

Округлит число по правилам математики и выдаст целое

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

parseInt();
parseFloat();


dark256 21.12.2010 12:32

Цитата:

Сообщение от iNils (Сообщение 958844)
Стоит уточнить, что ему параллельно на типы только в AS 1/2, в AS3 - нет.

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

Добавлено через 7 минут
Цитата:

Сообщение от NaFigator (Сообщение 958858)
так всетаки как правильнее?
Код AS1/AS2:

a = Math.round( Number( b ) )

или
Код AS1/AS2:

a = parseInt(b);

Достаточно ли вызывать данные функции только при получении данных или всеравно нужно будет их использовать в теле скрипта при каждой математической операции?.

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

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

NaFigator 21.12.2010 15:58

Всем большое спасибо, проблемы решил, все работает =)

dark256 21.12.2010 16:07

Ха... это было только начало :)))


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

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