Вопрос - Ответ (Game Maker)
| |
mihailsh | Дата: Среда, 16 Августа 2023, 12:32 | Сообщение # 6101 |
был не раз
Сейчас нет на сайте
| Цитата MagicHero ( ) И дополню не только в первом обькте игровой комнаты
А. ну если это про загрузку еще где-то кроме начала. если в начале. лучше через комнату. а если где-то там в меню, то да, лучше лепить через draw gui ну или просто поверх вывести объект с блокировкой всего (каюсь -пришлось прочитать всё выше чтобы понять что надо всё-таки). Вообще странно это. я бы на его месте просто влепил такую крутящуюся штуку как обычно используют в мобильных играх, мол процесс идёт. еще бы заморочился с buffer_load_async. но наверное будет сложно ему.
Цитата Miple252 ( ) У меня в игре код с сохранением раздулся больше 2000 строк а загрузка вообще больше 7000 вот это очень интересно. что там такое на так много?. Я сейчас в Юнити работаю, там можно в одном классе описать кучу значений разных типов, включая сложные. и потом одной командой выдать из него json. Интересно можно ли сейчас в game maker что-то такое же сделать.
|
|
| |
MagicHero | Дата: Среда, 16 Августа 2023, 14:05 | Сообщение # 6102 |
участник
Сейчас нет на сайте
| mihailsh, Я использую сохранение в ini файл а там каждое значение нужно заносить с указанием группы и имени. С json gamemaker работать умеет но после того как я изначально узнал про работу с ini и изначально начал делать на нем сохранение то забил на изучение работы с json. А для множества однотипных значений порядок которых известен (например товары на складе) использую обычный файл где заношу просто значения одно за другим и через for делаю все одной строкой.
|
|
| |
Miple252 | Дата: Среда, 16 Августа 2023, 14:43 | Сообщение # 6103 |
был не раз
Сейчас нет на сайте
| Боже не заходил на форум несколько дней а вы уже столько написали, так вот, я уже реши это дело самостоятельно через комнату, и сделал плавный переход, сейчас работаю на апгрейдах по типу увеличение получания денег за клик и тд; сейчас застопился на том, как сделать так что бы после покупки увеличивалась цена следующей покупки? Буду благодарен. Добавлено (16 Августа 2023, 14:45) ---------------------------------------------
Цитата MagicHero ( ) Я использую сохранение в ini файл Хм, .ini это удобно но, подходит для игр по типу кликера, где нужно сохранить порядка 5 значений, то да это удобно, но есть и другие масштабные способыДобавлено (16 Августа 2023, 14:46) ---------------------------------------------
Цитата mihailsh ( ) buffer_load_async Хм, я без понятия что это
Сообщение отредактировал Miple252 - Среда, 16 Августа 2023, 14:43 |
|
| |
mihailsh | Дата: Среда, 16 Августа 2023, 15:47 | Сообщение # 6104 |
был не раз
Сейчас нет на сайте
| Цитата Miple252 ( ) Хм, я без понятия что это
лучше не знать чтобы не путаться. это асинхронный метод. он работает паралельно в другом потоке. например надо что-то загрузить в то время, когда игра что-то делает другое. В gms есть несколько таких. В целом хорошо что получилось. А по ценам. можно завести какую-то переменную где хранится количество покупок и хранить её в сейве. соответственно цену считать исходя из этого значения. либо брать из таблицы цен -> количество покупок - цена.
|
|
| |
MagicHero | Дата: Среда, 16 Августа 2023, 15:55 | Сообщение # 6105 |
участник
Сейчас нет на сайте
| Цитата Miple252 ( ) сейчас застопился на том, как сделать так что бы после покупки увеличивалась цена следующей покупки? Можешь тупо вручную через массив где заполнишь вручную все последующие цены покупок. Или если прирост поддается арифметике то просто увеличиваешь цену в зависимости от номера покупки.
Код price=array_create(100,0); // создаст массив на 101 элемент т.к. отсчет идет с 0 но его можно игнорить чтобы удобней было. // заполняешь вручную price[1]=100; price[2]=110; price[3]=135; ....... price[100]=10000;
// при покупке просто подставляешь значение в зависимости от номера числа покупок item_price=price[10]; // стоимость 10-й покупки
// либо если прирост цены известен, например +10 за число покупок (number_price) или что то посложнее типа +5+5*число_покупки item_price=10*number_price; item_price=5+5*number_price;
|
|
| |
mihailsh | Дата: Среда, 16 Августа 2023, 16:20 | Сообщение # 6106 |
был не раз
Сейчас нет на сайте
| Miple252, можно еще намутить массив структур. но это если хочется лезть в дебри нового функционала. хотя ему вроде уже года три.
price = function(_buycount, _price) constructor { buy_count = _buycount; buy_price = _price; }
prices = [ new price(1, 100), new price(5, 200), new price(10,300) ]
get_price = function(_buycount) { var result_price = 0; for(var i=0; i< array_length(prices); i+=1) { if( prices[i][$ "buy_count"] > _buycount){ if(i>0) { result_price = prices[i-1][$ "buy_price"]; } else { result_price = prices[0][$ "buy_price"]; } break; } } if(result_price == 0) result_price = prices[array_length(prices)-1][$ "buy_price"]; return result_price; }
и вызывать функцию get_price( сколько покупок) в таком случае например с первой по пятую покупку одна цена. с 6 по 10ю уже другая. и так далее можно миксовать. Если что я набрал в блокноте - у меня сейчас gms недоступен, могут быть небольшие ошибки. вообще прикольный вариант. Но можно аналогично сделать двумя массивами - в одном хранить список на сколько покупок. во втором список цен в соответствующих индексах.Добавлено (16 Августа 2023, 18:39) --------------------------------------------- MagicHero, Посмотрел игру про транспорт - прикольно. видимо transport tycoon вдохновлял. Занятно. Художника бы туда. чтобы красиво нарисовал - особенно ui. Иногда отзывчивость страдает - создать новый маршрут пшеницы - рука показывает. но что-то кнопку не нажать. И если принудительно закрыть игру - она не сохраняется. вроде можно событие ev_game_end перехватывать в other и сохранять перед закрытием. Поиграю на досуге.
Сообщение отредактировал mihailsh - Среда, 16 Августа 2023, 17:36 |
|
| |
MagicHero | Дата: Среда, 16 Августа 2023, 19:24 | Сообщение # 6107 |
участник
Сейчас нет на сайте
| mihailsh, Насчет массива то все сводится к нумерации покупки и цене. У меня по сути все тоже самое и под нумерацией покупки уже идет номер массива. Т.е. у тебя просто избыточная работа. Вот если бы там был перечень товаров вместо номера покупки, например яблоки, груши и т.д. и для каждого цена то твой пример подошел бы идеально.
Да рисовать я не умею, поэтому делаю все в 3Д в блендере, потом рендерю и вставляю в игру. С менюшками уже сложнее и их кое как нарисовал. С пшеницой в начале это обучение идет (странно что не работало) и там нет сохранений, пока не пройдешь обучение. В самой игре реализовано как автосохранение через определенное время так и ручное.
Цитата mihailsh ( ) И если принудительно закрыть игру - она не сохраняется. вроде можно событие ev_game_end перехватывать в other и сохранять перед закрытием. А вот это интересно, я вообще не нашел какой либо инфы насчет выполнения кода при принудительном закрытия игры. То же событие game end ничего в таком случае не делает. А мне бы это не помешало чтобы отрубать соединение с сервером отправкой пакета. Но делая такой код в этом событии эффекта нет. И на сервере остается соединение навеки из-за чего мне пришлось на сервере сделать таймер для каждого соединения который бы обрубал его если игрок сам не разорвал, что можно сделать если нажать выход в игре.
Сообщение отредактировал MagicHero - Среда, 16 Августа 2023, 19:33 |
|
| |
mihailsh | Дата: Среда, 16 Августа 2023, 19:40 | Сообщение # 6108 |
был не раз
Сейчас нет на сайте
| Цитата MagicHero ( ) Но делая такой код в этом событии эффекта нет Может что-то у них не доделано. Либо оно плохо под андроидом. Хотя, Судя по документации, это должен быть аналог MonoBehaviour.OnApplicationQuit()
Цитата MagicHero ( ) С менюшками уже сложнее и их кое как нарисовал Можно попробовать на figma. com дизайнить панельки кнопки и прочее. Наглядно. И шрифты подобрать. Графическую часть можно кусками экспортировать в png
Добавлено (16 Августа 2023, 19:57) ---------------------------------------------
Цитата MagicHero ( ) А вот это интересно, я вообще не нашел какой либо инфы насчет выполнения кода при принудительном закрытия игры.
потестирую эту вещь. может что найду еще - сообщу.
Добавлено (17 Августа 2023, 01:02) ---------------------------------------------
Цитата MagicHero ( ) То же событие game end ничего в таком случае не делает.
В общем оно работает только под windows linux mac os и в некоторых браузерах html5. на мобильных девайсах не пашет. Что странно. в других движках вполне использовал. и там нормально отрабатывало.
Сообщение отредактировал mihailsh - Четверг, 17 Августа 2023, 01:02 |
|
| |
artemtwill | Дата: Пятница, 25 Августа 2023, 20:57 | Сообщение # 6109 |
уже был
Сейчас нет на сайте
| Приветы. Подскажите такую формулу скорости снаряда, чтобы она расчитывалась относительно скорости выпускающего снаряд игрока. Например: - начальная скорость снаряда 10; - скорость движения игрока 100 - в направлении 0 градусов;
значит скорость снаряда выпущенного в направлении: - 0 градусов будет 110; - 90 и 270 градусов будет 10; - 180 градусов будет -90;
изначально сделал speed = 10 + obj_player.speed; но так получается во все стороны по 110 т.к. speed это просто максимальная скорость.
может есть возможность считать скорость игрока именно в направлении выстрела? или нужно использовать hspeed и vspeed?
|
|
| |
UNIT02_GAMES_STUDIO | Дата: Воскресенье, 27 Августа 2023, 17:34 | Сообщение # 6110 |
почетный гость
Сейчас нет на сайте
| Допустим у меня есть три вида мобов: сам игрок, люди и зараженные. У каждого свой соответствующий родительский объект (ParentPlayer, ParentHuman, ParentInfected).
И возникла идея к примеру стравить людей и зараженных, но при этом что бы каждый из них в то же время мог атаковать и игрока. На данный момент ближайший враг определяется с помощью - instance_nearest(x,y,ParentInfected). Но он выбирает какую-то одну группу, игнорируя другую. Как тут можно грамотно прописать определение ближайшего "врага" среди двух разных групп (родительских объектов)? Да, вроде простая задача, но я никак не могу составить логику.
МОИ ИГРЫ: • [2D] Агент Green [Action-platformer] • [2D] Оставшиеся: Мир После Нас [TDS]
Сообщение отредактировал UNIT02_GAMES_STUDIO - Воскресенье, 27 Августа 2023, 17:35 |
|
| |
AlexanderBekker | Дата: Воскресенье, 27 Августа 2023, 20:39 | Сообщение # 6111 |
BekkerDev Studio
Сейчас нет на сайте
| UNIT02_GAMES_STUDIO, по-хорошему, я бы всем существующим в игре мобам, включая игрока, присвоил одного общего родителя: пусть это будет ParentMob. А каждой группе прописал бы уникальные идентификаторы. Так, создаёшь объект ParentMob и ему в Create пишешь:
Код team = 0; // 0 - игрок, 1 - люди, 2 - заражённые Затем создаёшь объект ObjHuman, в качестве родителя присваиваешь ему ParentMob и пишешь в Create:
По аналогии проделываешь то же самое и с остальными объектами.
Затем я бы написал функцию, возвращающую любого ближайшего моба, либо только из определённой группы. Примерный код функции (пусть это будет findNearMob) выглядел бы так:
Код var near = -1; var dist = 999999; with (ParentMob) { var newDist = distance_to_object(other); if ((team == argument0 || argument0 == -1) && self != other && newDist < dist) { near = self; dist = newDist; } } return near;
Теперь, когда нужно найти ближайшего моба, нужно вызвать нашу функцию:
Код var nearInfected = findNearMob(2); // ищем ближайшего заражённого var nearAny = findNearMob(-1); // ищем ближайшего моба любой группы if (nearAny != -1) { // моб найден }
Разработчик, композитор и издатель инди-игр в Steam. Редактор карт: BekkerDev Level Editor 4 Страница разработчика в Steam Паблик ВК: BekkerDev Studio
Сообщение отредактировал AlexanderBekker - Воскресенье, 27 Августа 2023, 20:57 |
|
| |
AlexanderBekker | Дата: Воскресенье, 27 Августа 2023, 20:51 | Сообщение # 6112 |
BekkerDev Studio
Сейчас нет на сайте
| artemtwill, скорость объектов в 2D (и не только) обычно описывается двумерным вектором, значения которого обозначают скорость движения по двум осям X и Y. В данном случае можно было бы написать так, если я правильно понял суть задачи:
Код projectile.hspeed = 10 + lengthdir_x(obj_player.speed, obj_player.direction); projectile.vspeed = 10 + lengthdir_y(obj_player.speed, obj_player.direction);
Разработчик, композитор и издатель инди-игр в Steam. Редактор карт: BekkerDev Level Editor 4 Страница разработчика в Steam Паблик ВК: BekkerDev Studio
|
|
| |
UNIT02_GAMES_STUDIO | Дата: Воскресенье, 27 Августа 2023, 23:42 | Сообщение # 6113 |
почетный гость
Сейчас нет на сайте
| AlexanderBekker, вроде сделал по инструкции, но пока что-то не работает. Или я как-то напутал. Непонятно что мобы определяют и определяют ли вообще. Что нужно подкорректировать? Пример - исходник GM.
МОИ ИГРЫ: • [2D] Агент Green [Action-platformer] • [2D] Оставшиеся: Мир После Нас [TDS]
|
|
| |
AlexanderBekker | Дата: Понедельник, 28 Августа 2023, 12:12 | Сообщение # 6114 |
BekkerDev Studio
Сейчас нет на сайте
| UNIT02_GAMES_STUDIO, у меня давно уже нет Game Maker, поэтому с исходником не смогу помочь. Что конкретно не работает?
Разработчик, композитор и издатель инди-игр в Steam. Редактор карт: BekkerDev Level Editor 4 Страница разработчика в Steam Паблик ВК: BekkerDev Studio
|
|
| |
mihailsh | Дата: Среда, 30 Августа 2023, 13:48 | Сообщение # 6115 |
был не раз
Сейчас нет на сайте
| Цитата AlexanderBekker ( ) сделал по инструкции, но пока что-то не работает запустил на первой студии. вроде нормально всё работает - двигаю кубики и каждый кубик показывает кто ближайший. и линию к ближайшему рисует. Он считает от точки где определяется x и y объекта она может быть сдвинута относительно центра. хотя тут вроде центр поставлен. в общем у меня работает на game maker studio 1.4. возможно в более старых есть нюансы.Добавлено (30 Августа 2023, 14:07) --------------------------------------------- UNIT02_GAMES_STUDIO, а. я понял. он у тебя реагирует на всех а тебе надо на определенных игнорируя других. посмотрю чуть позже. отпишусь. если кто-то еще не ответит. Добавлено (30 Августа 2023, 14:22) --------------------------------------------- UNIT02_GAMES_STUDIO, Понятно - ты отрисовываешь для nearAny - у тебя в step определяется например nearHuman = scrFindEnemy(1) nearAny = scrFindEnemy(-1) Но в отрисовке используется только nearAny если отрисовывать для nearHuman - будет искать его и линию к нему рисовать. и аналогично для поиска других групп. Код от AlexanderBekker работает отлично. Например - если в obj Enemy в Draw добавить
draw_set_color(c_green) draw_text(x+32,y-20,"Инфицированный - " + string(object_get_name(nearInfected.object_index))) draw_line(x,y,nearInfected.x,nearInfected.y)
то он будет еще зелёными к этим квадратам искать ближайшего. и всё будет понятно. наверное
Сообщение отредактировал mihailsh - Среда, 30 Августа 2023, 13:49 |
|
| |
UNIT02_GAMES_STUDIO | Дата: Среда, 30 Августа 2023, 15:38 | Сообщение # 6116 |
почетный гость
Сейчас нет на сайте
| mihailsh, да, я тоже пробовал менять в Draw nearHuman и nearAny. Разные эксперименты с кодом проводил, результат один, и какой-то непонятный. Т.е. люди и зараженные будто постоянно сами себя "считают" ближайшими врагами. Я если что использую GM8, он вроде как заметно отличается от GML в студии. Поэтому вопрос пока остается открытым, как это адаптировать под GML в GM8.
МОИ ИГРЫ: • [2D] Агент Green [Action-platformer] • [2D] Оставшиеся: Мир После Нас [TDS]
|
|
| |
mihailsh | Дата: Среда, 30 Августа 2023, 18:44 | Сообщение # 6117 |
был не раз
Сейчас нет на сайте
| Цитата mihailsh ( ) Поэтому вопрос пока остается открытым, как это адаптировать под GML в GM8.
похоже в 8м косяк с передачей self и other в функцию и вообще с ними и with по другому работает, не так как в gms. Я бы даже сказал что вообще не работает. other вроде только функции колизий пользуют. Не уверен. старое это всё. можно в step добавить например у зомби что-то вроде nearAny = instance_nearest(x, y, objEnemy); и обыграть через неё. без использования родителя. с родителем всё дело глючит.
Сообщение отредактировал mihailsh - Среда, 30 Августа 2023, 19:20 |
|
| |
UNIT02_GAMES_STUDIO | Дата: Среда, 30 Августа 2023, 21:58 | Сообщение # 6118 |
почетный гость
Сейчас нет на сайте
| ТАК НАРОД! Путем небольшого мозгового штурма в одиночку, я придумал вот такой костыль, который вроде делает то, что мне нужно. Код выглядит примерно так:
Код EnemyNearest = noone // Ближайший враг пока не определен AliveQuantity = instance_number(ParentAliveAll) // Количество экземпляров персонажей на локации Distance = 999999 // Стартовая дистанция поиска for (i = 0; i < AliveQuantity; i += 1) // Запуск цикла { FindEnemy = instance_find(ParentAliveAll,i) // Поиск среди экземпляров NewDist = distance_to_object(FindEnemy) if FindEnemy.EnemyTeam != EnemyTeam && self != FindEnemy && NewDist < Distance // Если "команда" другого экземпляра не совпадает { EnemyNearest = FindEnemy //...то он наш враг Distance = NewDist } }
МОИ ИГРЫ: • [2D] Агент Green [Action-platformer] • [2D] Оставшиеся: Мир После Нас [TDS]
|
|
| |
mihailsh | Дата: Четверг, 31 Августа 2023, 00:32 | Сообщение # 6119 |
был не раз
Сейчас нет на сайте
| Цитата UNIT02_GAMES_STUDIO ( ) я придумал вот такой костыль, Класс. Я тоже почти к этому пришел. Не хватило времени, работал). Супер. Может кому-то это поможет. кто на 8м еще остался.
|
|
| |
Miple252 | Дата: Пятница, 08 Сентября 2023, 22:52 | Сообщение # 6120 |
был не раз
Сейчас нет на сайте
| Цитата mihailsh ( ) Miple252, можно еще намутить массив структур. но это если хочется лезть в дебри нового функционала. хотя ему вроде уже года три.
price = function(_buycount, _price) constructor { buy_count = _buycount; buy_price = _price; }
prices = [ new price(1, 100), new price(5, 200), new price(10,300) ]
get_price = function(_buycount) { var result_price = 0; for(var i=0; i< array_length(prices); i+=1) { if( prices[i][$ "buy_count"] > _buycount){ if(i>0) { result_price = prices[i-1][$ "buy_price"]; } else { result_price = prices[0][$ "buy_price"]; } break; } } if(result_price == 0) result_price = prices[array_length(prices)-1][$ "buy_price"]; return result_price; } Господи, конечно спасибо, но я ничего не понимаю
|
|
| |
|