Четверг, 25 Апреля 2024, 04:11

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Вопрос - Ответ (Game Maker) (Будут пополняться)
Вопрос - Ответ (Game Maker)
dildo_bomberДата: Пятница, 11 Ноября 2016, 17:28 | Сообщение # 5801
частый гость
Сейчас нет на сайте
Цитата Rean ()
Вообще, какие изначальные значения у переменных: 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
ReanДата: Пятница, 11 Ноября 2016, 17:44 | Сообщение # 5802
участник
Сейчас нет на сайте
dildo_bomber,
Цитата dildo_bomber ()
Вообще не судите строго, я бы всё с нуля переписал, если бы было не лень ибо щас смотрю на старый код и охереваю, насколько всё можно было проще и лучше написать.

Всё окей, главное развиваться и попутно развивать свой код. Проблема "временных" костылей в том, что с ростом проекта они становятся фундаментом. Очень ненадёжным фундаментом.

Проблема стрельбы в том, что у тебя событие "Left Button" в объекте obj_plane, что означает - срабатывать при нажатии на объект. Поменяй событие на "Global Left Button". Ну и причеши код в присвоение позиции объекта. Вообще, у тебя origin у спрайта смещён?


Сообщение отредактировал Rean - Пятница, 11 Ноября 2016, 17:51
dildo_bomberДата: Пятница, 11 Ноября 2016, 17:50 | Сообщение # 5803
частый гость
Сейчас нет на сайте
Вооооооооот, вот это я и упустил!
СПАСИБО!

уже сменил на глобал, всё заработало.
ориджин всегда в центре самолёта. быстрый вопрос, возможно в ГМ сделать, что бы курсор не мог покидать пределы окна игры?


Сообщение отредактировал dildo_bomber - Пятница, 11 Ноября 2016, 18:18
ReanДата: Пятница, 11 Ноября 2016, 18:31 | Сообщение # 5804
участник
Сейчас нет на сайте
dildo_bomber, что-то вроде того:
Код

// Устанавливаем мышь в границах игрового окна
window_mouse_set(clamp(window_mouse_get_x(), 0, window_get_width()), clamp(window_mouse_get_y(), 0, window_get_height()));


Сообщение отредактировал Rean - Пятница, 11 Ноября 2016, 18:32
dildo_bomberДата: Пятница, 11 Ноября 2016, 19:16 | Сообщение # 5805
частый гость
Сейчас нет на сайте
у меня лайт версия)
нашел альтернативу, но она не подходит под мою постройку по смещению курсора при паузе. буду думать.
еще раз спасибо!
HuricaneДата: Пятница, 11 Ноября 2016, 21:34 | Сообщение # 5806
почетный гость
Сейчас нет на сайте
Можно каким-либо образом создать переменную из 3х частей, чтобы каждую из них можно было прочитать независимо или без массивов никак?
Или так: есть n объектов, для каждого нужно выбрать k свойств, присвоить каждому случайное название из пула и случайное значение


Помогу с текстом, сюжетом, сценарием игры

Сообщение отредактировал Huricane - Пятница, 11 Ноября 2016, 21:42
ReanДата: Пятница, 11 Ноября 2016, 22:07 | Сообщение # 5807
участник
Сейчас нет на сайте
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
HuricaneДата: Пятница, 11 Ноября 2016, 22:29 | Сообщение # 5808
почетный гость
Сейчас нет на сайте
Rean, речь о разных объектах. Мог бы ты объяснить, как можно сделать это:
Цитата Huricane ()
есть n объектов, для каждого нужно выбрать k свойств, присвоить каждому случайное название из пула и случайное значение

Цитата Rean ()
Добавлено: "случайное название из пула" - это типа, переменные с динамическим именем?

Не столько динамическим, сколько случайным. Например, 10 названий.
Например, нужно 7 свойств со случайными названиями раскидать в 3 объекта и каждому свойству присвоить по 2 значения, и иметь в дальнейшем к ним доступ


Помогу с текстом, сюжетом, сценарием игры

Сообщение отредактировал Huricane - Пятница, 11 Ноября 2016, 22:33
ReanДата: Пятница, 11 Ноября 2016, 22:46 | Сообщение # 5809
участник
Сейчас нет на сайте
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. В массиве, например, каждый нечётный элемент хранит ключ, а каждый чётный - значение:
Код

...
properties[1] = "Health";
properties[2] = 100;
properties[3] = "Mana";
properties[4] = 70;
...

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


Сообщение отредактировал Rean - Суббота, 12 Ноября 2016, 01:13
HuricaneДата: Суббота, 12 Ноября 2016, 07:33 | Сообщение # 5810
почетный гость
Сейчас нет на сайте
Rean, нужно заполнить такую таблицу

