Среда, 04 Декабря 2024, 11:21

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
Вопрос - Ответ (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:
Код
team = 1;

По аналогии проделываешь то же самое и с остальными объектами.

Затем я бы написал функцию, возвращающую любого ближайшего моба, либо только из определённой группы. Примерный код функции (пусть это будет 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;
}

Господи, конечно спасибо, но я ничего не понимаю
Поиск:

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