Вообще, какие изначальные значения у переменных: pause, x_origin, x_delta ?
pause = 0 (меняется при нажатии кнопки ESC и также обратно)
x,y_dealta = 0 в CREATE obj_stats. я их просто объявляю таким образом, всеравно они мгновенно меняются во время паузы.
x,y_origin постоянно получают значения через step, они, собсна, так и задаются, получают значение всё время, пока не стоит пауза. они локальные для обж_статс.
ЦитатаRean ()
Х приравнивается позиция левее курсора - зачем??
такая схема была первой, что пришло мне в голову. размышлял так: во время паузы высчитываю смещение курсора относительно позиции самолёта. как только снимаю с паузы, позиционирую самолёт относительно моего курсора на смещение. так у меня получилось, что где бы я курсор не оставлял, самолётик будет на месте после снятия с паузы, и будет двигаться вместе с мышкой.
ЦитатаRean ()
Зачем здесь в коде нули?
Этот код писал не я, я нашел его где то на этом же форуме. Это всё было когда я только осваивал ГМЛ и сам ГМ в целом. Тут долго не думал, работает хоть как то - на первое время сойдёт.
ЦитатаRean ()
Что за константа 125?
это просто смещение границы комнаты, у меня справа небольшая менюшка. Наверное можно просто получить sprite_get_width(spr_menu) или как то так.
ЦитатаRean ()
Пока мы не узнаем, при каких условиях can_shoot получает значение "1", мы не сможем понять, почему "не стреляет".
в CREATE объекта ojb_plane: can_shoot = 1. и в alarm[0]: can_shoot = 1 собственно fire_rate заводит аларм на определённое время.
Вообще не судите строго, я бы всё с нуля переписал, если бы было не лень ибо щас смотрю на старый код и охереваю, насколько всё можно было проще и лучше написать. Начинал давно. А щас переписываю частами, к которым возвращаюсь.
Сообщение отредактировал dildo_bomber - Пятница, 11 Ноября 2016, 17:30
Вообще не судите строго, я бы всё с нуля переписал, если бы было не лень ибо щас смотрю на старый код и охереваю, насколько всё можно было проще и лучше написать.
Всё окей, главное развиваться и попутно развивать свой код. Проблема "временных" костылей в том, что с ростом проекта они становятся фундаментом. Очень ненадёжным фундаментом.
Проблема стрельбы в том, что у тебя событие "Left Button" в объекте obj_plane, что означает - срабатывать при нажатии на объект. Поменяй событие на "Global Left Button". Ну и причеши код в присвоение позиции объекта. Вообще, у тебя origin у спрайта смещён?
Сообщение отредактировал Rean - Пятница, 11 Ноября 2016, 17:51
уже сменил на глобал, всё заработало. ориджин всегда в центре самолёта. быстрый вопрос, возможно в ГМ сделать, что бы курсор не мог покидать пределы окна игры?
Сообщение отредактировал dildo_bomber - Пятница, 11 Ноября 2016, 18:18
Можно каким-либо образом создать переменную из 3х частей, чтобы каждую из них можно было прочитать независимо или без массивов никак? Или так: есть n объектов, для каждого нужно выбрать k свойств, присвоить каждому случайное название из пула и случайное значение Помогу с текстом, сюжетом, сценарием игры
Сообщение отредактировал Huricane - Пятница, 11 Ноября 2016, 21:42
Huricane, речь идёт о разных объектах или о разных экземпляров одного объекта? Если про экземпляры (instance), то можно попробовать перебрать с помощью цикла for:
Код
// Пример из справки var i; for (i = 0; i < instance_number(obj_Enemy); i += 1) { enemy[i] = instance_find(obj_Enemy,i); }
Если разные объекты, то, думаю, массив будет наиболее предпочтителен.
Добавлено: "случайное название из пула" - это типа, переменные с динамическим именем?
Сообщение отредактировал Rean - Пятница, 11 Ноября 2016, 22:22
Rean, речь о разных объектах. Мог бы ты объяснить, как можно сделать это:
ЦитатаHuricane ()
есть n объектов, для каждого нужно выбрать k свойств, присвоить каждому случайное название из пула и случайное значение
ЦитатаRean ()
Добавлено: "случайное название из пула" - это типа, переменные с динамическим именем?
Не столько динамическим, сколько случайным. Например, 10 названий. Например, нужно 7 свойств со случайными названиями раскидать в 3 объекта и каждому свойству присвоить по 2 значения, и иметь в дальнейшем к ним доступ Помогу с текстом, сюжетом, сценарием игры
Сообщение отредактировал Huricane - Пятница, 11 Ноября 2016, 22:33
Huricane, тогда подробней: по какому критерию надо отобрать объекты? Объекты какие-то определенные или случайные? Тоже самое касается свойств и значений: имена свойств заранее известны и как должно определятся какое имя свойству дать? Лучше, конечно, если будет какой-нибудь наглядный пример использования данной конструкции.
В любом случае, если нужны динамические, например заданные пользователем, имена свойств, к которым нужно будет обращаться, то я бы копал в сторону словарей - DS Map:
Код
// Объявляем массив с объектами для наглядности objects[0] = obj_knight; objects[1] = obj_mage; objects[2] = obj_thief;
// Создаём стэк и заполняем его нужными нам свойствами attributes_stack = ds_stack_create(); ds_stack_push( attributes_stack, "Health", "Stamina", "Mana", "Stealth", "Science", "Intellect", "Luck" );
// Распихиваем свойства do { var obj = irandom( array_length_1d( objects ) - 1) // Получаем id случайного объекта из массива выше var inst = irandom( instance_number( objects[obj] ) - 1) // Получаем id случайного экземпляра объекта, выбранного выше var inst_temp = instance_find( objects[obj], inst ); // Находим экземпляр
if (is_undefined( inst_temp.map_id )) // Если у экземпляра ещё нет "карты"... inst_temp.map_id = ds_map_create() // ...то создаём "карту" и присваиваем идентификатор экземпляру
ds_map_add( inst_temp.map_id, ds_stack_pop( attributes_stack ), irandom(10) ); // Добавляем в "карту" свойство из стека. // Вместо стека можно использовать и очередь, и пронумерованную очередь... // ...в общем, как захочется. } until (!ds_stack_empty( attributes_stack )); // Повторяем действия до тех пор, пока стек не закончится
// Достаём свойства в специальной функции, которая возвращает false, если у экземпляра нет карты { var obj = irandom( array_length_1d( objects ) - 1) // var inst = irandom( instance_number( objects[obj] ) - 1) // Как и выше - получаем случайный экземпляр случайного объекта var inst_temp = instance_find( objects[obj], inst ); //
if (is_undefined( inst_temp.map_id )) // Если "карты" для этого объекта нет, то выходим из функции return false;
var ID, key, value; // Объявляем временные переменные, в которых будем хранить идентификатор, ключ и значение "карты" ID = inst_temp.map_id; // Получаем id "карты" - чисто для краткости написания key = ds_map_find_first(ID); // Получаем первый ключ "карты"
for (var i = 0; i < ds_map_size(ID); i++) // Перебираем все ключи в "карте" { value = ds_map_find_value(ID, key); // Получаем значение по ключу show_debug_message( key + " : " + value ); // Выводим сообщение с "КЛЮЧ : ЗНАЧЕНИЕ" в консоле отладки key = ds_map_find_next(ID, key); // Получаем следующий ключ } }
По хорошему, надо бы проверок добавить: пустая карта или нет, имеет ли значение данный ключ или нет и т.д.
Задачка достаточно нетривиальная. Можно попробовать менее красивый, топорный, но более наглядный путь: использовать одномерный массив вместо DS MAP. В массиве, например, каждый нечётный элемент хранит ключ, а каждый чётный - значение:
Использование так или иначе будет похожим. Вместо номера идентификатора карты присваиваем экземпляру непосредственно массив. В общем, вариантов много - всё зависит от конкретных задач.
Сообщение отредактировал Rean - Суббота, 12 Ноября 2016, 01:13
Колонку "название" читать как "группа". Есть n кол-во групп, 7 например, которые случайно выбираются для каждой сущности: choose(grp1, grp2, grp3, grp4, grp5, grp6, grp7). Т.е. не обязательно использовать все группы и одна группа может быть у любого кол-ва сущностей. Объектов также n кол-во, но для примера пусть будет 3. В одном объекте должно быть от 1 до 3х сущностей. Далее для каждой сущности случайно из диапазона чисел выбирается значение для 2х оставшихся переменных, к которым по ходу игры можно обращаться. Помогу с текстом, сюжетом, сценарием игры
Объектов также n кол-во, но для примера пусть будет 3. В одном объекте должно быть от 1 до 3х сущностей.
Вот здесь поподробней: какие именно подразумеваются объекты? GameMaker'ские? Или это абстрактный объект? В общем, разложи конкретно на примере что и как должно выглядеть, прям по типам данных. Пока что это настолько абстрактно, что я не представляю в каком ключе это должно использоваться - от этого и сложность реализации. К примеру, если там подразумеваются какие-то новые GM-омвские объекты, то, думаю, это вряд ли возможно реализовать стандартными средствами конструктора. Если под "объектом" подразумевается, например, массив с ссылками на экземпляры - это уже совсем другое и, соответственно, реализовать в разы проще. Если же там должна хранится ссылка на существующий GM-овский объект, у которого либо есть, либо нет экземпляров - здесь тоже ничего сложного.
Далее, сущности, которые должны быть у объекта - какие-то новые сущности или одни из тех, что указаны в таблице? Пока не ясна конкретная задача с конкретными определениями - сложно что-то конкретизировать. Пока представляется следующий алгоритм:
1. Формируем список (например, массив) сущностей, отобранных по определенному критерию 2. Запускаем цикл, в котором перебираем все отобранные сущности 3. Передаем ссылку на сущность в заранее подготовленную функцию SetProperties()
Функция SetProperties(): 1. Определяем переменную iGroup и присваиваем ей случайное значение (например, из заранее подготовленного enum) для полученной сущности. С объектами не всё очевидно, как я уже писал выше, поэтому здесь требуется уточнение 2. Определяем переменную iObject, которой присваиваем ссылку на один из объектов (если объекты могут повторяться, то ссылки на них могут хранится в перечислении enum, если нет - то в стеке, к примеру). Для объекта создаем случайно до 3-х сущностей (опять же, не ясно - сущности УЖЕ должны существовать или нет). 3. В цикле создания сущностей, для каждой новой созданной сущности определяем, к примеру, массив properties[] из двух элементов, либо две отдельные переменные - как душа просит. В момент определения массива или переменных - присваиваем необходимые случайные значения, границы диапазона можно передать в аргументах функции SetProperties, либо исходя из глобальных "констант".
В общем, всё дело в конкретных нуждах и конкретной реализации. Если это реализация некоторого рода искусственного интеллекта масс, то можно посмотреть в сторону одно- и двусвязных списков, членами которого являются экземпляры заранее подготовленного объекта с необходимыми переменными.
Rean, есть 3 объекта - стандартных простейших элемента, с которыми работает ГМ. Допустим из твоего примера: рыцарь, маг, вор. Их не надо отбирать или что-то еще. Они есть и их кол-во известно. Возможно, они должны быть экземплярами 1 объекта, я не в курсе. Есть 7 типов предметов (сущностей, как-угодно можно обозвать, я понятия не имею, каким видом данных или элементов они должны быть в ГМ): меч, булава, трость, посох, перчатки, кинжал, лук. Нам нужно "раздать" их объектам, чтобы каждый получил от 1 до 3х случайных "предметов", неповторяющихся только для конкретного объекта. Других правил нет. Например, рыцарь получает меч, перчатки, посох; маг - меч, лук; вор - булава. У каждого "предмета" есть несколько параметров (раньше мне нужно было 2, теперь я понимаю, что менее чем 5ю не обойтись), которые, очевидно, будут являться переменными (variables). Например, вес, стоимость, имя объекта, кол-во, название. 5 одинаковых переменных для каждого "предмета". Теперь самое сложное. Мне нужно иметь полный доступ ко всем переменным. Например, посчитать, сколько мечей есть у всех объектов вместе. Или изменить все одинаковые переменные для всех "предметов", например, стоимость. И т.п. Помогу с текстом, сюжетом, сценарием игры
Huricane, только сейчас увидел твой комментарий. В принципе, ничего сложного, я в начале подумал, что тебе нужны динамические имена переменных. Здесь же достаточно массива-инвентаря в каждом из персонажей. Персонажи - отдельные объекты, созданные заранее. Все наследуются от объекта, например, characters. Предметы - отдельные объекты, наследуемые от объекта, например, staff. У каждого предмета в событии Create описываем общие для Staff переменные: Name, Weight, Durablity, Cost and etc.
Дальнейшее действие таково: если нам надо будет для всех "Меч обыкновенный" поменять цену - мы просто заходим в данный объект, открываем событие Create и меняем нужное значение. Подробней допишу вечером.
Добавлено: В общем, набросал сегодня проектик, в котором реализовал некоторого рода инвентарь и случайную выдачу объектов юнитам. Скриншот:
Смысл какой: есть группа персонажей (в моем случае, из двух юнитов), которые случайным образом получают заданные предметы из сундука. Чтобы это осуществить, нам необходимо: доступ отдельно к каждому персонажу (или массивом), отдельный инвентарь (в моем случае, список DS List) для каждого персонажа, список (массив) объектов, которые необходимо выдать.
В моём примере, все юниты являются отдельными объектами и наследуются от общего объекта - characters. Вся общая реализация происходит именно там. Главное, что нас сейчас интересует - инвентарь. В этом примере, я его реализовал с помощью списка - DS_List.
Код
// Событие Create // У каждого экземпляра свой id списка, так называемый инвентарь invtr = ds_list_create();
Теперь нам надо как-то дать этим юнитам предметы. В качестве пула, будем использовать сундук, который открывается, когда к нему подходит юнит и выдаёт предметы. Сундук имеет две специальные переменные, которые помогут нам выдать предметы:
Код
// Массив предметов, которые может выдать сундук aItems[0] = stf_mace; aItems[1] = stf_sword; aItems[2] = stf_crook; aItems[3] = stf_dagger; aItems[4] = stf_gloves; // Шанс выдачи каждого предмета rate = 3;
Теперь, когда какой-либо из юнитов подходит близко к сундуку, он открывается и срабатывает ранее написанная функция
Код
GiveItem (char, items, rate)
Первый аргумент - персонаж, которому будут выданы предметы Второй аргумент - массив этих самых предметов Третий аргумент - шанс выпадения предметов.
Два последних аргумента хранятся у сундука, юнита(ов) можно получить различным способом, в моём случае, для теста, ссылки на них уже были заготовлены заранее. Так как юнитов у меня два, то и функцию я вызывал два раза, каждый раз передавая в аргументе ссылку на нужного юнита. Что из себя представляет функция GiveItem():
Код
var _char = argument0; // Получаем персонажа var _items = argument1; // Получаем массив предметов var _rate = argument2; // Получаем шанс выпадения var itemsCount = array_length_1d(_items); // Переменная для удобства - размер массива с предметами
randomize();
with (_char) { if (is_undefined(invtr)) // Если вдруг у юнита нет ссылки на инвентарь, return false; // то выходим из функции и возвращаем False
show_debug_message("Random loot for " + sprName); show_debug_message("--------------------------------");
for (var i = 0; i < itemsCount; i++) // Перебираем все предметы в цикле { if (irandom(10) > _rate) // Если наш рейт меньше, чем выпавшее случайное число, то continue; // переходим к следующей итерации цикла (следующем предмету)
// Дальнейшее происходит, если рейт оказался больше ds_list_add(invtr, instance_create(-100, -100,_items[i])); // Добавляем в список (инвентарь юнита) новый предмет, // экземпляр которого разместили за пределами комнаты show_debug_message(_items[i].name); } } show_debug_message("--------------------------------");
Всё достаточно просто. Теперь у каждого юнита есть отдельный инвентарь со своим набором предметов. Экземпляры предметов разные. То есть, несмотря на то, что, например, Sword у мага и рыцаря создан из одного объекта (stf_sword), который имеет параметры:
Код
name = "Sword"; cost = 200; durability = 100;
В дальнейшем, обратившись к инвентарю одного из персонажа, параметры ЕГО меча можно изменить на желаемые. Так, например, у рыцарского меча со временем будет уменьшаться durability (если это реализовать, конечно. Как вариант - после каждой удачной атаки мечом, прочность уменьшается на -5, для примера). В общем, как-то так. Если нужен будет проект - могу куда-нибудь скинуть, хотя, думаю, и так понятен принцип. Если есть какие-то вопросы по реализации - постараюсь ответить.
Сообщение отредактировал Rean - Среда, 16 Ноября 2016, 01:09
Задача простая. В конец запутался. Пытаюсь сделать так, чтобы игра запоминала и выводила highscore. Но каждый раз, когда игрок возвращается в меню, globalvar'ы обнуляются, т.к. без заданных параметров gamemaker вылетает.
Есть
globalvar A1L1_GEMS и так для каждого уровня (A1L2, A1L3...).
есть GEMS, по которым считаются камни на каждом уровне отдельно.
Есть A1L1_PLAYED, чтобы определить запускался уровень или нет, если он не тру, то A1L1_GEMS = 0, иначе берет показатель GEMS из соответствующего уровня. На бумаге все окей. Но на деле A1L1_PLAYED всегда оказывается false, иначе все рушится, т.к. он должен определить в степе тру он или не тру, а когда параметр не задан заранее, то он рушится, но если я его задаю заранее, то каждый раз при запуске комнаты он обнуляется.
mafon2, немного сумбурно излагаешь. Для начала напиши все задействованные переменные для подсчёта highscore и их области видимости. Где, в каких событиях и каким образом их определяешь.
Как я понимаю, некоторые переменные у тебя объявляются в событии Create (либо комнаты, либо какого-то объекта). Например, если мы используем конструкцию
Код
global.GEMS = 0
при создании комнаты, то каждый раз, когда она будет создаваться - глобальная переменная GEMS будет установлена в значение 0. Вариантом для решения подобной проблемы будет проверка переменной на существование:
Код
if is_undefined(global.GEMS) global.GEMS = 0;
Если переменная не определена, то определяем её, присвоением значения 0. Очень похоже именно на подобную проблему, с постоянным присваиванием начального значения.
Вариантом для решения подобной проблемы будет проверка переменной на существование:
Это именно то, что мне нужно!
В общем, есть объект SYSTEM_INI в нем создаются все глобальные переменные: AXLY_GEMS, AXLY_PLAYED и GEMS.
Есть кнопки для перехода на уровни, в них проверяется запускался ли соответствующий ли им уровень или нет, и если да, то AXLY_GEMS = AXLY_SYS (объект с настройками уровня).GEMS.
GEMS, хоть и глобальная переменная, но обнуляется на каждом уровне (хранится в AXLY_SYS) и считается заново, после чего приравнивается к соответствующему AXLY_GEMS.
---
Позже проверю это проверку на существование и отпишу.
---
UPD
По-разному поигрался с «if is_undefined», посовал туда и сюда, синтаксис поменял, все равно ошибка. Всегда ссылается на строчку с «f is_undefined»
mafon2, у тебя проблема с объявлением переменных. Во-первых, постарайся избегать определений по типу:
Код
globalvar SomeVariableName;
Сами YoYo НЕ рекомендуют использовать данную конструкцию, так как она используется лишь для совместимости со старыми проектами. Наиболее правильный вариант:
Код
global.SomeVariableName = 0
Внимательно смотреть на регистр написания наименований переменных. И из представленного кода не ясно, где ты прописываешь:
Код
globalvar GEMS;
В любом случае, замени его на код выше. Если есть возможность, либо сделай скриншоты с местами, где ты объявляешь переменные и где они вызывают ошибку, либо прикрепи файл с проектом.
Добавлено: Но а вообще, is_undefined по-моему не должен сработать на глобальной переменной. То есть, необходимо местами заменить глобальные переменные на переменные экземпляров. В процессе игры можно работать с такой переменной, а потом, в конце уровня, передать её значение глобальной переменной.
Сообщение отредактировал Rean - Четверг, 17 Ноября 2016, 15:49
globalvar GEMS; // я не могу задать, будет обнуляться global.TOTAL_A1_GEMS = 0; // потом сложим global.A1L1_GEMS = LEVEL_1_SYS.GEMS; if (is_undefined(LEVEL_1_SYS.GEMS)) {LEVEL_1_SYS.GEMS = 0;}
Не по теме, но там же:
кнопка выбора уровня (obj_but_A1L1)
Step (чтобы выводить количество камней наглядней, ну как во всех казуалках)
Код
with obj_gem_counter if (place_meeting (x,y + 16, other)) {with other image_index = A1L1_GEMS; image_speed = 0; }
В комнате LEVEL_1 объект LEVEL_1_SYS, в нем
Create
Код
GEMS = 0;
Step
Код
A1L1_GEMS = GEMS;
Сообщение об ошибке:
Сообщение отредактировал mafon2 - Четверг, 17 Ноября 2016, 19:43