Колонку "название" читать как "группа". Есть n кол-во групп, 7 например, которые случайно выбираются для каждой сущности: choose(grp1, grp2, grp3, grp4, grp5, grp6, grp7). Т.е. не обязательно использовать все группы и одна группа может быть у любого кол-ва сущностей. Объектов также n кол-во, но для примера пусть будет 3. В одном объекте должно быть от 1 до 3х сущностей. Далее для каждой сущности случайно из диапазона чисел выбирается значение для 2х оставшихся переменных, к которым по ходу игры можно обращаться.


Помогу с текстом, сюжетом, сценарием игры
ReanДата: Суббота, 12 Ноября 2016, 16:36 | Сообщение # 5811
участник
Сейчас нет на сайте
Huricane,
Цитата Huricane ()
Объектов также n кол-во, но для примера пусть будет 3. В одном объекте должно быть от 1 до 3х сущностей.

Вот здесь поподробней: какие именно подразумеваются объекты? GameMaker'ские? Или это абстрактный объект? В общем, разложи конкретно на примере что и как должно выглядеть, прям по типам данных. Пока что это настолько абстрактно, что я не представляю в каком ключе это должно использоваться - от этого и сложность реализации. К примеру, если там подразумеваются какие-то новые GM-омвские объекты, то, думаю, это вряд ли возможно реализовать стандартными средствами конструктора. Если под "объектом" подразумевается, например, массив с ссылками на экземпляры - это уже совсем другое и, соответственно, реализовать в разы проще. Если же там должна хранится ссылка на существующий GM-овский объект, у которого либо есть, либо нет экземпляров - здесь тоже ничего сложного.

Далее, сущности, которые должны быть у объекта - какие-то новые сущности или одни из тех, что указаны в таблице?
Пока не ясна конкретная задача с конкретными определениями - сложно что-то конкретизировать.
Пока представляется следующий алгоритм:

1. Формируем список (например, массив) сущностей, отобранных по определенному критерию
2. Запускаем цикл, в котором перебираем все отобранные сущности
3. Передаем ссылку на сущность в заранее подготовленную функцию SetProperties()

Функция SetProperties():
1. Определяем переменную iGroup и присваиваем ей случайное значение (например, из заранее подготовленного enum) для полученной сущности.
С объектами не всё очевидно, как я уже писал выше, поэтому здесь требуется уточнение
2. Определяем переменную iObject, которой присваиваем ссылку на один из объектов (если объекты могут повторяться, то ссылки на них могут хранится в перечислении enum, если нет - то в стеке, к примеру). Для объекта создаем случайно до 3-х сущностей (опять же, не ясно - сущности УЖЕ должны существовать или нет).
3. В цикле создания сущностей, для каждой новой созданной сущности определяем, к примеру, массив properties[] из двух элементов, либо две отдельные переменные - как душа просит. В момент определения массива или переменных - присваиваем необходимые случайные значения, границы диапазона можно передать в аргументах функции SetProperties, либо исходя из глобальных "констант".

В общем, всё дело в конкретных нуждах и конкретной реализации. Если это реализация некоторого рода искусственного интеллекта масс, то можно посмотреть в сторону одно- и двусвязных списков, членами которого являются экземпляры заранее подготовленного объекта с необходимыми переменными.
HuricaneДата: Воскресенье, 13 Ноября 2016, 14:14 | Сообщение # 5812
почетный гость
Сейчас нет на сайте
Rean, есть 3 объекта - стандартных простейших элемента, с которыми работает ГМ. Допустим из твоего примера: рыцарь, маг, вор. Их не надо отбирать или что-то еще. Они есть и их кол-во известно. Возможно, они должны быть экземплярами 1 объекта, я не в курсе.
Есть 7 типов предметов (сущностей, как-угодно можно обозвать, я понятия не имею, каким видом данных или элементов они должны быть в ГМ): меч, булава, трость, посох, перчатки, кинжал, лук. Нам нужно "раздать" их объектам, чтобы каждый получил от 1 до 3х случайных "предметов", неповторяющихся только для конкретного объекта. Других правил нет. Например, рыцарь получает меч, перчатки, посох; маг - меч, лук; вор - булава.
У каждого "предмета" есть несколько параметров (раньше мне нужно было 2, теперь я понимаю, что менее чем 5ю не обойтись), которые, очевидно, будут являться переменными (variables). Например, вес, стоимость, имя объекта, кол-во, название. 5 одинаковых переменных для каждого "предмета".
Теперь самое сложное. Мне нужно иметь полный доступ ко всем переменным. Например, посчитать, сколько мечей есть у всех объектов вместе. Или изменить все одинаковые переменные для всех "предметов", например, стоимость. И т.п.


