Вы видите копию треда, сохраненную 2 августа 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Задумал сделать 2d игру и не знаешь с чего начать? Качай демоверсию гамака
https://www.yoyogames.com/get
и запускай туториалы Шона Спалдинга
https://www.youtube.com/user/999Greyfox/playlists
Движок платный. Покупать лучше в стиме, по региональной цене. Десктоп версия 1600р.
Полезные каналы:
https://www.youtube.com/channel/UC7fkptPD1FHQyDc9Fnm9S_A
https://www.youtube.com/channel/UCdpsYesx7bwrKGU_u9hcwIg
https://www.youtube.com/channel/UCrHQNOyU1q6BFEfkNq2CYMA
https://www.youtube.com/channel/UCnKHIXYeYkehIJtF414f65A
Прошлый тред тонет здесь: >>617577 (OP)
Для производительности хуже делать поиск пути каждый шаг и выполнять код в draw_event.
На херню вроде этой обращать внимания не нужно до тех пор, пока ты не выполняешь это 1000 раз в цикле каждый шаг.
Ну а вообще можешь затестить. Сделай цикл с 100000 обращений к obj_player.ammo и global.ammo каждый шаг и сравни фпс.
Потом нам расскажешь.
Разве код в draw разве хуже для производительности, чем в step? На форумах давно читал, что разницы нет
Только что проверил с помощью цикла в цикле и всяких операций внутри.
Производительность от выполнения кода в степе не отличается от выполнения того-же самого в драве. Может, если бы там было какое рисование, тогда разница была бы заметна, но у меня в пустом проекте без спрайтов разницы нет.
Производительность при обращении к глобальной переменной выше, чем при обращении к переменной объекта. Полусчилось, что у глобальной ФПС был больше 200, инога падал до 130, не знаю почему. А при обращении к переменной объекта фпс никак вообще не поднимался выше 130
>The draw event is a very intensive event, in that it's one of the events that takes up most time and resources... to that end it is never a good idea to do anything in the draw event other than drawing. So save your large code or complex actions for the Step event or Alarms or whatever other event fits, but leave the draw event clear for the drawing as that's what it does best.
В пустом проекте с парочкой draw call у тебя разницы не будет. Но хуле, ты ж лучше шаришь в гамаке, чем его создатели.
Ебашь код в draw, не слушай никого.
НЕ ПЫТАЙТЕСЬ ПЕРЕКАТЬСЯ НА 2.3!!!!
Не движкосрача для, а предупреждения анончиков ради.
А я всё равно попробую. Бета нормально работает.
Ага, приятного аппетита.
Теперь все скрипты переписывать под формат function что ли? Вписывать все аргументы в скобки или даже переименовывать их. Скрипты же теперь глобальными стали и запускаются при запуске же игры.
При этом при конвертации всё работало ровно до тех пор, пока не захотел добавить скриптик новую функцию.
Или я чего-то не понимаю в конвертировании?
Переписывать ничего не пришлось, кроме замены названия переменной "new" на "new_quest", т.к. new в новой версии ключевое слово.
>>692155
Компилятор сам расставил внутри всех моих скриптов строки
function sc_box_add_item(argument0, argument1, argument2, argument3)
{
Внутри старый скрипт без изменений.
}
Скрипты вроде работают.
Но да, есть поломки. Например у меня по какой-то причине обрываются некоторые звуки и музыкальные треки.
Пока изучаю.
Неприятно.
Как-то по другому стал вычисляться image_index, благодаря чему я словил ошибку точности вычислений.
Сравненивая (3.99999523162842 < 4) имеет результатом ложь. Впрочем ничего нового.
А с хуя ли он принудительно ставит апдейт? Типа логиниться не дадим, переходи на новые костыли. Что за неувожение?
Это вроде был drm апдейт специальный. На 2.3 перекатываться не заставляют.
Радует, что у анона хотя бы нормально работает. У меня же после конвертации при открытии скрипта окошко с кодом осталось точно таким же, никаких изменений в коде, однако рядом же (сверху) появилось другое окно, в котором указано название скрипта, аргументы в каждой отдельной строчке и пара чек боксов внизу. Возможно, это с чего-то включилось DnDшное оформлений функций, хотя само DnD вообще не используется в проекте. Как это проверить? Или що делать?
Видимо, изначально всё таки это был DnD проект. Хотя и не ясно, почему канпилятор ругается на все функции после "успешной" конвертации.
Как проще всего свичнуться в GML? Можно всё экспорировать или галочку какую нажать?
У меня при конвертации куча ошибок вылезла. Второй день правлю и хз сколько ещё займёт.
Конечно это лишний повод пробежаться по всем частям игры...
Дс_листы удаляю сразу после использования.
Циклы while и подобное юзаю в 2х скриптах (из тех, которые выполняются непосредственно во время нахождения в игровой комнате), вызываются они достаточно редко. В принципе, они могут быть причиной, однако тесты в пустой игровой комнате, где сбоев у этих скриптов быть не должно, всё равно приводят к этой ошибке с, кажется, не меньшей редкостью.
Обнаружил это после переезда на 2.3.
Тут кто-то пишет возможную причину https://itch.io/t/890645/feature-recommendation-tips-for-gms23-users. но GMLive - это всё таки не GMS2, хотя девелопер и пишет, что причина может крыться в багах GMS2.
Есть соображения, как искать ошибку?
UPD: дебаггерый режим просадки в FPS не показывает (вроде... из-за некоторой непредсказуемости момента вылет мог не успеть глянуть), но есть секундного масштаба фриз перед вылетом.
После того, как обнаружил что у меня ещё и пропали НЕКОТОРЫЕ из прикреплённых файлов и что сломались НЕКОТОРЫЕ из функций сохранения, и перестали проигрываться НЕКОТОРЫЕ звуки, принял решение не перекатываться.
Методы буду осваивать после того, как котёл доделаю.
Такое бывает, если ты где-то конкретно накосячил.
Создай debug project и закрывай комментами код, с которым ты работал в последнее время и пробуй запускать. Когда сообщение "Runner.exe exited with non-zero status исчезнет поймёшь, где именно искать.
При том мне пока даже хватит оставить z компонент за ноль, камера по вертикали мало двигается. Как из переменной поворота камеры простым кодом высчитать x и y компоненты вектора оси?
Я мог бы конечно наговнокодить лютое говно, которое будет даже работать, но лучше же нормально закодить.
d3d_transform_add_rotation_axis(cos(degtorad(o_camera.pan)),sin(degtorad(o_camera.pan)),0,-10(1-2side))
сделал так, но чот не всегда по нужной оси вращает, когда угол поворота камеры ближе к 0 90 180 и 270 то работает как по маслу, а на углах в 45 градусов ебенит по другой оси, как-будто я и не поворачивался
Безрезультатно. Зато в 2.2.5 всё збс. Подозреваю, что это баг 2.3.
Врываюсь в тред! Короче, у тебя где-то дата вытекает лишняя, проверь наследуемость, и ds листы и карты.
Сегодня столкнулся с такой траблой, тоже долго ковырялся.
Все ds-листы обычно больше десятка строчек не живут (но перепроверю, все ли убиваются), карт и наследуемости нет. Энивей, спасибо за внимание и советики, анон.
Предположим, мне нужно рисовать спрайт, который не вшит в сам объект, и его анимацию нужно будет контролировать (выключать, если она кончится, например). В таком случае нужно будет создавать скорость image_index'а для этого спрайта отдельной переменной и прибавлять по команде. Вопрос: по какой формуле тогда просчитывать эту скорость, чтобы она была идентична той, что указана на самом спрайте?
Ну например, в draw event пишу:
if draw
{
draw_sprite(sprite_name,spd,x,y)
}
В то же время в step event:
if !draw
{
draw = true
spd += 0.1
}
if spd >= 10
{
draw = false
spd = 0
}
Как в данном случае рассчитать всё таким образом, чтобы прибавка к spd хотя бы приблизительно была равна нужной скорости, которая указывается на спрайтах (10 fps, 15 fps)?
Ну смотри, у тебя есть room speed, которая 60 по умолчанию, у тебя есть спрайт допустим 15 фпс, 60/15=4. Соотвественно чтобы он работал с нормальной скоростью, тебе нужно показывать инкрементировать image_index раз в четыре степа, то есть в примере ниже будет у тебя что-то вроде spd+=0.25, только напрямую это сделать не выйдет, draw_sprite только целые значения принимает.
А вообще проще было бы сделать спрайт отдельным объектом.
Draw_sprite прекрасно принимает не целые значения. Он просто отбрасывает не целую часть, как floor().
System Requirements
OS: Microsoft 64bit Windows 7.
Processor: 64bit Intel compatible Dual Core CPU.
Memory: 2 GB RAM.
Graphics: OpenGL 4-compliant onboard graphics.
DirectX: Version 11.
Storage: 3 GB available space.
На б/у Thinkpad за 10к рублей будет летать.
if keyboard_check_pressed(ord("F"))
{
b = instance_create(x, y, obj_projectile)
if (image_xscale = 1) b.direction = 180;
else b.direction = 0;
b.speed = bulletspeed;
}
Драг н дроп - это отсталая тема, что-то типа базового кодинга для самых маленьких. Симулятор ходьбы в сайдскроллере в нём может и удастся сделать, но для случая, если тебе нужен будет больший функционал, лучше сразу начинать кодить на ГМЛ.
>в любом случае нужно смотреть на код других?
Ну если ты говоришь, что у тебя нет знаний кода вообще, то да, нужно смотреть на то, как делают другие, и курить мануалы гамака, в которых говорится, какая функция что делает. Потом уже поймёшь, как и что работает, и будешь сам делать.
В смысле, чтобы она у тебя по баллиcтической кривой двигалась?
Пишешь в step пули что-то вроде
speed-=0.01
y-=0.001
и радуешься.
Кстати, F -- это не самый лучший выбор для кнопки стрельбы, ctrl или z были бы удобнее.
Ну епт, обидно. Я послушал этого Спелдинга, и ладно на ангельском говорит, более менее понятные слова, но как же он тараторит, какой то акцент непонятный + дефект речи. одним словом программист
Спасибо конечно за совет, но это нихуя не сработало. Пули все еще летят строго горизонтально.
Ну он тебе предложил у изменять на 1/1000. Изменяй у на 10 и посмотри на разницу.
Подгоняй цифры в соответствии со своими размерами и скоростями.
>адекватный
>>686540 (OP)
> Десктоп версия 1600р
>>686540 (OP)
>платный
Да я на такие деньжищи джва месяца жить буду!
мимо среднестатистический геймдевелопер
Это может происходить когда игра обращается к конкретному айди ресурса, если стоящие перед ним звуки добавлялись/удалялись игра по этому айди находит другой ресурс. Если в этом дело, попробуй к звукам обращаться через ассет_гет_индекс и вводи там стринг с названием ресурса.
А, там у меня небольшой проеб в коде, забыл как в гамаке координаты работают, нужно к y прибавлять, а не отнимать.
попробуй так:
if (speed>1){
speed-=0.1
}
y++;
Будет падать, не прилетая обратно.
А если хочешь реальную арку, чтобы сначала еще и поднималась, то тогда нужно ввести понятие вертикальной скорости, которую ты прибавляешь ко все тому же y:
y+=vspeed
vspeed+=0.1;
и про которую в create пишешь
vspeed=-3; (ну или какое число тебе подходит)
Или можешь усадить пулю на path в относительных координатах https://docs2.yoyogames.com/source/_build/2_interface/1_editors/paths.html
Собираюсь с нуля сделать успешную игру за год в одно рыло. Какие подводные?
> Какие подводные?
Надоест через неделю и дропнешь. Но дропнешь не сразу. Ещё месяц будешь манямечтать о сеттинге, как там замок злого устроен, какие домики в лесу эльфов, как устроена иерархия разбойников. А потом еще через месяц придёт понимание, что тебе вообще нахуй не интересно этим заниматься.
Ну смотри:
2 недели - освоение основных возможностей движка, которые мне нужны.
2 недели - создание тестового уровня для отработки механник
Какое-то время на освоение анимаций. Прокачивнаие скилла в процессе
Далее покупка моделек и прочего, ибо я не художник
Все, можно собирать и пилить игру
>>702730
Ух, опасно. Взял пока пробную версию. Если через месяц не надоест, то приду сюда с результатами
При запуске дебагера вот эта хуйня на пике не появляется. Как-то раз закрыл ее и все. Как фиксить?
Спасибо!
Пофиксил нормальным кодом
Стоит ли осваивать GML?
Конструктор, ёпт.
viewx=camera_get_view_x(view_camera[0])
camera_set_view_pos(view_camera[0],viewx,camera_get_view_y(view_camera[0]))
Использование camera_set_view_speed(view_camera[0],tihohodi,0) ничего не дает
Есть ли внятный туториал по камере? а то находил только со слежением за объектом
viewx+=1 быстрофикс
Вводная такова: я создаю три стены циклом и меняю их размер, как мне надо:
for ...
{
var _wall = instance_create_layer(..., "Instances", obj_wall);
with {_wall}
{
image_xscale = ...
image_yscale = ...
image_angle = ...
}
}
Потом включаю физику у всех:
with (obj_wall)
{
box_fixture = physics_fixture_create();
physics_fixture_set_density(box_fixture, 0);
physics_fixture_set_awake(box_fixture, true);
physics_fixture_set_box_shape(box_fixture, sprite_width/2, sprite_height/2);
my_fix = physics_fixture_bind_ext(box_fixture, id, -(sprite_width / 2), -(sprite_height / 2));
physics_fixture_delete(box_fixture);
}
Изначально у obj_wall галочки стоят на Visible и Solid (то есть их нет на Persistent и Uses Physics), а в физике стоит галочка на Start Awake;
В итоге, как и планировалось, я получаю 3 длинных стены, которые пересекаются своими концами. Сама проблема вот в чём: 1 или 2 стены обычно настоящие, а остальные (стало быть 2 или 1) рисуются, у них отображается fixture (или так: "flag = phy_debug_render_aabb | phy_debug_render_collision_pairs | phy_debug_render_obb;" только collision shape отображается?), но персонаж сквозь них легко проходит.
Может ли дело быть в том, что слетает физика? Или в чём? (обоснуя за объекты вместо тайлов не будет, сорян)
Вводная такова: я создаю три стены циклом и меняю их размер, как мне надо:
for ...
{
var _wall = instance_create_layer(..., "Instances", obj_wall);
with {_wall}
{
image_xscale = ...
image_yscale = ...
image_angle = ...
}
}
Потом включаю физику у всех:
with (obj_wall)
{
box_fixture = physics_fixture_create();
physics_fixture_set_density(box_fixture, 0);
physics_fixture_set_awake(box_fixture, true);
physics_fixture_set_box_shape(box_fixture, sprite_width/2, sprite_height/2);
my_fix = physics_fixture_bind_ext(box_fixture, id, -(sprite_width / 2), -(sprite_height / 2));
physics_fixture_delete(box_fixture);
}
Изначально у obj_wall галочки стоят на Visible и Solid (то есть их нет на Persistent и Uses Physics), а в физике стоит галочка на Start Awake;
В итоге, как и планировалось, я получаю 3 длинных стены, которые пересекаются своими концами. Сама проблема вот в чём: 1 или 2 стены обычно настоящие, а остальные (стало быть 2 или 1) рисуются, у них отображается fixture (или так: "flag = phy_debug_render_aabb | phy_debug_render_collision_pairs | phy_debug_render_obb;" только collision shape отображается?), но персонаж сквозь них легко проходит.
Может ли дело быть в том, что слетает физика? Или в чём? (обоснуя за объекты вместо тайлов не будет, сорян)
быстрофикс естественно \t в начале строк у меня нет, двощи такие сложные
UPD: Видимо, проблема том, что fixture фигово накладываются для тех стен, у которых image_xscale и image_yscale задавался отрицательным. Хотя рисуются такие стены хорошо и правильно. Как и их fixture. И это странно. Баг гамака или я что-то упускаю?
Если у объектов в настоящее время нет импульса, то вместо использования фикстур для создания колизии можно вполне создавать на месте старого новый объект)
Зачем так делать?
Энивей, проблема разрешилась: при накладывании fixture на объект с отрицательным image scale происходит ничего. Вроде. Всё исправил. Спасибо за внимание.
Ну в последнее время да, по крайней мере базовый функционал игры. Вообще судя по вопросу ты только вкатываешься в гейдев, так что тут особой разницы нет, главное - понять, как что работает, а дальше сможешь сам хуячить с нуля почти всё, так что тут он подойдёт, ну и ещё какой-нибудь PixelatedPope.
Не за что. У Шона советую глянуть последнюю серию по созданию экшон-рпг, где он показывает, как с нуля сделать небольшую игру с камерой, ходьбой и прочим.
посоветуйте как запилить физику шара для арканоида. мне надо запилить что-то вроде этого https://www.youtube.com/watch?v=AXl7FlgfZvA
Раскрой вопрос. В чём у тебя вообще проблема встала? В том, что ты физики и математики не знаешь?
https://www.fortu.ru/product/kniga_matematicheskaya_teoriya_yavleniy_bilyardnoy_igryi_koriolis
Дело в том, что вот сделал я так, чтобы шар отскакивал, да. Но вот проблема - если в самом начале шар попадает в верхнюю стенку, то он начинает скакать вверх-вниз и в результате застревает
Тред и диалог не читал, но такая проблема может быть.
Тебе надо проверять находится ли шар/точка за стенкой + направление его вектора. Например, если условные pos.y > wallheight && dir.y > 0, то dir.y = -dir.y. То есть даже если шар телепортнётся за уровень, то рано или поздно он вернётся в свою зону.
Конечно, в нормальных играх, наверное, таких проблем не должно быть, так как скорость поменяется раз и за ним же положение объекта. Твой вариант может случиться, наверное, если ты 2 раза вызываешь одинаковый код, где не надо или ещё что.
Спасибо от души, с меня чай
Значит, возник вопрос в гейммейкере классическом (не studio). В общем, как сделать так, чтобы объект делал reverse при соприкосновении с другим объектом только если он идет вниз?
значит гейм-мейкер 8.1, вот. как правильно заставить проигрывать анимацию разрушения объекта при колижне, чтобы не было лупов и объект одновременно и уничтожался, и проигрывал анимацию?
Хуй знает что там в легаси версиях.
Проверяй if image_index >= image_number-1 или используй animation end event
Двачую. Но годных текстовых туториалов довольно мало.
Блог yoyo могу рекомендовать.
https://www.yoyogames.com/blog/56/explaining-blend-modes-part-1
Ты про дебагинг? Кури подробные видеогайды, там все рассказано.
https://www.youtube.com/watch?v=iJH_uTq9iOQ
>>714650
game_restart()
>Какими способами можно добраться от точки А до точки Б?
По дороге? Через лес? Через горы? Может точка Б в космосе?
Опиши, блеат, что ты хочешь сделать. Со скриншотами.
на маркетплейсе нашёл прекрасный пример, спасибо, вопрос отпадает
нет, пример оказался для квадратных объектов, я помню популярный был пример наэкранного управления для tds , там бонусом как-то тень простенько была реализована
желательно сисиди, чтобы по полгода не сохранял бекапы больших проектов
Ну что, не надоело в итоге?
В гамаке можно лабать на плюсах?
Да.
>>718002
У меня за 4 года было несколько крашей, после которых проект не восстанавливался автоматически. Восстановить удавалось руками тем не менее.
В любом случае бэкапы надо всё время делать.
>>717997
>Скажите, в гамак смогу вкатиться быстро и делать игру в нем?
Я лично вкатился в гамак очень быстро. Сносно работающий платформер я запилил через 2 месяца.
>визуального скриптинга
Не занимайся этим говном. Сразу в катывайся в нормальный код.
>Там сейчас обязательно gml юзать
Без языка ничего толкового не сделаешь.
>Или можно ивентами также
Ивенты в гамаке это последовательность выполнения кода в игровом цикле.
> GML освоить насколько трудно если 0 в программировании и математике?
А что вообще может быть сложного в освоении?
if else while repeat знаешь? Плюс минус равно умножить разделить знаешь? Тогда ты знаешь в принципе почти всё. Остальное в туториалах прочитаешь.
>Я лично вкатился в гамак очень быстро. Сносно работающий платформер я запилил через 2 месяца
А с чем возникали проблемы? На что ушло больше всего времени, чтобы запилить сносно, из этих 2х месяцев?
Примерно могу путь описать.
1) Освоение движка по туториалам. Туториал Астероиды.
2) Туториал платформер
3) Свой платформер по туториалу.
4) Понадобились тайловые коллизии разной формы. Сделал по туториалу.
5) Сделал стейт машину игрока и врагов. Опять же по туториалу.
На этом в принципе примитивный платформер был готов. Два месяца освоения.
Дальше захотелось, чтобы враги научились искать путь, перепрыгивать через пропасти, приследовать игрока и т.д. Здесь уже на 3 месяца глубоко забурился в дебри, но на выходе я уже представлял как сделать всё что угодно.
Дальше пошли эксперименты со светом, с партиклами, делал динамичные интерфейсы, разнообразные механики и т.д.
На всё, конечно, нужно время. Но решающим для меня был именно период ёбли с пасфайдингом. Именно тогда я научился программировать.
мб поможет кому-то в будущем, убрал ассинхронные события синхолнизации излишней с гуглсервисами
Duncan
Пока пришел к такому решению:
if move!=0
{
image_speed=1;
}
else
{
image_speed=1;
)
В принципе как надо работает
Падажжи, ёбана. Разве в гамаке фрейм сам по себе не остаётся на последнем кадре если остановить анимацию, раз в конце цикла ходьбы даже приходится её скидывать на нулевой фрейм кодом?
ньюфаг
Да. И это не только в новых скриптах, так всегда было. Если нужно сменить переменные у других объектов, то сначала ставишь перед ней имя объекта, типа "obj_player.x".
так же есть глобальные переменные (скорее всего ты знаешь, но мало ли), которые игра помнит всегда, к ним обращаются через global.zalupa
но ещё глобалки можно заранее объявлять (например в самом начале игры) через команду типа globalvar zalupa; и тогда к ней можно будет обращаться просто zalupa, без приставки 'global.'
а так же есть локальные переменные, они работают только в конкретном куске кода где ты его пишешь, либо в скрипте, а потом уничтожаются, очень удобная штука, объявляется в начале куска кода, например через var zovno, zhopa=false, piska='mo4a';
либо через var zovno; vart zhopa=false; var piska='mo4a';
обрати внимание на true/false, в ГМЛ это не булеановая переменная, а просто 1 и 0 соответственно, считаются за числовые переменные и их можно в мат рассчетах использовать, например hp=10+5*(global.hard)
Локальные переменные удобны чтобы не воротить говна в коде и вместо этого жопожуйства:
draw_sprite(asset_get_index('spr_' + choose(zhazha, lazha, kazha) + string(irandom(3))), image_index, x + 60 + sprite_width(sprite_index), y - 20/5 + sprite_height(sprite_index)/4);
можно сделать что-то типа такого:
var _spr=asset_get_index('spr_' + choose('zhazha', 'lazha', 'kazha') + string(irandom(3)));
var _x=x + 60 + sprite_width(sprite_index);
var _y=y - 20/5 + sprite_height(sprite_index)/4;
draw_sprite(_spr, image_index, _x, _y)
> Разве в гамаке фрейм сам по себе не остаётся на последнем кадре если остановить анимацию
А как остановить анимацию?
>>720633
>image_index
Как я понял, код:
image_index='номеркадра'
Установит текущий кадр анимации на тот который я объявлю
А мне нужно установить на тот которого объект достиг пока выполнялся код
НУ типа
if player_stop()
{
image_index=last_frame
}
else
{
код анимации
}
Ну и как мне получать вот этот last_frame? Помогите плиз
> Разве в гамаке фрейм сам по себе не остаётся на последнем кадре если остановить анимацию
А как остановить анимацию?
>>720633
>image_index
Как я понял, код:
image_index='номеркадра'
Установит текущий кадр анимации на тот который я объявлю
А мне нужно установить на тот которого объект достиг пока выполнялся код
НУ типа
if player_stop()
{
image_index=last_frame
}
else
{
код анимации
}
Ну и как мне получать вот этот last_frame? Помогите плиз
В ютубе миллиард вариантов передвижения объекта показывают.
У каждого ютубера по гамаку плюс-минус свои варианты передвижения и столкновений. Приветливый космонавт даже систему одежды для перса покажет и расскажет.
Выбери один видос и перепиши код прямо с экрана, нахера ты велосипеды городишь?
image_index почти никогда не принимает целочисленных значений. Это real, floor которого определяет текущий кадр.
Так что если ты хочешь поймать третий кадр анимации делай так:
if floor(image_index) == 2
(кадры считаются с нуля. Третий кадр убедт иметь Image_index от 2 до 2.99999999)
или
if image_index >= 2 && image_index<3
Если ты хочешь остановить анимацию на последнем кадре:
if image_index >= image_number -1
{
image_speed = 0;
}
У одного тестера такая беда на десятке, у других на десятке и семёрках такого нет. Гугл говорит, что проблема в правах. Никак не фиксится с моей стороны и проблема в его винде?
>>722610
К какому устройству, к какому файлу? Телепаты в отпуске, формулируй проблему.
Адекватный гамак тред встречает вот так, пассивно-агрессивно? Что такое "неадекватный" тред я даже представить боюсь.
Ошибка при запуске файла. Всё.
>Адекватный гамак тред встречает вот так, пассивно-агрессивно?
Да, всё верно. Ты даже не удосужился копипастнуть код ошибки сюда, почему ты думаешь, что кто-то должен его гуглить по ключевым словам и пытаться найти что-то, что косвенно соответствует твоему случаю? Ошибок такого типа до ебени матери, всех цветов и размеров.
>Ошибка при запуске файла. Всё.
Ну хз, лично первое, что лично мне пришло на ум - запустить от имени администратора. В гайдах, которые ты и сам мог найти по коду ошибки, написано то же самое.
https://techarks.ru/windows/files/windows-ne-mozhet-poluchit-dostup-k-ukazannomu-ustrojstvu-puti-ili-soobshheniyu-ob-oshibke-fajla/
Дальше сам.
Не совсем.
Ты можешь записать туда код и использовать их вместо скриптов.
Например у меня есть родитель "дерево" и у него куча разных детей - разные виды деревьев.
Все они ведут себя так же, как родитель, но есть исключения. Например есть деревья, которые загораживают ветками проход, и при срубании их проход должен очиститься.
Или есть специальный вид деревьев, с которых при срубании шишки падают.
Так вот, я их тоже делаю чайлдами основного дерева, но добавляют юзер ивент. В основном там пусто, но у специальных деревьев есть код.
Идиотский вопрос, но насколько сложно будет? С какими сложностями предстоит столкнуться? По туторам на гамаке уже делал платформер и top-down стрелялку. Давно когда то делал раннер со случайной генерацией препятствий через массив. Может есть какие то материалы по поводу того как в jrpg баланс настраивают
Как считаете, такие курсы стоящие или? В принципе, у меня нет проблем с самообучением, то есть, платформер и тдс я спокойно реализовал - не без затыков конечно. Но в самообучении у меня 2 проблемы, что до gml я не сталкивался с кодингом, и что отсутствует структурносить - то есть в конечном прототипе все как бы работает, но вероятно код кривой и костыльный, то есть если для прототипа где надо просто посмотреть как играется это еще нормально, но для реального продукта - нет
Когда я только-только начинал, ролики хартбиста для меня были очень полезны.
Сейчас (уже 4 года прошло) я считаю это малополезным шлаком.
150$ отдавать за это... если для тебя это незначительная мелочь - то смело бери. Для новичков это очень хорошо подойдёт.
Я бы даже когда новичком был, брать не стал. Самообучение для меня проще и быстрее.
В блядских обсуждениях блядского стима какждое второе блядское сообщение по этому вопросу. Как вы, блять, игры собрались делать не умея читать?
Ладно, ладно, не урчи. Хотя бы наводку дал насчет обсуждения сообщества, спасиибо. Сто харчей тебе в ебыч за агрессию.
Но он тащемта прав. Не умеешь гуглить - вон из профессии.
Так, а как ты этот юзер ивент вызываешь?
разверну вопрос, есть ли ассет для системы трпг/српг с клеточками? на юнете есть пошаговая инструкция, но это пиздец оверкил, хочу сделать что-то уровня инто зэ брич, только с людьми и ЕЩЁ проще
Побуду добреньким.
Во-первых, в стиме ты покупаешь ключ для yo-yo-games аккаунта, к которому привязываешь свой стим-аккаунт. Только тогда это будет не триальной версией. Во-вторых, китайцы купили оперу, а опера купила гейм-мейкер, так что хз что будет с движком в ближайшее время.
Спасибо, Солнце
Китайцы купили Cocos Studio, он превратился в стандартный китайский движок, неотличимый от других.
Я знаю, я имею в виду, что гейм мейкер тоже превратится в джаваскриптовый движок для создания типично китайских игр, в лучшем случае. В худшем его просто закроют.
>В худшем его просто закроют.
Как и зачем? И да, хуже той хуйни с драгндропом и прочей ебалы для кодинга без кодинга они уже в любом случае не добавят.
Синтаксис проверь
Ты наверное хотел написать tilemap_GET_at_pixel
Ясно, спасибо.
достаточно скомпилировать через yyc
Вопросы следующие:
1) Есть гайды (видео или текст - безразлично) по созданию чего-нибудь приближенного к олдовой Контре?
2) Гайды по созданию статусных эффектов? К примеру: кровотечение, поджигание и т.п., с последующим постепенным уменьшением хп противника за определённый промежуток времени.
3) Не знаю как описать, опишу как могу. С боссами хочу добиться того же самого, как в той же Контре Хард Корпс. Хотя бы чего-нибудь приближенного. Нужно, чтобы у спрайта босса уязвимыми были определённые места, и чтобы некоторые функциональные части после вливания нужного дамага отваливались. Есть гайды по реализации подобного?
Заранее всех благодарю за ответ и любую помощь.
Начни с классики. Потом добавишь фишки из других туториалов. https://www.youtube.com/watch?v=izNXbMdu348&list=PLPRT_JORnIupqWsjRpJZjG07N01Wsw_GJ
По первому пункту:
Сначала делаешь стандартный платформер по туториалам. Разбираешься что там к чему, потом делаешь свой собственный с необходимыми тебе фишками.
Придумываешь все необходимые тебе типы коллизий. Прямая платформа, наклон 45 градусов, наклон 30 градусов, плаформа сквозь которую можно спрыгнуть/запрыгнуть и т.д.
Создаёшь необходимые тебе скрипты для определения этих коллизий. Точка, линия, прямоугольник - тебе этого будет более чем достаточно.
Создаёшь собственного персонажа - машину состояний. Он будет перемещаться по твоему полю коллизий так, как тебе нужно. Разгоняться с ускорением, тормозить со скольжением, делать прыжок, двойной прыжок, отложенный прыжок, прыжок от стены, прыжок сквозь платформу и т.д. - вот это всё
По второму пункту:
Если по уму...
Сделаешь специальный скрипт sc_init_enemy, который будешь добавлять в create_event каждому врагу.
В нём будут задаваться все необходимые для функционирования врага переменные.
Туда воткнёшь переменные отвечающие за механику кровотечения. Типа.
can_bleed = true;
is_bleeding = false;
bleeding_timer = 0;
bleeding_time = 0;
bleeding_tick_time = 0;
bleeding_damage_per_tick = 0;
Сделаешь скрипт для нанесения кровотечения врагу
И пуля при столкновении с целью среди прочего будет исполнять этот скрипт.
В коде, который будет выполняться при столкновении пули с obj_enemy будет что-то типа
var _target = sc_определить_id_объекта_с_которым_столкнулась_пуля
//бла-бла, всякий код
sc_enemy_start_bleeding(target,bleeding_time,bleeding_tick_time,bleeding_damage_per_tick)
А в скрипте будет
///@param0 target
///@param1 bleeding_time
///@param2 bleeding_tick_time
///@param3 bleeding_damage_per_tick
var _target = argument0
if _target.can_bleed //если цель может кровоточить
{
_target.is_bleeding = true
_target.bleeding_time = argument1
_target.bleeding_tick_time = argument2
_target.bleeding_damage_per_tick = argument3
if _target.bleeding_timer > argument2 _target.bleeding_timer = 0 //Условие, благодаря которому последующие пули сбрасывают таймер кровотечения, не мешая таймеру кровотечения наносить урон
}
Т.е. скрипт просто будет передавать параметры кровотечения цели.
А цель, соответственно, будет руководствоваться этими параметрами и исполнять алгоритм кровотечения.
Просто опять же упакуешь его в скрипт sc_perform_bleeding() и будешь выполнять его каждый шаг.
В скрипт запишешь что-то типа
if is_bleeding{
bleeding_timer ++
if bleeding_timer >0 && (bleeding_timer mod bleeding_tick_time) == 0 //Если таймер кровотечение делится на время одного тика без остатка и при этом не равен нулю.
{
hp -= bleeding_damage_per_tick //получить урон от кровтечения
sc_сreate_bleeding_effect() //Выполнить скрипт, который создаст разлетающиеся капли крови, например
}
if bleeding_timer >= bleeding_time //условие прекращения кровотечения
{
is_bleeding = false;
bleeding_timer = 0
}
}
Ну в общем-то и всё. Так-то это ростая задача. Когда ты выполнишь первый пункт, ты всё это уже будешь уметь.
Начни с того, чтобы просто начать наносить врагам простой урон, а дальше накрутишь всякого.
По третьему пункту.
Да тоже ничего такого экстраординарного. Склеишь босса из нескольких врагов без поведения. Неуязвимые части сделаешь из неуязвимых врагов, уязвимые - из уязвимых. Уязвимые враги полученный урон будут транслировать контроллеру босса.
Сделаешь контроллер босса, который этих "врагов" будет нужным образом перумещать и уничтожать когда "часть отвалилась"
По первому пункту:
Сначала делаешь стандартный платформер по туториалам. Разбираешься что там к чему, потом делаешь свой собственный с необходимыми тебе фишками.
Придумываешь все необходимые тебе типы коллизий. Прямая платформа, наклон 45 градусов, наклон 30 градусов, плаформа сквозь которую можно спрыгнуть/запрыгнуть и т.д.
Создаёшь необходимые тебе скрипты для определения этих коллизий. Точка, линия, прямоугольник - тебе этого будет более чем достаточно.
Создаёшь собственного персонажа - машину состояний. Он будет перемещаться по твоему полю коллизий так, как тебе нужно. Разгоняться с ускорением, тормозить со скольжением, делать прыжок, двойной прыжок, отложенный прыжок, прыжок от стены, прыжок сквозь платформу и т.д. - вот это всё
По второму пункту:
Если по уму...
Сделаешь специальный скрипт sc_init_enemy, который будешь добавлять в create_event каждому врагу.
В нём будут задаваться все необходимые для функционирования врага переменные.
Туда воткнёшь переменные отвечающие за механику кровотечения. Типа.
can_bleed = true;
is_bleeding = false;
bleeding_timer = 0;
bleeding_time = 0;
bleeding_tick_time = 0;
bleeding_damage_per_tick = 0;
Сделаешь скрипт для нанесения кровотечения врагу
И пуля при столкновении с целью среди прочего будет исполнять этот скрипт.
В коде, который будет выполняться при столкновении пули с obj_enemy будет что-то типа
var _target = sc_определить_id_объекта_с_которым_столкнулась_пуля
//бла-бла, всякий код
sc_enemy_start_bleeding(target,bleeding_time,bleeding_tick_time,bleeding_damage_per_tick)
А в скрипте будет
///@param0 target
///@param1 bleeding_time
///@param2 bleeding_tick_time
///@param3 bleeding_damage_per_tick
var _target = argument0
if _target.can_bleed //если цель может кровоточить
{
_target.is_bleeding = true
_target.bleeding_time = argument1
_target.bleeding_tick_time = argument2
_target.bleeding_damage_per_tick = argument3
if _target.bleeding_timer > argument2 _target.bleeding_timer = 0 //Условие, благодаря которому последующие пули сбрасывают таймер кровотечения, не мешая таймеру кровотечения наносить урон
}
Т.е. скрипт просто будет передавать параметры кровотечения цели.
А цель, соответственно, будет руководствоваться этими параметрами и исполнять алгоритм кровотечения.
Просто опять же упакуешь его в скрипт sc_perform_bleeding() и будешь выполнять его каждый шаг.
В скрипт запишешь что-то типа
if is_bleeding{
bleeding_timer ++
if bleeding_timer >0 && (bleeding_timer mod bleeding_tick_time) == 0 //Если таймер кровотечение делится на время одного тика без остатка и при этом не равен нулю.
{
hp -= bleeding_damage_per_tick //получить урон от кровтечения
sc_сreate_bleeding_effect() //Выполнить скрипт, который создаст разлетающиеся капли крови, например
}
if bleeding_timer >= bleeding_time //условие прекращения кровотечения
{
is_bleeding = false;
bleeding_timer = 0
}
}
Ну в общем-то и всё. Так-то это ростая задача. Когда ты выполнишь первый пункт, ты всё это уже будешь уметь.
Начни с того, чтобы просто начать наносить врагам простой урон, а дальше накрутишь всякого.
По третьему пункту.
Да тоже ничего такого экстраординарного. Склеишь босса из нескольких врагов без поведения. Неуязвимые части сделаешь из неуязвимых врагов, уязвимые - из уязвимых. Уязвимые враги полученный урон будут транслировать контроллеру босса.
Сделаешь контроллер босса, который этих "врагов" будет нужным образом перумещать и уничтожать когда "часть отвалилась"
А эта хуйня на рутрекере есть?
>>729011
Спасибо, анoнчики! Тогда скоро приступлю к изучению. Я находил на русском справку только по 8-й версии, я так понимаю она и для второй студии актуальна? За исключением того, что в студии некоторые команды иначе пишутся, как я понял. Если есть справка на русском по студии 2, то был бы вдвойне благодарен.
на рутрекере хз, но ломаная версия есть, сам пользовался пока нищуком был, а сейчас есть месяц триала
Нет, новой нету.
У объекта obj_knopka есть переменная id
У первой id = 0, у второй id = 1
Как сделать так, чтобы действие выполнялось по нажатии ТОЛЬКО мышкой на кнопку у которой id = 0?
СЛедующий код
with (obj_knopka) {
switch knopka_id {
case 0:
if mouse_check_button_pressed (mb_left) {
if collision_point (mouse_x, mouse_y, obj_knopka, false, false) {
//действие
}
}
}
}
Приводит к тому что действие происходит только с первой кнопкой, но тригеррится при нажатии на любую а не только первую
есть переменная active у объекта knopka
Чтобы действие происходило когда я нажимаю на кнопку у которой active = true (при условии что значение этого acrive разным кнопкам я раздать уже смогу)
break воткни после действия, а то код пикает твой кейс, а потом смотрит куда бы ещё это действие воткнуть, иша по всем условиям, надо это всегда брейком обрывать, если нудны определённые кейсы
А лол. Я вроде ставил. Либо забыл либо код скопипастил без него. Ладно, посмотрю код, проверю
Create event; test_var = noone;
Draw GUI event; draw_text (x, y, noone);
Текст на экране: "-4"
Ошибок синтаксиса\компиляции - нет
С тех пор вышла версия 2.3, в которой очень много поменялось.
Мне не удалось как следует переконвертировать под неё свой проект, остался на 2.2
Можешь попробовать стереть папку Options в проекте. Запустится. Но проверяй все скрипты и все ресурсы. У меня часть звуков тупо потерялась.
> Можешь попробовать стереть папку Options в проекте
Не помогло.
> Но проверяй все скрипты и все ресурсы.
На первый взгляд все на своем месте. Потыкался по скриптам и спрайтам.
Почисть проект через ctrl+f7 (иконка щёточки), проскролль выше по коду запуска, стопудов есть ошибка в коде, которая нормально не высветилась в компайл иррорс.
> Почисть проект через ctrl+f7
Тоже ошибка
> проскролль выше по коду запуска, стопудов есть ошибка в коде, которая нормально не высветилась в компайл иррорс.
Ты о моих скриптах? Там все норм с кодом и синтаксисом.
Запустил проект в офф мейкере и все сразу заработало. А до этого юзал крякнутый.
Всем спасибо.
видимо у тебя с рантаймом проблема была, там и рантайм и гм крякать надо, а если что-то не стакается то такая фигня выходит
Мне это надо в плане - нужно ли свой механизм отсечения писать или он сам справится?
Не, рисует всё, тут надо велосипеды писать в этом плане, чтобы оптимизация была.
Опа, не знал.
Протестировал, поставив 4000 спрайтов друг на друга в одном месте в комнате.
Действительно ФПС не меняется от того, есть они на экране или нет.
at gml_Object_gc_DrawEvent_2 (line 4) - draw_sprite(gilza_s,0,10,10);
Спрайт gilza_s существует.
Ассет кеш чистил
Открой дебагером, посмотри значение переменной gilza_s
Добавь строчку var dbg = gilza_spr
Сравни значения.
Яйца в кукурузе, ты?
Коплю деньги на лицензию GM на 12 месяцев.
Хочу сделать пиксельную рпг-шку на винду.
GM подойдет для этих целей?
Пример - пикрил
пикрил спизжен с поисковика, я чисто пример привел как это в теории должно выглядеть,меня волнует GM сможет это сделать так чтоб оно было оптимизированно и не жрало по 3 гига RAM'а?
Любой популярный конструктор (см. Юнити, Годо, Гамак) сможет если руки не из жопы. Если напишешь адского говна, то и в 2д рпг может ООМ произойти, но это надо, блять, очень постараться.
>Любой популярный конструктор (см. Юнити, Годо, Гамак)
Я ж в начале написал что я рукожоп.Не, это не значит что хочу чтоб все было легко...хочу найти движок с маленьким временем вхождения... а то пока в юнити войдешь постареешь.
Я просто слышал что GM для этого подходит хорошо т.к. тут все для старта есть, для таких рукожопов как я + тонна гайдов и инструкций.
Ну тут язык попроще выучить чем в юньке.
Хотя C# для меня не был сильно сложным (возможно это ошибка выжившего, т.к. до это уже был опыт программирования) и туторов в юньке больше.
А в Годоте вообще Питоноподбный язык, но гайдов на русском практически нема, поэтому если английского не знаешь, то туда не суйся.
Хотя английский очень полезно выучить в любом случае, в программировании это всегда нужно.
Не знаю короч стоит ли эта разница в сложности денег за гамак. В любом случае есть триал, можешь попробовать, если тебе норм покупай, если нет - смотри в сторону других конструкторов.
А, ну и да, основы геймдева типа стейт-машин тебе на любом движке придется изучать, тут разницы вообще нет.
>Коплю деньги на лицензию GM на 12 месяцев.
Ты осбрался под мобилки девелопить что ли?
Но ты не знаешь самую базу даже?
Возьми десктоп версию за копейки в стиме для начала. Лицензию временную на мобилки будешь покупать когда тебе нужно будет на телефонах тестировать.
>Хочу сделать пиксельную рпг-шку на винду.
На винду же собрался. Нафиг тебе мобилки?
Да, подойдёт идеально.
Напомните, была то ли альтернативная IDE то ли прям полная альтернатива GM.
Это было еще во времена 7 8 версий.
Не знаю, что было во времена 7 и 8 версий, но во времена GMS1 был альтернативный редактор Parakeet IDE, на основе которого был сделан GMS2.
Также есть альтернативный редактор кода GM Edit от украинского разработчика Yellow Afterlife.
Есть недоделанный проект Game Creator
https://github.com/joshwyant/game-creator который задумывался как полная альтернатива ГМ, обратно совместимая с файлами проектов.
Есть Enigma Lateral GM https://enigma-dev.org/download.htm тоже должен быть обратно совместимый с проектами GMS.
Несовместимые альтернативы Гейм Мейкеру тоже существуют, например 001 Game Creator, GDevelop, Superpowers и т. д.
1. Могу ли я установить одну и ту же лицензию standalone на комп и на ноут (работать поочёредно, не одновременно) или только через стим будет работать?
2. С каких пор официальная справка гамака существует на русеке? Вроде в прошлом месяце только англюсик был еще.
1) Да. С трёх машин одновременно можно, вроде.
2) Хз. Недавно выкатили официальный русик для 2.3
Систему, когда выводится определенное сообщение, и после клика на слово или фразу переводило на другое сообщение, или другую руму с событиями и т.п.
Придумай специальные метки. Можешь прямо как в html сделать даже.
Вставляй их в текст.
Добавь в свой контроллер текста функцию, которая будет читать эти метки, стирать их из строки, выводить текст, и, руководствуясь этими метками, делать часть строки активной.
Следи за мышкой, реагируй на клик по активной зоне, исполняй нужное действие.
>Добавь в свой контроллер текста функцию, которая будет читать эти метки, стирать их из строки, выводить текст, и, руководствуясь этими метками, делать часть строки активной
Если я правильно понял, в код прописывать поиск всем тексте определенной строчки, удаление этой строчки. А как сделать часть строки активной? Какие метки имеются в виду?
Ну я например вставляю в текст метки типа $p3 или $s1.
Мой контроллер вывода текста ловит символ "$", затем читает следующую букву и цифру.
$ означает что началась команда
p означает что нужно сделать паузу
3 показывает продолжительность паузы.
или
s означает что нужно изменить скорость вывода текста
1 указывает значение скорости.
Далее обработчик выбрасывает $p3 из строки, останавливает вывод на нужно время, затем продолжает.
Ты мог бы поставить такие же метки.
Типа "Вы можете <g rm_forest>отправиться в лес</g>, но на это уйдёт весь день."
Твой обработчик ловил следил бы за появлением симвла <
Появление этого символа сообщило бы обработчику, что началась команда, и выводить её не надо. А надо прочитать её.
Дальше он искал бы следующую букву. При виде буквы g понимал, что это команда на переход в другую комнату.
Далее он пропускал бы все пробелы и искал первую значащую букву. Ей была бы "r".
Потом записывал её и все последующие за ней, пока не наткнётся на пробел или на >
Потом по полученной строке "rm_forest" определял бы, в какую комнату предстоит перейти при нажатии на текст. Например при помощи функции asset_get_index("rm_forest")
Потом встречал > и понимал, что ввод команды закончен. Весь следующие текст ему нужно сделать активным.
Если текст выводится в одну строку, я бы запомнил верхнюю-правую координату буквы для этого.
Затем вывод текста другим цветом, пока не встретится </g>
Потом запоминание правой нижней координаты буквы и обычный вывод остального текста.
А дальше следить за point_in_rectangle координат курсора и полученных координат текста. И если игрок на него мышкой клац - ты знаешь в какую комнату идти.
Ну я например вставляю в текст метки типа $p3 или $s1.
Мой контроллер вывода текста ловит символ "$", затем читает следующую букву и цифру.
$ означает что началась команда
p означает что нужно сделать паузу
3 показывает продолжительность паузы.
или
s означает что нужно изменить скорость вывода текста
1 указывает значение скорости.
Далее обработчик выбрасывает $p3 из строки, останавливает вывод на нужно время, затем продолжает.
Ты мог бы поставить такие же метки.
Типа "Вы можете <g rm_forest>отправиться в лес</g>, но на это уйдёт весь день."
Твой обработчик ловил следил бы за появлением симвла <
Появление этого символа сообщило бы обработчику, что началась команда, и выводить её не надо. А надо прочитать её.
Дальше он искал бы следующую букву. При виде буквы g понимал, что это команда на переход в другую комнату.
Далее он пропускал бы все пробелы и искал первую значащую букву. Ей была бы "r".
Потом записывал её и все последующие за ней, пока не наткнётся на пробел или на >
Потом по полученной строке "rm_forest" определял бы, в какую комнату предстоит перейти при нажатии на текст. Например при помощи функции asset_get_index("rm_forest")
Потом встречал > и понимал, что ввод команды закончен. Весь следующие текст ему нужно сделать активным.
Если текст выводится в одну строку, я бы запомнил верхнюю-правую координату буквы для этого.
Затем вывод текста другим цветом, пока не встретится </g>
Потом запоминание правой нижней координаты буквы и обычный вывод остального текста.
А дальше следить за point_in_rectangle координат курсора и полученных координат текста. И если игрок на него мышкой клац - ты знаешь в какую комнату идти.
>Твой обработчик ловил следил бы за появлением симвла <
>Появление этого символа сообщило бы обработчику, что началась команда, и выводить её не надо. А надо прочитать её.
>Дальше он искал бы следующую букву. При виде буквы g понимал, что это команда на переход в другую комнату.
>Далее он пропускал бы все пробелы и искал первую значащую букву. Ей была бы "r".
>Потом записывал её и все последующие за ней, пока не наткнётся на пробел или на >
Какие функции гамака для этого можно использовать?
string_char_at() в основном.
Я тексты записываю прямо как скрипты в гамак. (пик 1)
Помимо собственно текста передаю контроллеру текста всякую информацию типа портрета. анимации, эффектов, выборов и т.д.
Далее врубается обработчик текста, который из полученных данных берёт всё, что нужно, в том числе и строку с текстом.
Считает её длину в пикселях string_width() и разбивает так, чтобы поместилась в 4 строки моего диалогового окна без переносов слов.
Затем по одной буковке выводит текст со стандартной скоростью, но если натыкается на $ вместо вывода следующей буквы читает всю команду и исполняет её.
Например на пик2 скрипт добавляет в буффер по одной букве из строки пока не наткнётся на пробел, перенос строк я использую для этого символ |, или на конец текста.
Что-то типа
var _string = argument0
var max_i = string_length(_string)
var _text_buffer = ""
var _char_buffer = ""
for (var i=0; i< max_i; i++)
{
_char_buffer = string_char_at(_string,i)
if _char_buffer!= "<" _text_buffer += _char_buffer
}
draw_text(x,y,_text_buffer)
А ты читать уже не умеешь?
file-->preferences-->runtime feed
Выбирай рантайм соответсвующий твоей версии.
Пиратку небось юзаешь. Ну тогда сосамба.
На рутрекере со скидкой можно купить?
Не советую, настрадался с пираткой и решил купить этот блядский движок
Если нет то какие есть варианты? В любом случае будет снято видео и надо как-то эту в игровую сцену вставить
Не гифку же делать из него и вставлять, это будет ад в плане производительности. Хотя может кто то из вас гиф использовал?
натыкался на гитхабе два года назад, h264 играло
если твоя игра для говнокалькуляторов, будет тормозить на катсцене
катсцены надо выжигать
на код для подгрузки mp4 или ворбис не помню
Там разница только в интрфейсах.
Тебе не нужна физика. Вообще все эти встроенные штуки с осторожностью юзай. Тебе нужен обычный коллижн with (instance_place(x, y, obj(другие объекты)){instance_destroy();} .
Ууу. Маалыс обкакунькался. Кто у нас тут засирака гуглом не мозет пользоваться есё? Давай подотру. Давай https://docs2.yoyogames.com/source/_build/1_overview/1_getting_started/preferences/prefs_general.html Воотъ.
Делаю ТДС. Есть проблема.
У противника есть поле зрения. Если игрок в поле зрения, то противник должен запомнить координаты игрока и идти к ним.
Я сделал поле зрения противника и движение с обходом препятствий.
Но как сделать это:
Если игрок вышел из поля зрения (Появилась стена), противник должен прийти к месту, где игрок был последний раз в поле зрения. Когда противник окажется там, он должен покрутиться 1-3 раза возможно и начать дальнейший обход
Твой противник - машина состояний.
У него есть состояние "иду на точку", в котором он перемещается к выбранной точке, а в конце скрипта делает проверку
"игрок в поле зрения?"
"игрок переместился?"
"могу ли я добраться до той точки, в которой сейчас игрок?"
Если все три проверки успешны, меняешь координаты точки-цели и в следующем цикле противник движется к новой выбранной точке.
Когда точка достигнута противник переходит в состояние "выбор следующего действия".
Если игрок в заданной точке не обнаружен, то принятое решение = "покрутиться" + pokrutitsya_times = choose(1,3).
Приняв решение противник переключается в состояние "порутиться" и покручивается пока pokrutitsya_times не становится равно 0.
После того, как покрутился, снова переходит в состояние "выбор следующего действия", в котором если опять не обнаруживает игрока, принимает решение "начать дальнейший обход"
>меняешь координаты точки-цели
Хз как сделать
Можно пример?
или может сделать так что игрок раз в три секунды срет невидимымыми точками к при отсутствии игрока бот идет к последней высранной куче
А как ты движение с обходом препятствий запилил? У тебя куда враг пиздует, когда игрока не видит?
Если ты знаешь как помочь хотя бы примерно - то скинь мыло или телегу, если помощь будет существенная - я могу отблагодарить.
Я даже не понимаю что ты делаешь. Бот у него в гей мейкере. Что за бот? Откуда бот? Видит он там че-то. Охрана за дворцом прячется, эльфы крутяться. Давай вместо XY проблемы ты сам нормально вопрос сформулируешь.
Но вообще лучше перед тем как стучаться, правильно задай вопрос в треде.
Скопируй свой код в pastebin, сделай скриншоты, максимально подробно опиши, в чём твоя проблема, что именно мешает тебе записать последнюю точку, в которой был виден игрок, и отправлять врага в неё, обновляя её координаты каждый шаг.
Планирую скачать восьмой гамак и сделать на нём игру. Какие подводные камни? На более новые версии переходить не хочу.
Не понял. Причем здесь браузер вообще?
Чтобы сделать игру.
Если ты планируешь выпускаться на Windows никаких критических проблем, но чем не нравится GMS 1? Там производительность выше и возможностей побольше.
Не такой уж он и низкий, дохера всего придется писать самому или искать кривущие ассеты. Ту же систему камер, инерцию для тача, ui куда же без него и так до бесконечности
>local variable playbackSpeed(100008) not set before reading it
Чего блядь? Я понимаю, в чем мой косяк, я пытался прочитать переменную до того, как она задана. Но откуда взялся этот playbackSpeed? У меня ничего с таким названием никогда не было.
Там обычно в логе пишется и файл в котором вылазит ошибка и строка. Залезь и посмотри.
Почему некоторые тайлсеты не правильно отображаться?
Не совсем могу объяснить, но покажу скрин.
В окне настроек тайлсета всё верно отображается, а вот в редакторе комнаты такая же ересь, как в нижнем окне autotiling'а
Ощущение, что GMS как-то смещается картинку в некоторых частях
Что-нибудь с оффсетами или separation накосячил.
>некоторые
Это которые больше чем 2048 в ширину \ высоту?
Похоже, будто гамак его сжимает принудительно. В настройках билда проверь размер текстур.
Я на доске нуфаг, являюсь веб макакой и последнее время думаю попробовать поизучать какой-нибудь движок.
Не срача ради, но любопытства для, хочу спросить: я посмотрел несколько видосов со сравнением годота и гамака, и у меня создалось впечатление, что у гамака главный плюс в том, что его изучить проще, а годот лушче... во всём остальном.
Я когда был малолетний дебил пытался делать простые игры в геймейкере (тогда ещё в первой версии), поэтому любопытно по старой памяти поглядеть что там нового и интересного. Но уже столько времени прошло, новые движки появились, которые выглядят продвинутее что ли.
Вероятно, я тупой, но можете хотя бы вкратце пояснить гейм мейкер вообще актуален сейчас? Почему он предпочтительнее, чем годот, например? Для меня пока что главный плюс, что в гамаке язык JS-о подобный.
Заранее благодарен за советы мудрые.
>Вероятно, я тупой, но можете хотя бы вкратце пояснить гейм мейкер вообще актуален сейчас?
Ну типа да. На 1.4 делалась куча культовых игр: хотлайн майами, гипер лайт дрифтер, нуклеар трон, андыртейл, вальхалла, вот это вот всё. На двушке сейчас тоже парочка неплохих игор вышла.
>Почему он предпочтительнее, чем годот, например?
Хуй знает, годотом не пользовался, но могу сказать, что язык гамака достаточно прост (я не про драг-н-дроп, если что, который совсем хуйня для детей), его буквально может освоить даже дебил вроде меня, который нихуя кроме таблиц в экселле не создавал. Главное - не бояться искать туториалы, штудировать мануал, если что-то не знакомо, и спрашивать советы у людей с опытом (у гамака есть активный сервер в дисе, там 24/7 работают каналы по разруливанию каких-либо технических вопросов).
По сути, самое содержательное пояснение по теме, которое я могу дать тебе. Если хочешь - можешь сам попробовать трайл двушки/угнать на русракере и пощупать, что да как. Из очевидных отличий 1.4 и 2 - лучше интерфейс, производительность и некоторые новые плюшки.
Спасибо за пояснение!
Про культовые игры я в курсе, да. Один из беспокоящих меня вопросов это "актуальность" движка. На старом двигле от дума тоже много всего хорошего было, но ныне это не самое свежее, что может быть.
На мысли эти меня натолкнули в целом менее положительные отзывы у гамака относительно того же годота. Вот и интересуюсь, собственно.
Если ты будешь сравнивать движки по играм, которые на них вышли, то годот в этом плане... Но это уже территория движкосрача.
ХЗ что значит "актуальность". Ты собрался на работу устраиваться и хочешь изучить востребованный движок? Юнити.
Ты хочешь для себя что-то сделать? Тогда на каком движке сделана игра, подобие которой ты хочешь запилить? Вот это движок и бери.
Для сравнения гамака с годотом можешь хартбисту написать. Он и по гамаку и по годоту уроки даёт. https://www.youtube.com/c/uheartbeast/
Если можете помочь, отпишите
Тг: leksasasasasasasasasas
Спасибо за советы! В обчем, скачаю демку гамака, поковыряюсь.
Где можно почитать, как она вообще реализуется?
Я сделал глобальную переменную, в которую юниты шлют свои мессаги, а потом другие юниты её читают, и когда все прочитали, она обнуляется. Проблема начинается, когда два юнита в неё пишут разные мессаги.
Как эту броадкас систем по уму сделать?
В чём проблема поставить интересующие тебя движки и попробовать что-нибудь сделать?
Я вот три раза пытался вкатиться в Unity, безуспешно. Брезгливо попробовал гамак, и просто охуел, насколько там всё по уму и логично сделано если сравнивать с юнити.
Единственный минус - он платный. Но я пирачу.
Они буквально вчера сказали, что с триал версии убирается временное ограничение.
>пацаны, фри версия пойдет для сбора своей задумки полностью?
По сути да, потому что единственное отличие триала от лицухи теперь в том, что в триале нельзя компилировать экзешники. В остальном там весь инструментарий присутствует.
>и могу ли я потом её же скомпилировать на десктопы и мобилы, уже купив нужные версии?
Если файлы проекта есть, то да. Но там ещё фишка в том - что десктоп, мобила и веб - это всё разные лицухи, которые нужно отдельно покупать.
даже я активный юзер гамака с лохматых годов и до конца поддержки гмс1 включительно свалил, цены не адекватные, это они мне должны доплачивать за пользование движком где дохуя чего нет.
Это происходит когда я прыгаю но проваливаясь уже на 1 пиксель ниже уровня платформы, делаю инпут влево, и меня следующим кадром переносит влево как я понял, при проверке слева показывает что пусто. Может на 1 пиксель по диагонали надо ещё чек сделать?
Проверяй одновременно икс и игрек.
Ох этот неофитский код с keyboard_checkами и place_meetingами.
Да ещё и whilы безумные!
Учись дебагать, это самый необходимый тебе навык на этом этапе. Фрейм за фремом смотри, как меняется координата твоего персонажа в какой момент.
Ох ох ох, у тебя там ещё попытка заменить state machine условиями в if.
if death==false - вот это вот.
Код твой абсолютно безумный, честно говоря. Глазами его не подебагать. Да и не нужно это дебагать, этот код нужно удалять и полностью переписывать.
Во-первых:
Прежде чем вводить дополнительные механики разберись с движением.
Рекомендую вот этот туториал.
https://forum.yoyogames.com/index.php?threads/on-slopes-and-grids-subpixel-perfect-topdown-movement-and-collision-line-without-objects.4073/
Он для GMS1.4 написан, но полностью подходит для GMS2.
Сам проект импортируется в GMS2, всё работает практически без изменений. В GMS2.3 можно улучшить при помощи функций.
Да, для новичка это сложно. Но одно лишь освоение этого туториала даст тебе море очков экспириенса, ты сможешь прокачаться на нём.
Напиши собственные функции проверки коллизий, проверяй только одну точку или одну линию в тех случаях, когда тебе нужно проверить коллизию справа/слева/по диагонали.
Разберись что такое Pixel perfect движение, двигай своего персонажа только на целый пиксель, даже если у тебя дробная скорость.
Твои коллизии в платформере должны быть идеальны от и до! Займись ими вплотную!
Во-вторых: котроллер.
Ты сейчас молодой, шутливый, лепишь повсюду keyboard_check_pressed(vk_up). В тот момент когда ты заходешь перейти на wasd шутки кончатся. А когда захочешь сделать поддержку джойстика... не стоит вскрывать эту тему.
Это скучно, но лучше сразу сделай объект obj_controller, который в begin_step_event будет иметь кода типа
jump_pressed = keyboard_check_pressed(vk_up)
а потом в коде игрока обращайся к контроллеру if obj_controller.jump_pressed вместо keyboard_check_pressed(vk_up)
В-третьих:
Прежде чем вводить переменные death, hit, attack и т.д. почитай (посмотри туториал спалдинга) что такое state mashine. Тебе понравится, всё станет гораздо проще.
В четвёртых: когда прокачаешься достаточно, узнаешь что прямоугольные функции типа place_meeting работают не совсем так, как ты думаешь. Слева и снизу у тебя не будет столкновения тогда, когда координаты объектов "вроде как" совпадают.
У тебя же нет этого бага, когда ты справа к стенке прилипаешь?
Ох этот неофитский код с keyboard_checkами и place_meetingами.
Да ещё и whilы безумные!
Учись дебагать, это самый необходимый тебе навык на этом этапе. Фрейм за фремом смотри, как меняется координата твоего персонажа в какой момент.
Ох ох ох, у тебя там ещё попытка заменить state machine условиями в if.
if death==false - вот это вот.
Код твой абсолютно безумный, честно говоря. Глазами его не подебагать. Да и не нужно это дебагать, этот код нужно удалять и полностью переписывать.
Во-первых:
Прежде чем вводить дополнительные механики разберись с движением.
Рекомендую вот этот туториал.
https://forum.yoyogames.com/index.php?threads/on-slopes-and-grids-subpixel-perfect-topdown-movement-and-collision-line-without-objects.4073/
Он для GMS1.4 написан, но полностью подходит для GMS2.
Сам проект импортируется в GMS2, всё работает практически без изменений. В GMS2.3 можно улучшить при помощи функций.
Да, для новичка это сложно. Но одно лишь освоение этого туториала даст тебе море очков экспириенса, ты сможешь прокачаться на нём.
Напиши собственные функции проверки коллизий, проверяй только одну точку или одну линию в тех случаях, когда тебе нужно проверить коллизию справа/слева/по диагонали.
Разберись что такое Pixel perfect движение, двигай своего персонажа только на целый пиксель, даже если у тебя дробная скорость.
Твои коллизии в платформере должны быть идеальны от и до! Займись ими вплотную!
Во-вторых: котроллер.
Ты сейчас молодой, шутливый, лепишь повсюду keyboard_check_pressed(vk_up). В тот момент когда ты заходешь перейти на wasd шутки кончатся. А когда захочешь сделать поддержку джойстика... не стоит вскрывать эту тему.
Это скучно, но лучше сразу сделай объект obj_controller, который в begin_step_event будет иметь кода типа
jump_pressed = keyboard_check_pressed(vk_up)
а потом в коде игрока обращайся к контроллеру if obj_controller.jump_pressed вместо keyboard_check_pressed(vk_up)
В-третьих:
Прежде чем вводить переменные death, hit, attack и т.д. почитай (посмотри туториал спалдинга) что такое state mashine. Тебе понравится, всё станет гораздо проще.
В четвёртых: когда прокачаешься достаточно, узнаешь что прямоугольные функции типа place_meeting работают не совсем так, как ты думаешь. Слева и снизу у тебя не будет столкновения тогда, когда координаты объектов "вроде как" совпадают.
У тебя же нет этого бага, когда ты справа к стенке прилипаешь?
Спасибо за помощь! К сожалению, я не смог изучить туториал, потому что там картинки на странице не отображаются
Сделал по твоему совету контроллер, для инпута игрока
State machine тоже сделаю по туториалу
Кстати, при помощи дебага я понял, что place_meeting не дает столкновение слева и снизу/справа. А так как я не переделал систему калькуляциии скоростей и коллизий, то проблему я пофиксил, при помощи дикого костыля.
draw_sprite_ext (sprite_index, image_index, x, y, obj_player_base.draw_xscale, obj_player_base.draw_yscale, image_angle, image_blend, image_alpha);
В Step event есть изменение встроенной image_xscale спрайта на 1 или -1 в зависимости от того куда развернут персонаж
После того как я сделал эту функцию в Draw, у меня больше не отзеркаливает спрайт, хотя функция draw_sprite_ext не затрагивает встроенную переменную image_xscale. Почему так?
То есть параметр image_xscale меняется на -1, но при этом спрайт всегда рисуется по направлению вправо
xscaleThe horizontal scaling of the sprite, as a multiplier: 1 = normal scaling, 0.5 is half etc...
yscaleThe vertical scaling of the sprite as a multiplier: 1 = normal scaling, 0.5 is half etc...
Я так понял это и есть image_xscale, то есть мне надо просто отрицательное задавать, умножать на -1 может быть когда спрайт отражен должен быть
draw_sprite_ext (sprite_index, image_index, x, y, obj_player_base.draw_xscale, obj_player_base.draw_yscale, image_angle, image_blend, image_alpha);
Так ты и не используешь параметр image_xscale здесь. Вот если бы ты писал draw_self() у тебя бы всё работало.
Так что меняй obj_player_base.draw_xscale на -1 при движении влево.
А лучше сделай отдельный спрайт для каждого направления, даже если это просто одинаковые спрайты. Нельзя такие важные объекты как obj_player зеркалить и скейлить. Потому что при отзеркаливании твой спрайт может сместиться на 1 пиксель.
Да, именно если я пишу draw_self () то офк этот спрайт разворачивается
Но у меня же тогда функция растягивания не будет работать, или спрайт будет рисоваться два раза
Спрайт который растягивается не разворачивается при том что параметр im_xs = -1
Я зеркалю obj_player (скин игрока). obj_player_base я ничего не делаю, он сделан для коллизий и движения
Нужно учиться самому решать возникшие проблемы, потому что дальше будет только труднее. Когда начнёшь создавать свою игру постоянно будет возникать сложные и очень сложные задачки.
Ну пиши тогда либо
draw_sprite_ext (sprite_index, image_index, x, y, image_xscale, obj_player_base.draw_yscale, image_angle, image_blend, image_alpha);
или пиши
draw_sprite_ext (sprite_index, image_index, x, y, obj_player_base.draw_xscale, obj_player_base.draw_yscale, image_angle, image_blend, image_alpha);
Но меняй не image_xscale, а obj_player_base.draw_xscale
Нафиг кому нужны твои копеечки?
Просто правильно задавай вопросы.
Максимально подробно описывая что именно ты делаешь и что именно происходит не так.
Прикладывай на скриншоты, демонстрирующие проблему, прикладывай свой код и рассказывай как ты сам пробовал её решил.
В большинстве случаев ты в процессе написания вопроса получишь на него ответ. В остальных случаях получишь быстрый ответ на форуме.
Ну и погуглить не забывай.
Сделал по другому, просто в зависимости от инпута (лево или право) меняю эту свою переменную на положительное либо отрицательное значение, и все работает
В некоторых играх (например, Stardew Valley) если персонаж при движении упирается в препятствие достаточно близко к его краю - он не просто встает, а начинает двигаться к этому краю, пока не обойдет препятствие.
Стало интересно, как это реализовать. На ум приходит только создание особых "угловых" объектов коллизий, но это плохой вариант.
Можно ли как-то замутить проверку расстояния от игрока до краев маски объекта, с которым он сталкивается?
Или есть более простой способ заставить персонажа самостоятельно обходить препятствия?
>Можно ли как-то замутить проверку расстояния от игрока до краев маски объекта, с которым он сталкивается?
По ходу, понял как
Я так делаю:
При нажатии кнопки движения:
Проверка на линию коллизии шириной с персонажа на 1 пиксель вперёд по направлению движения.
Если коллизия впереди есть, делаю две проверки линии коллизий по бокам персонажа длинной в самого персонажа + 1 пиксель по направлению вперёд.
Если хотя бы одна из них не даёт коллизии, то нажатие кнопки движения приводит не к движению вперёд а к движению вбок с замедленной скоростью по направлению к ближайшей боковой линии без коллизий.
Получается как будто персонаж скользит в нужном направлении.
Вместо скольжения можно просто стартовать движение в бок, с правильной анимации. Но как по мне, "скольжение" лучше.
>Можно ли как-то замутить проверку расстояния от игрока до краев маски объекта, с которым он сталкивается?
Твой вопрос вызван тем, что у тебя нет набора скриптов для работы с коллизиями.
Напиши себе скрипт который будет проверять коллизию одной точки, коллизию линии и коллизию прямоугольника.
Анон, я сделал по данному туториалу pixel perfect movement/collision, в принципе я все понял
>>751592
>Разберись что такое Pixel perfect движение, двигай своего персонажа только на целый пиксель, даже если у тебя дробная скорость
Вот у меня вопрос: если я делаю round своей координаты в конечном итоге мой спрайт двигается integer'am, а если убираю - то по дробным. Но если я округляю пиксели, то у меня "тряска" спрайта игрока. А если убираю - ее нет, с анимацией все ок. Но получается тогда движение не пиксельперфектное? Могут быть баги? И как нужно делать?
1) Покажи тряску
2) я делаю round своей координаты - смысл туториала не в этом. По туториалу у тебя есть буферы движения ax и ay(кажется) к которым прибавляется твоё перемещение за шаг. Как только перемещение закончилось, от ax и ay забирается целая часть (ax div 1) и прибавляется к твоей текущей координате, а дробная часть (ax mod 1) Остаётся в буфере для движения в следующем кадре.
3) если я округляю пиксели, то у меня "тряска" спрайта игрока. А ты не округляй, ты делай floor
Не могу показать свой сейчас, вот https://www.youtube.com/watch?v=SB4C_A0NGCA&feature=emb_logo ПРИМЕРНО как у него танк, то есть двигается только по целым значениям, без субпикселей
https://www.dropbox.com/s/nfytcy8xm9al9o0/MovementSlopesBlog.yyz?dl=0 вот проект тутора самого кстати, можно запустить, попрыгать и станет понятно
> https://www.youtube.com/watch?v=SB4C_A0NGCA&feature=emb_logo
Это как раз примеры НЕ пиксель пёрфектного движения. Этот танк колбасит потому что он по дробным пикселям движется.
>https://www.dropbox.com/s/nfytcy8xm9al9o0/MovementSlopesBlog.yyz?dl=0
Здесь всё абсолютно плавно.
Что не так в проджекте? У тебя тат зум 6х. За каждую единицу перемещения персонаж прыгает на 6 реальных пикселей.
Не делай такого невротебенного зума.
Если хочешь крупный пиксель с плавными движениями - увеличивай свои картинки а не зум камеры.
>У тебя там зум 6х
Там комната 320х160, которая растягивается на фулскрин. При разрешении 1920х1080 как раз 6х получается, да.
320x160, 0:10
В современных пиксельарт играх не делают зум.
Вставляют спрайт с уже нарисованным на нём крупным пикселем и спокойно вращают.
Некоторые считают это зашкваром (я тоже). Некоторые не признают за пиксельарт. Но практира такова.
С таким крупным пикселем либо та, либо как у тебя на картинке. Хз что хуже.
А, прочитал посты дальше. Это другая хуйня.
Ясно, мы вам перезвоним.
В принципе это то же самое что я сделаю 960/540 и х2 зум на моем HD монике. То есть нормалёк
>В современных пиксельарт играх не делают зум.
Для меня это стало откровением
У меня до сих пор в голове туториалы где размер окна six-forty by three-sixty. Я думал что без зума делают только дауны...
Пиксель монитора 2560 x 1440 в 4 раза меньше, чем у монитора 1920х1080 (при одинаковых физических размерах мониторов), так чро физическое расстояние, которое пройдёт объект на экране будет одинаковым и для глаза не будет разницы.
Мне надо допустим
Слой1 тайлы Detph0
Слой2 спрайты Depth0
Слой3 инстансы Depth1
Если я ставлю глубину какому то 1 слою, оно автоматически меняет глубину и других слоев на 100 единиц. Хотя у других людей в проектах выставляется глубина слоев
Пришлось сделать отдельный скрипт, но там если я делаю двум слоям одинаковую Depth, спрайты проникают друг в друга.
Не знал, что Максим Кац делает игры.
Неа не должна быть
Короче можно сделать. Чтобы гамак не менял глубину нужно убрать замочек на всех слоях - тогда можно ставить любому слою любую глубину
Коллизии.
Использование keyboard_checkов прямов в коде.
Наиебанутейший способ сделать 1-way-platforms.
Поехавший инвентарь.
Туториал по камере просто нет слов.
Сами его туториалы, безусловно, очень полезны новичкам. Но Также новичкам нужно знать, что то, что в этих туториалах написано - суперсвехупрощённо и не правильно.
>Использование keyboard_checkов прямов в коде.
Не смотрел его видосы, Но тут-то что не так? Где еще keyboard_check использовать?
Ебать ты кодовый нацист. Ну, в принципе, справедливо.
Я гуглил англоязычные треды по этой проблеме - Sleep margin менял, не помогает. И везде один ответ был как решение: room_speed сделать 999 - типа тогда исчезает. В итоге я меняю Game frames per second на 120 и перестает подфризивать, но можно ли так делать? Что-то меняется для логики и производительности если 120 фепесов делать?
И второй вопрос, как снижать GPU usage? Пустой проект выдает около 14%, по-моему как то чересчур много
У тебя там где-то должна быть дельта между фреймами. Ты должен во всех своих формулах движения умножать всё барахло на дельту. Тогда всё движущееся будет двигаться обратно пропорционально скачкам фпс.
мимо
>>754550
Я тоже прочитал в обсуждениях про дельта тайм, что его надо юзать, только не совсем понял:
У меня стоит 120 room speed
На моём Монике игра выдает 60 кадров, на другом 75 в секунду. Если я буду использовать дельтатайм в скриптах, то что будет с логикой? Она будет работать как 120 шагов в секунду везде, то есть скорости будут одинаковые везде, при разной частоте обновления дисплея? То есть она отвяжется от фпс, если я верно понял?
Вообще какой-то не очень правильный ответ на вопрос.
В гамаке скорость игры не привязана к частоте монитора. Скорость игры можно как повышать, так и понижать прямо в процессе игры, частота монитора тут ни при чём.
Другое дело что таки да - если компт тормозит, и FPS проседает, то торможение это может быть обработано по-разному. Можно просто замедлить игру. А можно у замедленной игры увеличить все скорости, умножив их на дельта тайм.
И то и другое плохо. Игра не должна тормозить.
>И как теперь сделать так, чтобы на мониторе 75 гц у меня игра не ускорялась по сравнению с монитором 60 ГЦ? Потому что выдает 75 фпс / 60 фпс, соответственно все ускоряется
Ты можешь установить скорость игры в микросекундах. Это должно решить проблемы любых ускорений.
game_set_speed(33333, gamespeed_microseconds); // поставит тебе "60 фпс"
Но я как-то мало про это знаю, т.к. никогда не запускал гамаковские игры на мониторе с 75 герц.
game_set_speed(16666, gamespeed_microseconds) даст 60 fps
Появились полосы на тайлах которые ближе всего по глубине к камере
И игра по прежнему тормозит (фпс стабильный и не проседает). Просто подфризивает при движении изредка, очень заметно. Увеличение room_speed до 999 не помогает
In the tileset resource that you use set the texture border width to a higher value
Типа там один юнит броадкастит "Я ударил!"
Все остальные, когда слышат "Я ударил!" смотрят у себя на флаг "выбран" и если он стоит то отрабатывают получение пиздюлины.
Ну давай разберём по частям тобой написанное:
Во-первых, непонятно, зачем тебе какие-то глобальные переменные, в которых нужно что-то отсылать.
Во-вторых, я опять же не ебу, что у тебя за код, тащи свою хуйню сюда, телепаты в отпуске.
Самое время съебнуть на юнити.
https://www.yoyogames.com/en/get
Да, кстати. Не успел я купить на распродаже базовую версию с поддержкой десктопа и начать изучать, как они переобулись и вскоре стим-версию тоже склоупнут и выебут. Пиздец разочарование, в твиттере тоже вой стоит. Видимо, и правда, придется юньку щупать. Физическое отвращение к любой залупе с подписочной моделью.
Кстати я вот этого тоже не понял.
Мне сегодня клиент написал чтобы я принял новое лицензионное соглашение. Я принял и продолжил работать, не вникал.
Получается меня на подписку перевели что ли?
Всё нормально. Тем, у кого уже перманентная лицензия, ничего не угрожает.
Вроде бы не угрожает. В профиле перманентная лицензия вообще отображается как free мерзость какая, по будущим обновлениям сейчас этим мудакам особой веры нет. Где-то эти костыли рано или поздно вылезут.
Зайди в раздел "subscriptions".
Олсо вангую что через год все "вечные" лицензии обнулятся. Или нельзя будет обновится без покупки подписки. Или ГМ загнётся.
Для безыгорных гамак бесплатен.
Да тут вопрос не в версии, по большому счету, а в хамском отношении к лояльному клиенту, которому в нынешних условиях всё-таки есть куда свалить. Олды вон до сих пор в шестом фотошопе сидят под ХР и им нормально, главное чтоб для задач хватало, но там и пиратка, а не вот это вот всё.
1920x1080, 0:06
А там уж либо после продаж попробовать перекатить, либо щупать хуюнити/говнот, а то и удк5 ждать. Вот уж современный мир, когда лучший убийца продукта это этот же самый продукт.
Подписка вроде не дорогая, но всё равно противно. А самое уебанское, это то что уже купленное отбирают.
он там вроде автоматом конвертит все во что ему нужно
Есть ли вшитые шрифты, которые умеют показывать китайские (TC и SC), японские и корейские иероглифы? Ну и хинди ещё збс было бы.
Скачал гугловские CJK из Noto Sans и Noto Serif, но как-то с ними проект вырос с 30 Мб до 190 Мб. Не хотеть этого. С другой стороны, Noto по хорошей лицензии распространяется.
Подсобите советиком, аноны, прошу.
>Тред, видимо, теперь уже посвящён оплакиванию перманентной
Нет, не посвящён.
>Есть ли вшитые шрифты, которые умеют показывать китайские (TC и SC), японские и корейские иероглифы? Ну и хинди ещё збс было бы.
Ну что значит "вшитые"? Либо ты используешь системный шрифт ОС пользователя, либо прикрепляешь свой шрифт к проекту.
Шрифт с kaji естественно много весит, так что для японцев и китайцев можешь сделать отдельные версии, чтобы остальных кандзями не напрягать. Или использовать системые шрифты, какие у них там широко распространены, я не знаю.
А ещё у меня для тебя хорошая новость. Корейцы уже 60 лет иероглифами не пользуются.
>Нет, не посвящён.
Прекрасно.
>Ну что значит "вшитые"? Либо ты используешь системный шрифт ОС пользователя, либо прикрепляешь свой шрифт к проекту.
То есть если у меня в самой игре иероглифы не отображаюся, у пользовтелей, живущих в мире иероглифов, будут? В самой студии у меня, кстати, иероглифы прекрасно отображаются. Странно это всё.
>Шрифт с kaji естественно много весит, так что для японцев и китайцев можешь сделать отдельные версии, чтобы остальных кандзями не напрягать. Или использовать системые шрифты, какие у них там широко распространены, я не знаю.
Прекрасный совет, спасибо. То есть общего шрифта для них нет? У Noto там вроде по 30-40к символов, а наиболее часто у азиатов используется 2-8к. Хотя, такие "выборочные" рофлошрифты, наверное, ещё поискать надо.
>А ещё у меня для тебя хорошая новость. Корейцы уже 60 лет иероглифами не пользуются.
Но и латиницей чё-то не особо пользуются чувствую терминологически подъёб.
>
>Но и латиницей чё-то не особо пользуются чувствую терминологически подъёб
У них свой корейский алфавит слоговый. Наподобие японской каны.
>30-40к символов
Это слишком дохуя, лутый оверкил. Никто столько не знает. 2к школьных иероглифов + 3к связанных с твоей профессией.
>у пользовтелей, живущих в мире иероглифов, будут? В самой студии у меня, кстати, иероглифы прекрасно отображаются
Не знаю. Не тестировал никогда. Но по идее так и должно быть, если ты используешь системные шрифты.
Ты уверен что твое говно нужно кому-то в китае или японии? Попробуй назвать пару инди-игр от китайцев или японцев. Думаешь там кто-то узнает о твоей игре? Ты тратишь время на хуйню.
>Ты уверен что твое говно нужно кому-то в китае или японии? Попробуй назвать пару инди-игр от китайцев или японцев. Думаешь там кто-то узнает о твоей игре? Ты тратишь время на хуйню.
Это здоровые амбиции, не обращай внимание.
>Не знаю. Не тестировал никогда. Но по идее так и должно быть, если ты используешь системные шрифты.
Но у меня в системе иероглифы отображаются. И в самой Studio весь текст корректно отображается. Может быть, проблема с тем, какой фонт задается в коде.
Ну скинь билд с кандзи.
Запущу у себя просто так, а потом через японскую аплокаль и посмотрю на буквы.
Я пока не готов её скидывать, однако идея настроить под это виртуалку хороша, спасибо!
>>768989
>>769002
>>769004
>>769010
Решение проблемы нашлось: к счастью при выборе областей номеров используемых символов при настройке фонтов можно скопировать весь текст и GMS2 сам отберёт только нужные иероглифы и символы.
10/10
Ручаюсь, Юнити3Д так не умеет.
Размер игры снизился со 190 Мб до 35 Мб. Прекрасно. OTFки Фонтов, конечно, сами ещё перед релизом надо будет добавить, но это мелочи.
>Ручаюсь, Юнити3Д так не умеет
https://docs.unity3d.com/Manual/class-Font.html
Одной галочкой включается. Только отработка ошибок слишком замысловатая.
>When you set the Characters drop-down in the Import Settings to Dynamic, Unity will not pre-generate a texture with all font characters. Instead, it will use the FreeType font rendering engine to create the texture on the fly. This has the advantage that it can save in download size and texture memory, especially when you are using a font which is commonly included in user systems, so you don’t have to include the font data, or when you need to support asian languages or large font sizes
Очищай сурфейсы после создания. На только что созданном сурфейсе может быть нарисовано то, что было нарисовано на уже освобождённом.
О, стоп-тайм на гифке. Тоже рекомендую юзать.
Местные аноны наверняка знают гамак лучше, чем в движкосраче. Мне просто хочется знать 2-3 главных приемущества гамака и всё. Никаких вопросов, выпадов или какого бы то ни было другого продолжения этого обсуждения с моей стороны не будет.
Ну каких тебе "главных преимуществ"?
Простой, удобный, для 2d лучше не найти.
Мультиплатформа.
Сделать можно всё что угодно.
Отличная техподдержка от сотрудников yoyo на форуме (не раз с ними общался) и от обычных пользователей.
Что ещё от движка нужно?
Могу припомнить, что несколько раз сталкивался с багами в гамаке, репортил их и их исправляли.
Спасибо за скорый ответ! Примерно так его и видел.
При загрузке комнаты у большинства объектов стал выполняться clean_up евент ДО create event.
Т.е. заходишь в комнату - игра вылетает потому что инстансы выполняют clean_up ивент, в котором нужно освобождать сурфейсы, если они есть. А переменная с указателем на сурфейс ещё не объявлена, т.к. create event ещё не произошёл.
Я убрал код из clean up, игра стала загружаться, create выполнился но все инстансы были невидимы. Хотя по дебагеру было видно что в комнате они есть.
Что это была за хуерга я вообще не понял, потому что через 20 минут попытак дебаганья всё внезапно снова начало работать.
Я могу только предположить что хуйня была как-то связана с потерей интернет соединения во время работы, из-за чего могла как-то пойти по пизде лицензия yoyo и игра ограничила кол-во объектов, которые можно иметь в проекте.
Если у кого-то было что-то подобное. отпишитесь.
Объекты не перманентные? Хз что у тебя там, но клинап выполняется при окончании комнаты.
Потому что speed - это одна из встроенных переменных, наряду с direction. Объект движется в сторону, определяемую direction (которая по умолчанию равна 0, это вправо) со скоростью, указанной в speed. Соответственно, если ты к этому сверху привяжешь y += speed, объект будет двигаться по диагонали. Делай кастомные переменные типа spd, тогда будет двигать только вниз.
>Подскажите, имеет ли смысл пилить РПГМ-подобную игру (aka пикрил) на GMS, а не на, собственно, RPGM?
Нет. Другое дело, что ГМС для более серьёзного и гибкого геймдева, даром, что относительно простой в освоении. РПГМейкер - это больше конструктор с прямыми указаниями типа "один шаг влево" (минус всякие кастомные скрипты, без которых даже размер окна нельзя поменять из коробки).
еба чел хуярит
Собираюсь приобрести стим версию для декстопа, но не могу выкупить за лицензию, мне дадут 12 месяцев инди варианта подписки или же перманентную лицуху??
Ну и стоит ли оно того вообще или же рассмотреть другие варианты?
>перманентную лицуху
Это. Один раз покупаешь в стиме и оно закрепляется за акком.
>Ну и стоит ли оно того вообще или же рассмотреть другие варианты?
В плане? Другой движок или что?
>В плане? Другой движок или что?
Да, в далёком будущем хотелось бы делать какие-нибудь прикольные проектики, что-то по интереснее чем платформеры по гайдам, и выкладывать их на какой-нибудь itch.io или даже стим.
И вот что лучше для этого гамак, unity или какой нибудь unreal с годотом?)
>Да, в далёком будущем хотелось бы делать какие-нибудь прикольные проектики, что-то по интереснее чем платформеры по гайдам, и выкладывать их на какой-нибудь itch.io или даже стим.
Ну есть дофига игр на гамаке, например, многие из них публикуются в стиме, выглядят некисло.
>платформеры по гайдам
Такое больше нужно для тех, кто вообще ничего в кодинге не понимает: объяснить принцип работы переменных и объектов, функции, вот это вот всё.
>И вот что лучше для этого гамак, unity или какой нибудь unreal с годотом?)
Ну я как адепт церкви гамака должен тебя склонить к оному, но я хотя бы объясню, почему: хороший движок с понятным интерфейсом, в котором чётко видно, где какой объект/скрипт и как он будет работать/вязаться с другими, багов по минимуму, да и то они фиксятся довольно быстро. Производительность выше по сравнению с тем же юнити да у чего угодно она блять выше, чем у юнити.
Короче, если тебе нужен удобный движок для 2Д игр на самом деле гамак ещё и в 3Д может с минимальным порогом вхождения, то вот, пожалуйста. Сам попробуй что-нибудь потыкать: у гамака есть трайл версия, с которой недавно сняли ограничение по времени, то есть ты в ней только собирать экзэшники не сможешь. Посмотри, что да как, если чего непонятно - обращайся сюда.
Юнити позволяет создавать крутой визуал благодаря сочетанию 2д и 3д, а что там за 3д в гамаке я хз.
На самом деле юзаю юнити, т.к. просто лучше в нем шарю.
мимо
>а что там за 3д в гамаке я хз
Ну вон выше полноценный тридэ проект на гамаке. Есть игры по типу Titan Souls, которые совмещают в себе 3Д и 2Д в топ-даун перспективе. Челик с этой доски делает арчтавер, правда на 1.4.
>Собираюсь приобрести
>рассмотреть другие варианты?
Да, рассмотри Godot, он на 100% бесплатный и в 2D может не хуже GMS. Жалко что ли 36 МБ с официального сайта скачать без какой-либо установки? А официальные мануал с туториалами очень хорошо поясняют, как что-то сделать.
Спасибо, анон, за развёрнутый ответ, буду ждать скидон на лицензию, а пока поковыряю триал версию
Например
#macro PLAYER_WALK_SPEED 15
#macro PLAYER_JUMP_BUFFER 20
Есть разница, буду я это делать так, либо в Creation Code румы?
Нахожу только старые версии.
>где скачать более-менее свежий гамак
https://www.yoyogames.com/ru
>с кряком
Нигде.
А зачем? Он же практически бесплатный.
>Чет жаба душит $50 отдавать
За что ты собрался 50$ отдавать? Ты точно ходил по ссылке? Попробуй ещё раз, может быть ты всё-таки сумеешь найти там кнопку "бесплатно"? (Она там слева внизу)
https://www.yoyogames.com/ru/get
Когда (никогда) понадобится сделать билд на пека заплатишь 82 рубля за месяц лицензии или скинешь свой проект в тред, чтобы тебе билд кто-нибудь сделал.
Вот блин, спасибо. Я в стиме смотрел. Я так понял запуск проекта бесплатен, а компилятор платный?
>заплатишь 82 рубля
У меня 5 баксов написано.
>Ребят, в последний раз пользовался версией 8.1. С тех пор большие изменения произошли?
Не просто изменения, а глобальный оверхол почти всего, хотя суть осталась всё та же.
>Сейчас без проблем вкачусь?
Да.
>Можете вкратце рассказать что изменилось с тех пор?
Если вкратце, то подтянули интерфейс и производительность, добавили новых фич. Девочка уже совсем большая, теперь это не просто Gamemaker, это GameMaker Studio 2(.3.6).
>А синтаксис поменялся? Функции те же?
По большей части всё то же самое, скорее добавили новые функции к уже существующим, чтобы не пердолиться. В любом случае, освоить всё это не так уж трудно.
Твой пикрил как раз хороший пример того, что можно было бы сделать на любом другом движке кроме RPG Maker'а. Зачем брать движок для РПГ, если ты не пользуешься ни чем кроме системы диалогов?
Какая разница что поменялось в синтаксисе, если его детали с 99% вероятностью ты уже не помнишь? С выхода гамака 8.1 уже лет 10 прошло и если ты его тогда в последний раз трогал то сейчас все равно переучиваться.
Например хочу сделать редактор уровней и хочу сохранять в файл папка_с_игрой/levels.txt
Пишу такой код
file_text_open_write("levels.txt");
или
file_text_open_write(working_directory + "levels.txt");
но нигде не могу найти созданный файл. Ни в папке с проектом (datafiles), ни в временной папке. Что я делаю не так?
Не пробовал например сделать show_debug_message(working_directory + "levels.txt")
чисто так сказать потыкать везде и проверить где обосрался?
Файлы, которые ты создаёшь в игре (твои сейвы, текущие конфиги или твой levels.txt создаются в сэндбоксе во временной папке C:\Users\твой юзернейм\AppData\Local\название твоего проекта
Если ты захочешь прикрепить свой файл к проекту, то жми на кнопку, как на пикрил.
Прикреплённый к игре файл нельзя редактировать из игры. Игра не имеет права write к любым файлам на диске пользователя, только к файлам в разрешённой ей временной папке.
Понял. Спасибо, анон!
960x540, 0:15
Если тактика, то вполне. Гамак ещё на 1.4 выдерживал 100+ объектов, которые постоянно двигались туда-сюда. Другой вопрос: дойдёт ли у тебя до этих 100 объектов?
Охуенно, прямо наглядно видно, как фпс ещё на загрузке провалился ниже плинтуса.
Года 4 назад пытался сделать игру, но сдох комп еще на моменте анимаций персонажа. Щас через дохуя времени у меня вновь зачесалась простата желание дрочить гамак.
Коротко - игра 2д-платформер типа КатанаЗеро в стиле Хотлайна.
Что изменилось за последние несколько лет?
Ну смотри: на прошлом зачищенном уровне у них всё летало, хотя была куча трупов, у которых есть физон при смерте (они отлетают и при смерти), плюс их можно взорвать или воскресить. Ещё там куча стволов, которые можно брать, партиклы, эффекты горящей земли и прочее говно, плюс два персонажа. На следующем уровне овердохуя (500+) противников с разными паттернами поведения, плюс всё вышеназванное. И это ещё на 1.4 с его производительностью. Тебе на двойке хватит твоего пошага на сто объектов с головой.
Не так сложно, как кажется, но хоть стекинг и проще реализовать, наверное, будет, но думаю по оптимизации модели лучше будут.
Я глянул гамако дискорд, раздел 3д, там чет уныленько на самом деле. И в целом не советуют без опыта лезть. Правда и в стакинге я пока застрял, т.к. планировал манипулировать с depth с помощью косинуса угла камеры до обьекта, а он сука такая только 2 знака после запятой и этого мало((((((( стакинг я выбрал щоб камеру вертеть офк и там депс супер критично настроить.
Проснулся в 3 часа ночи, почистил мандаринку и подумал о том, что мой теоритический метод определения depth если и будет работать, то только с объектами в один тайл размером, чего не хотелось бы. Ебаное программирование игрушка сатаны.
1920x1200, 0:17
Почему это не работает?
lightBulb1[0] = [3,2,1,0,1,2,3];
lightBulb1[1] = [3,2,1,0,1,2,3];
lightBulb1[2] = [3,3,2,1,2,3,3];
lightBulb1[3] = [3,3,3,2,3,3,3];
for (var v=0; v<3;v++)
{
for (var h=0; h<6;h++)
{
show_debug_message(string(lightBulb1[v,h]));
}
}
Ошибка:
Push :: Execution Error - Variable Index [0,4] out of range [1,4] - -1.lightBulb1(100012,4)
Когда вот так задаю массив, тоже не работает.
lightBulb1 = [[3,2,1,0,1,2,3],
[3,2,1,0,1,2,3],
[3,3,2,1,2,3,3],
[3,3,3,2,3,3,3],];
Гамак 2.2.5
>в юнити.
Хуюнити, блядь. Пока мотал /gd в поисках ламповейшего треда, взгляд зацепился за юнитеблядков, сорян.
Убирал, не помогало. С запятой на каком-то форуме увидел.
>>783239
Тоже пробовал, не работает.
>>783243
Дебаг месседж только стринги выводит, чтобы переменную вывести - надо её в стринг сконвертить, для этого и стринг.
Спасибо, посоны, за попытку помочь.
В итоге плюнул и сделал одномерный массив, и вывожу как
lightBulb1[v+h*6].
Дебаг выводит значение любого типа. Быстрый поиск в мануале функции стринг() выдает ожидаемое ничего. Второй вариант создания массива без запятой в конце является правильным, в мануале он есть.
Гоню, есть такая функция. С мобилы не нашел, с компа нашел)
Даже вздрочился с кровати за комп проверил, все работает. Массив создавал как твой второй вариант, только без последней запятой, потому что не может так быть, чтоб у тебя один уровень массива оканчивался запятой, а другой нет. Скопировал твои форы и написал нормально индексы [v][h]. А еще при создании не помню точку с запятой писал или нет в конце. В мануале вроде ее не надо ставить.
Судя по мануалу она есть, как "массив массивов". Т.е. у тебя одномерный массив одномерных массивов. Что, собственно, и иллюстрирует запись выше.
>>783248
>Дебаг выводит значение любого типа.
Даже при автозаполнении он в подсказке пишет: show_debug_message(str)
...посмотрел в мануале:
"Note that the message can be either a string or a real number, but if you need both then the number will have to be converted to string first using the string function"
Действительно, ты прав. Больше не буду стринги писать.
>>783250
Да как так-то? Вот я написал:
lightBulb3 = [[3,2,1,0,1,2,3],
[3,2,1,0,1,2,3],
[3,3,2,1,2,3,3],
[3,3,3,2,3,3,3]];
Правильно? Как мне теперь к нему обратиться?
content = lightBulb3 [[2],[3]];
show_debug_message(content);
Выдаёт 2 в output, но вылетает с ошибкой:
DoConv :1: illegal array use at gml_Object_main_level_Create_0 (line 39) - content = lightBulb3[[2],[3]];
content = lightBulb3[[2][3]];
Object: main_level Event: Create at line 39 : got '[' expected ',' or ']'
Object: main_level Event: Create at line 39 : malformed assignment statement
content = lightBulb3[2,3];
Тоже выдаёт 2, но вылетает с другой ошибкой:
Push :: Execution Error - Variable Index [2,3] out of range [1,-1] - -1.lightBulb3(100015,64003)
at gml_Object_main_level_Create_0 (line 39) - content = lightBulb3[2,3];
Может в GML2.3 всё работает, а в GML2.2 - нет?
Судя по мануалу она есть, как "массив массивов". Т.е. у тебя одномерный массив одномерных массивов. Что, собственно, и иллюстрирует запись выше.
>>783248
>Дебаг выводит значение любого типа.
Даже при автозаполнении он в подсказке пишет: show_debug_message(str)
...посмотрел в мануале:
"Note that the message can be either a string or a real number, but if you need both then the number will have to be converted to string first using the string function"
Действительно, ты прав. Больше не буду стринги писать.
>>783250
Да как так-то? Вот я написал:
lightBulb3 = [[3,2,1,0,1,2,3],
[3,2,1,0,1,2,3],
[3,3,2,1,2,3,3],
[3,3,3,2,3,3,3]];
Правильно? Как мне теперь к нему обратиться?
content = lightBulb3 [[2],[3]];
show_debug_message(content);
Выдаёт 2 в output, но вылетает с ошибкой:
DoConv :1: illegal array use at gml_Object_main_level_Create_0 (line 39) - content = lightBulb3[[2],[3]];
content = lightBulb3[[2][3]];
Object: main_level Event: Create at line 39 : got '[' expected ',' or ']'
Object: main_level Event: Create at line 39 : malformed assignment statement
content = lightBulb3[2,3];
Тоже выдаёт 2, но вылетает с другой ошибкой:
Push :: Execution Error - Variable Index [2,3] out of range [1,-1] - -1.lightBulb3(100015,64003)
at gml_Object_main_level_Create_0 (line 39) - content = lightBulb3[2,3];
Может в GML2.3 всё работает, а в GML2.2 - нет?
>Выдаёт 2 в output
>Тоже выдаёт 2
Прошу прощения, это выдавал другой debug. Т.е. во всех трёх случаях ничего не работает никак.
Bulb[1][0];. Такая конструкция выдает содержимое. Просто две квадратные скобки без запятых между ними, не вложенные никуда.
Только не у меня.
lightBulb3 = [[3,2,1,0,1,2,3],
[3,2,1,0,1,2,3],
[3,3,2,1,2,3,3],
[3,3,3,2,3,3,3]];
content = lightBulb3[1][0];
Object: main_level Event: Create at line 38 : Assignment operator expected
Object: main_level Event: Create at line 38 : malformed assignment statement
просто скопировал твой код в криейт ивент рандомного объекта. все работает. поселдняя версия стоит гмс2. в предыдущей тоже работало.
>content = lightBulb3[1][0];
Т.е. что-то он создаёт, а как это прочитать - хз.
к слову, если написать
content = lightBulb3[1];
show_debug_message(content);
То он выдаёт в Output
{ { 3,2,1,0,1,2,3 }, }
>>783361
Для верности, скопировал этот код в новый объект - монопенисуально.
У меня 2.2.5. Чтобы не тратить время добрых людей предлагаю считать, что в мою версию такого хайтека как двумерные массивы тогда ещё не завезли.
>{ { 3,2,1,0,1,2,3 }, }
[ 3,2,1,0,1,2,3 ] должен быть такой аутпут с content = lightBulb3[1];
>У меня 2.2.5. Чтобы не тратить время добрых людей предлагаю считать, что в мою версию такого хайтека как двумерные массивы тогда ещё не завезли.
я быстропогуглил про арреи в 2.2.5 и типа там вроде действительно какие-то проблемы с ними. но уже нет сил погружаться, четвертый час ночи.
и мне ошибка в 38лайне не нравится. он не ругается, что ты индексы ячеек кривые задаешь на оутпут, он ругается на оператор присваивания почему-то.
Спасибо, друг, забей. Слишком много времени отняло уже, проблему обошёл, буду пилить дальше.
>он ругается на оператор присваивания почему-то.
Я думал, что на то что просто "=" а не ":=", но оба варианта, похоже, одинаковы. Ошибка, во всяком случае, остаётся.
Всё. Хуйсним.
Или же какое-то хранилище скриптов, которые можно использовать у себя?
Не совсем понятно, что именно ты хочешь. Типа как не допускать спагетти говнокода или что?
phy_position_x += sign (obj_player.x - x) speed_enemy;
phy_position_y += sign (obj_player.y - y) speed_enemy;
То есть, он должен идти ко мне сам, но почему-то мне выдаёт ошибку. Не могу понять почему, обрыл интернет что-бы найти ответ на вопрос.
После запуска игры выдаёт ошибку в консоли
___________________________________________
############################################################################################
ERROR in
action number 1
of Step Event0
for object obj_monster:
DoAdd :2: undefined value
at gml_Object_obj_monster_Step_0 (line 5) - phy_position_x += sign (obj_player.x - x) * speed_enemy;
############################################################################################
gml_Object_obj_monster_Step_0 (line 5)
в чём проблема и как её решить ?
Real (single precision floating point value, or undefined if the instance is not physics enabled)
DoAdd :2: undefined value
А у меня такой вопрос еще. А ты уверен, что obj_player.x - что-то тебе передает вообще? Ну типо я конечно подозреваю, что в данном случае он дает х от рандомного обж.плеер и так как он один, то получаем как надо, но все же? У тебя же тут не конкретизируется экземпляр объекта.
enemy1
enemy2
enemy3
Есть несколько инстансов каждого в руме. Мне нужно к ним ко всем применить некое действие (например - убить).
Для одного я пишу цикл:
for (var i = 0; i < instance_number(enemy1); ++i;) {убить};
А можно как-нибудь изящно в одном цикле всех обойти?
Т.е., по сути - получить ссылки на все объекты с маской "enemy*".
Пока писал придумал, что можно каждому в криейт сказать, чтобы записывал свой айдишник в массив all_enemies[], лежащий в том объекте, где осуществляется обработка.
Может есть лучше способ? Потому что в таком случае непонятно, что делать, когда один из объектов убирается.
Можно создать родительский объект obj_enemy и сделать всех врагов детьми этого объекта.
После чего применять
with obj_enemy
{
hp = 0
painfull_death_flag = true
}
>with obj_enemy
А это в цикле юзать или как? Типа цикл, как у меня выше, только вместо enemy1 - тот родительский объект?
он тебе код уже полностью написал, не надо никаких циклов, если ты даешь команду родительскому объекту, то ее получают все дети.
Спасибо, хлопцы, всё работает!
Если их три - всё зашибись, добавляю четвёртый - не работает.
Ошибки нет, просто не делает то, что должен. У меня код ставит и убирает тайлы на разных тайловых слоях - ничего сложного не делает. Освещение тайловое. Т.е. с объектами вообще никак не взаимодействует!
В общем, проблема в определении размера тайловой карты. Вот этот код работает при 4 объектах, но не работает при 5:
В сцене 4 слоя:
Instances (тут 4 объекта - main, в котором весь код и 3 пустышки.)
Dynamic_light (на момент запуска пустой)
Static_light (содержит тайловую карту статичного освещения)
Room_base (содержит тайловую карту уровня)
Этот код лежит в Create. Больше никакого работающего кода в проекте нет (Step закомменчен).
layBase = layer_get_id("Room_base");
layStaticLight = layer_get_id("Static_light");
mapStaticLightId = layer_tilemap_get_id(layStaticLight);
layDynamicLight = layer_get_id("Dynamic_light");
global.mapDynamicLightId = layer_tilemap_get_id(layDynamicLight);
mapSizeX = tilemap_get_width(layBase);
mapSizeY = tilemap_get_height(layBase);
for (var v=0; v< mapSizeY; v++)
{
for (var h=0; h< mapSizeX; h++)
{
//get
var dataLight = tilemap_get(mapStaticLightId, v, h);
tilemap_set(global.mapDynamicLightId, dataLight, v, h);
}
}
Если в проекте всего 4 объекта, то размер карты mapSizeY и mapSizeX определяется нормально, и всё работает.
Если в проект добавить ещё один объект, то mapSizeY и mapSizeX становятся равны -1, и цикл for игнорируется.
Если вручную задать вместо mapSizeY и mapSizeX какие-нибудь цифры - то снова работает.
Такие дела.
Какой-то пиздец.
В общем, проблема в определении размера тайловой карты. Вот этот код работает при 4 объектах, но не работает при 5:
В сцене 4 слоя:
Instances (тут 4 объекта - main, в котором весь код и 3 пустышки.)
Dynamic_light (на момент запуска пустой)
Static_light (содержит тайловую карту статичного освещения)
Room_base (содержит тайловую карту уровня)
Этот код лежит в Create. Больше никакого работающего кода в проекте нет (Step закомменчен).
layBase = layer_get_id("Room_base");
layStaticLight = layer_get_id("Static_light");
mapStaticLightId = layer_tilemap_get_id(layStaticLight);
layDynamicLight = layer_get_id("Dynamic_light");
global.mapDynamicLightId = layer_tilemap_get_id(layDynamicLight);
mapSizeX = tilemap_get_width(layBase);
mapSizeY = tilemap_get_height(layBase);
for (var v=0; v< mapSizeY; v++)
{
for (var h=0; h< mapSizeX; h++)
{
//get
var dataLight = tilemap_get(mapStaticLightId, v, h);
tilemap_set(global.mapDynamicLightId, dataLight, v, h);
}
}
Если в проекте всего 4 объекта, то размер карты mapSizeY и mapSizeX определяется нормально, и всё работает.
Если в проект добавить ещё один объект, то mapSizeY и mapSizeX становятся равны -1, и цикл for игнорируется.
Если вручную задать вместо mapSizeY и mapSizeX какие-нибудь цифры - то снова работает.
Такие дела.
Какой-то пиздец.
Пилять, поставь брекпоинт в том месте, где код не исполняется и скинь проджект на гугл драйв.
>Если в проекте всего 4 объекта, то размер карты mapSizeY и mapSizeX определяется нормально, и всё работает.
Если в проект добавить ещё один объект, то mapSizeY и mapSizeX становятся равны -1, и цикл for игнорируется.
Значит ты не можешь получить значения ширины и высоты слоя layBase.
Скорее всего ты даже не можешь получить его правильный id выполняя layBase = layer_get_id("Room_base");
Ты всю эту малафью делаешь в create event объектов. Скорее всего у тебя косяк с порядком исполнения кода. Проверь Instance creation order в комнате.
Всё, я разобрался.
У меня в
tilemap_get_width(layBase);
layBase = layer_get_id("Room_base");
Т.е. ссылка не на карту, а на слой.
Если добавить
mapBaseId = layer_tilemap_get_id(layBase);
И брать размеры с правильной ссылки - всё работает:
tilemap_get_width(mapBaseId );
Странно, почему при количестве объектов <5 работает и layBase... но я рад, что удалось всё починить. Я уже практически настоящий программист, гы.
>Странно, почему при количестве объектов <5 работает и layBase.
Потому что тебе просто повезло угадать со значением. id слоя это просто число. Оно может меняться.
И вообще постоянно баги случаются когда меняю что-то в тайлсете и обновляю его.
Уменьшил размер тайлсета - стало норм. Но в чем суть так и не понял.
У всех, ковыряй дальше, и работай над своим ментальным восприятием. Подходи к любому вопросу не с мыслью "А что если не получится?", а с мыслью "А что если получится?", каждая неудача это +100XP, любое действие, даже самое маленькое, например тупо поковыряться в гамаке 5 минут, пытаясь сделать что ты хочешь - это шажочек в сторону твоей цели.
Как ты объясняешь это для себя? Ведь на курсах чему-то же учили. Есть какие претензии к курсам?
К курсам никаких претензий, особенно если второй раз смотреть уже с какой то базой. не получается что то сделать нестандартное, что не разбирали в курсе. Условно сделать файтинг, как планировал, даже не могу начать не знаю с какой стороны подступиться, даже Стейт машину не могу составить уже неделю.
Я конечно же не целый день работаю, только вечерами 1-3 часа в день.
начни хоть с чего-то лол. сделай всратую стейт машину и неправильную. когда упрешься в ее всратость, поймешь что тебе в ней мешает, переделаешь код и т.д. А так скорее всего ты не концентрируешься на задаче и нехуя не делаешь на самом деле. Типа сядешь на свои 1-3 часа из который 2.99 выбираешь музыку для кодинга и кипятишь чай.
>Типа сядешь на свои 1-3 часа из который 2.99 выбираешь музыку для кодинга и кипятишь чай.
Ну ты и мразь. Я как раз сидел пил кофе, курил и слушал музон скролля двачи уже почти три часа когда вдруг напоролся на твой пост.
fпхапхахпх
Так а что не получается? Опиши, что ты хочешь сделать, и что именно не выходит.
>курс на юдеми
Ну ты и кек.
А чо? Я хз где брать описание задач, на Ютубе или слишком одинаковые или какие то всратые. Официальный форум не сильно помогает там каждый второй вопрос "как сделать передвижение, как сделать анимацию"
хотел платформер солузлайк, потом понял что как то не вывожу, решил попроще платформер тип контры, но пока осилил только передвижение и то большую часть взял из курсов что уже прошел.
вообще я рисовал раньше, делал демку и один чел с меня взял 15к сделав вообще столько сколько я сделал, после 3 месяцев обучения, за час.
Ну для начала тебе нужно общее понимание того, как в гамаке работают переменные и скрипты, для этого я бы посоветовал сделать что-то совсем примитивное, типа кликера, или вон посмотреть туториалы по созданию инвентарей (у Сполдинга вон недавно было). У меня примерно так же было, я не мог понять, как и что работает, потом приучился, глядя на чужой код.
Сейчас зашел в дашборд на сайт, там хер пойми что, Free Permanent, подписка на Creator (12 months free), хуе-мое. Объясните, я уже наебан гамаком?
Если покупал в стиме, то проблем не должно быть. Что у тебя не так выходит?
Кто-нибудь тут пользуется GMEdit? Интересно, есть ли возможность экспорта проекта в .exe, имея компилятор на случай оффлайн разработки :-(
Нашёл плагин buildier и его форк, однако оба ВРОДЕ только позволяют запускать проект, но не экспортировать собранное.
Может надо какие-то аргументы где-то написать, чтобы экзешник создавался?
Авторы пишут, что этот плагин работает с настройками компилятора. Может в GMS2 надо что-то настроить, чтобы всегда создавались экзешники?
Или может есть ещё какие варики? О крякнутой студии думать пока не очень хочется.
Вопрос актуален: >>795254
Могу только добавить, что купил на торрентах нужные крякнутые версии, но антивирус ругается на приложенные файлы, что неудивительно, но немного пока раздражает и антивирус отрубать пока желания нет.
Вы видите копию треда, сохраненную 2 августа 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.