Game Maker - создание игр | HellRoom Games
Март 24, 2025, 03:34:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Локальные и глобальные переменные.  (Прочитано 4397 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dva_Kota
Гл. Администратор
*

Репутация: 636
Offline Offline

Пол: Мужской
Награды:
3000 сообщений!За постоянность! [500 дней на форуме]За лояльность! [+500 репутации]Настоящий игродел!Тру Админ :D1 место за игру: Energy Wars (Конкурс Золотые Руки)...
API: GameMaker Studio Standard
Сообщений: 3245



« : Ноябрь 25, 2011, 14:08:23 »

Вопрос, в большей степени к YellowAfterlife
Хотелось бы разобраться с локальными и глобальными переменными.
Цитата: YellowAfterlife
[24|Ноя 21:03 ]:   если переменная становится полу-глобальной для всех объектов типа, то первое задание стоит сделать через this.переменная
Полу-глобальная это как?
На сколько я понял:
- если задается переменная просто (как локальная в ГМ) то она становится глобальной;
- если переменную задавать this.переменная то она будет локальной для данного объекта.

С обращением к глобальным переменным все понятно, а вот с локальными сложнее.

обращаться к ним из других объектов нужно так (для изменения переменной у всех экземпляров объектов в комнате):
Код: (Step объекта obj_01)
with (obj_02)
{
переменная += 10;
}

или так (для изменения переменной у всех экземпляров объектов в комнате):

Код: (Step объекта obj_01)
obj_02s = instance_list(obj_02); // получаем массив с всеми объектами нужного типа
for (var i = 0; i < obj_02s.length; i++) { // проходим по ним
    obj_02s[i].переменная += 10;
}

или так (для изменения переменной только у первого объекта (с минимальным id), как в ГМ при выполнении объект.переменная +=10;):
Код: (Step объекта obj_01)
obj_02s = instance_list(obj_02); // получаем массив с всеми объектами нужного типа
    obj_02s[0].переменная += 10;
}

Из последнего вытекает еще один вопрос: instance_list() возвращает массив отсортированный по id или вразброс?

Если я выше написал что-то не правильно прошу указать на это.

И теперь главный вопрос: Будет ли более простое обращение к локальным переменным из другого объекта как в ГМ, т.к. просто Объект.переменная, без создания массива и без with (или может быть уже есть, просто я об этом не знаю)?
Записан

YellowAfterlife
Videogames, I'm afraid
Главный Модератор
*

Репутация: 440
Offline Offline

Пол: Мужской
Награды:
Добавление и перевод новостей о Game Maker!500 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+300 репутации]Настоящий игродел!Знаток Game Maker!...
API: GameMaker Studio 2
Сообщений: 731



WWW
« Ответ #1 : Ноябрь 26, 2011, 11:37:46 »

После короткого выяснения причин...
"глобальность" переменных является "побочным эффектом" в самом JS.
По-правде, все локальные переменные должны иметь префикс "this." (this.health = 10). Но, как можно заметить, это не всегда удобно. Поэтому (по умолчанию, можно включить Advanced scripting mode в настройках игры) Tululoo генерирует дополнительный "обертывающий" код для избавления от этого. Но как можно увидеть, JS не обязательно правильно определяет, в какой объект вы хотите вставить переменную, и по умолчанию вставляет ее для типа объекта (т.е. всех объектов этого типа).
Для исправления стоит присваивать значение переменной первый раз через this.*:
Код:
// Creation event
this.health = 10; // это делает переменную локальной -лишь- для этого экземпляра объекта
// Step event
if (health > 0) ...
// obj_someother, step event
obj_tests = instance_list(obj_test);
for (var i = 0; i < obj_tests.length; i++) { // проходим по ним
    obj_tests[i].health -= Math.random() * 0.1;
}
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

HellRoom Games © 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
Страница сгенерирована за 0.116 секунд. Запросов: 29.