Помогу с текстом, сюжетом, сценарием игры
ReanДата: Вторник, 15 Ноября 2016, 12:30 | Сообщение # 5813
участник
Сейчас нет на сайте
Huricane, только сейчас увидел твой комментарий. В принципе, ничего сложного, я в начале подумал, что тебе нужны динамические имена переменных. Здесь же достаточно массива-инвентаря в каждом из персонажей.
Персонажи - отдельные объекты, созданные заранее. Все наследуются от объекта, например, characters.
Предметы - отдельные объекты, наследуемые от объекта, например, staff. У каждого предмета в событии Create описываем общие для Staff переменные: Name, Weight, Durablity, Cost and etc.

Дальнейшее действие таково: если нам надо будет для всех "Меч обыкновенный" поменять цену - мы просто заходим в данный объект, открываем событие Create и меняем нужное значение.
Подробней допишу вечером.

Добавлено:
В общем, набросал сегодня проектик, в котором реализовал некоторого рода инвентарь и случайную выдачу объектов юнитам.
Скриншот:

Смысл какой: есть группа персонажей (в моем случае, из двух юнитов), которые случайным образом получают заданные предметы из сундука.
Чтобы это осуществить, нам необходимо: доступ отдельно к каждому персонажу (или массивом), отдельный инвентарь (в моем случае, список DS List) для каждого персонажа, список (массив) объектов, которые необходимо выдать.

В моём примере, все юниты являются отдельными объектами и наследуются от общего объекта - characters. Вся общая реализация происходит именно там. Главное, что нас сейчас интересует - инвентарь. В этом примере, я его реализовал с помощью списка - DS_List.

Теперь нам надо как-то дать этим юнитам предметы. В качестве пула, будем использовать сундук, который открывается, когда к нему подходит юнит и выдаёт предметы. Сундук имеет две специальные переменные, которые помогут нам выдать предметы:

Теперь, когда какой-либо из юнитов подходит близко к сундуку, он открывается и срабатывает ранее написанная функция
Код
GiveItem (char, items, rate)

Первый аргумент - персонаж, которому будут выданы предметы
Второй аргумент - массив этих самых предметов
Третий аргумент - шанс выпадения предметов.

Два последних аргумента хранятся у сундука, юнита(ов) можно получить различным способом, в моём случае, для теста, ссылки на них уже были заготовлены заранее. Так как юнитов у меня два, то и функцию я вызывал два раза, каждый раз передавая в аргументе ссылку на нужного юнита.
Что из себя представляет функция GiveItem():

Всё достаточно просто. Теперь у каждого юнита есть отдельный инвентарь со своим набором предметов. Экземпляры предметов разные. То есть, несмотря на то, что, например, Sword у мага и рыцаря создан из одного объекта (stf_sword), который имеет параметры:
Код
name = "Sword";
cost = 200;
durability = 100;

В дальнейшем, обратившись к инвентарю одного из персонажа, параметры ЕГО меча можно изменить на желаемые. Так, например, у рыцарского меча со временем будет уменьшаться durability (если это реализовать, конечно. Как вариант - после каждой удачной атаки мечом, прочность уменьшается на -5, для примера).
В общем, как-то так. Если нужен будет проект - могу куда-нибудь скинуть, хотя, думаю, и так понятен принцип. Если есть какие-то вопросы по реализации - постараюсь ответить.


Сообщение отредактировал Rean - Среда, 16 Ноября 2016, 01:09
HuricaneДата: Среда, 16 Ноября 2016, 11:36 | Сообщение # 5814
почетный гость
Сейчас нет на сайте
Rean, выглядит рабочим, буду разбираться, спасибо!

Помогу с текстом, сюжетом, сценарием игры
mafon2Дата: Среда, 16 Ноября 2016, 20:22 | Сообщение # 5815
был не раз
Сейчас нет на сайте
Задача простая. В конец запутался. Пытаюсь сделать так, чтобы игра запоминала и выводила highscore. Но каждый раз, когда игрок возвращается в меню, globalvar'ы обнуляются, т.к. без заданных параметров gamemaker вылетает.

Есть

globalvar A1L1_GEMS и так для каждого уровня (A1L2, A1L3...).

есть GEMS, по которым считаются камни на каждом уровне отдельно.

Есть A1L1_PLAYED, чтобы определить запускался уровень или нет, если он не тру, то A1L1_GEMS = 0, иначе берет показатель GEMS из соответствующего уровня. На бумаге все окей. Но на деле A1L1_PLAYED всегда оказывается false, иначе все рушится, т.к. он должен определить в степе тру он или не тру, а когда параметр не задан заранее, то он рушится, но если я его задаю заранее, то каждый раз при запуске комнаты он обнуляется.

Что я делаю не так? crazy
ReanДата: Среда, 16 Ноября 2016, 20:55 | Сообщение # 5816
участник
Сейчас нет на сайте
mafon2, немного сумбурно излагаешь.
Для начала напиши все задействованные переменные для подсчёта highscore и их области видимости. Где, в каких событиях и каким образом их определяешь.

Как я понимаю, некоторые переменные у тебя объявляются в событии Create (либо комнаты, либо какого-то объекта).
Например, если мы используем конструкцию
Код
global.GEMS = 0

при создании комнаты, то каждый раз, когда она будет создаваться - глобальная переменная GEMS будет установлена в значение 0. Вариантом для решения подобной проблемы будет проверка переменной на существование:
Код

if is_undefined(global.GEMS)
    global.GEMS = 0;

Если переменная не определена, то определяем её, присвоением значения 0.
Очень похоже именно на подобную проблему, с постоянным присваиванием начального значения.
mafon2Дата: Четверг, 17 Ноября 2016, 08:49 | Сообщение # 5817
был не раз
Сейчас нет на сайте
Цитата Rean ()
Вариантом для решения подобной проблемы будет проверка переменной на существование:


Это именно то, что мне нужно!

В общем, есть объект SYSTEM_INI в нем создаются все глобальные переменные: AXLY_GEMS, AXLY_PLAYED и GEMS.

Есть кнопки для перехода на уровни, в них проверяется запускался ли соответствующий ли им уровень или нет, и если да, то AXLY_GEMS = AXLY_SYS (объект с настройками уровня).GEMS.

GEMS, хоть и глобальная переменная, но обнуляется на каждом уровне (хранится в AXLY_SYS) и считается заново, после чего приравнивается к соответствующему AXLY_GEMS.

---

Позже проверю это проверку на существование и отпишу.

---

UPD

По-разному поигрался с «if is_undefined», посовал туда и сюда, синтаксис поменял, все равно ошибка. Всегда ссылается на строчку с «f is_undefined»



Сейчас лежит в draw :
Код

if is_undefined(A1L1_GEMS)
{A1L1_GEMS = 0;}
draw_text(160, 160, "A1L1 GEMS =:" + string(A1L1_GEMS));


Сообщение отредактировал mafon2 - Четверг, 17 Ноября 2016, 13:57
ReanДата: Четверг, 17 Ноября 2016, 15:12 | Сообщение # 5818
участник
Сейчас нет на сайте
mafon2, у тебя проблема с объявлением переменных. Во-первых, постарайся избегать определений по типу:
Код
globalvar SomeVariableName;

Сами YoYo НЕ рекомендуют использовать данную конструкцию, так как она используется лишь для совместимости со старыми проектами. Наиболее правильный вариант:
Код
global.SomeVariableName = 0

Внимательно смотреть на регистр написания наименований переменных. И из представленного кода не ясно, где ты прописываешь:
Код
globalvar GEMS;

В любом случае, замени его на код выше.
Если есть возможность, либо сделай скриншоты с местами, где ты объявляешь переменные и где они вызывают ошибку, либо прикрепи файл с проектом.

Добавлено:
Но а вообще, is_undefined по-моему не должен сработать на глобальной переменной. То есть, необходимо местами заменить глобальные переменные на переменные экземпляров. В процессе игры можно работать с такой переменной, а потом, в конце уровня, передать её значение глобальной переменной.


Сообщение отредактировал Rean - Четверг, 17 Ноября 2016, 15:49
mafon2Дата: Четверг, 17 Ноября 2016, 19:42 | Сообщение # 5819
был не раз
Сейчас нет на сайте
Экран с выбором уровней, объект SYSTEM_INI

Create

Код

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;}


Не по теме, но там же:


В комнате LEVEL_1 объект LEVEL_1_SYS, в нем

Create

Код
GEMS = 0;


Step

Код
A1L1_GEMS = GEMS;


Сообщение об ошибке:


Сообщение отредактировал mafon2 - Четверг, 17 Ноября 2016, 19:43
ReanДата: Четверг, 17 Ноября 2016, 19:57 | Сообщение # 5820
участник
Сейчас нет на сайте
mafon2, ошибка говорит о том, что у объекта "LEVEL_1_SYS" нет экземпляров. Ты этот объект в комнату добавил?
Позже посмотрю всё сообщение.
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Вопрос - Ответ (Game Maker) (Будут пополняться)
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг