Как создать массив данных в Game Maker Studio 1.4.9?
Пытаюсь понять как работать с гамаком, местами это похоже на юнити, а местами на Stencyl,
что очень забавно.
Хочется понять как создать список какого-нибудь класса? (возможно класс это объект, я пока не совсем понял структуру) чтобы перезагрузка уровня не удалила и не сбросила его (типа глобально)
И чтобы эти объекты не торчали на уровне.
- 25 февраля 2020, 11:41
- 01
А в Game Maker реально всю игру из одного объекта написать?
Ну то есть там же вроде есть обычные операторы рисования как в Tic80?!
Можно ли весь код написать для одного объекта, чтобы это была полноценная игра?
Я пока ещё не уверен как тут работает обычный код на Lua Tic80, типа, ибо мне нужны функции:
Не совсем понял, те ли это функции:
https://docs.yoyogames.com/source/dadiospice/002_reference/001_gml%20language%20overview/401_16_functions.html
или это нечто другое, и работают ли в Game Maker функции настолько же быстро как в других программах, или они аналог SendMessage в Unity, то есть как бы получатели месседжа/команды.
Просто я привык очень часто использовать разные функции в играх, надеюсь тут это тоже не проблема.
Конечно, только зачем? Вся суть ООП в том чтобы объекты были отдельно друг от друга, и ты писал код от врагов в объектах врагов, а код от выстрелов в объектах выстрелов. Можно ещё игру в текстовом режиме делать как в DOS'е. А ещё музыку PC-Speaker'ом играть. Один вопрос - что тебе это даст, чем это лучше?
Обычные это какие? Ты можешь рисовать как спрайты, так и просто линии, круги, точки.
Можно. Я могу любую игру написанную на ГМе переписать под один объект, только вот изначально разрабатывать игру в виде одного объекта - это тебе придётся скроллить сначала 100 строк ивента, потом 200, потом 500, потом 1000, а потом у тебя поломается колесо мыши и кнопки Page Up, Page Down, Home и End.
Нет такого понятия "обычный код". Если ты хочешь ни за что не использовать объекты, ты можешь использовать один объект так, будто его не существует, просто тасовать переменные туда-сюда. Так и писали игры в 1985 года, когда не было ещё C++, и все писали на обычном C без классов и объектов.
Это раздел справки о встроенных функциях. Чтобы писать свои, тебе нужны скрипты:
https://docs.yoyogames.com/source/dadiospice/001_advanced%20use/006_scripts.html
Работают. Медленнее чем в других программах, в 100 раз. Но быстрее чем в Юнити, в 200 раз. :yak:
Извини, но вопросы такие бесячие, что отвечать на них всерьёз становится уже трудно. Откуда я знаю о каких других программах речь? Гамак "достаточно быстрый", это я тебе точно говорю, 34000 объектов вот тестировал.
Пиши уже "обычный код" как "в других программах", посмотри исходник который я для тебя с нуля закодил за 15 минут; главное чтоб ты решал задачу, а не околачивался вокруг да около. По-моему уже всё что можно перемололи в этой дискуссии.
Примерный аналог SendMessage это:
http://docs.yoyogames.com/source/dadiospice/002_reference/objects%20and%20instances/objects/generating%20events/event_perform_object.html
Тут это называется скриптами - это куски кода который можно вызывать сколько угодно раз из других кусков кода.
Порядок отрисовки и всех команд лучше контролируется вручную, чем случайно хаотично раскиданными объектами по уровню, ибо хз какая функция будет работать раньше другой. В Tic-80 мне так было легко сделать меню паузы и другие вещи, в отличии от Unity.
Просто не надо брать движки где объекты "хаотично раскиданы". В этом смысле ГМ такой же как TIC-80.
Может мы не совсем друг-друга поняли.
Я просто имел ввиду, что в Tic80, можно одним махом прекратить отрисовывать объекты,
например у комнаты прекратить отрисовывать объекты, но продолжать обновлять её.
А в юнити пришлось бы много костылей ставить, к примеру пройтись по всем объектам и отключить рендеринг.
Вот к примеру как я бы поступил создавая Mount n Blade в Tic80, то есть игру с глобальной картой по которой ходят враги, и когда встречаешь их, то мы бы переместились бы в локацию, и карта бы осталась не тронутой,
просто бы не отрисовывалась в текущий момент, но возможные события бы там происходили бы,
если нам нужен был бы реалтайм на карте мира тоже, а в юнити пришлось бы намного сложнее продумывать такую систему, пришлось бы скрывать объекты или размещать их где-то ещё, чтоб не пересекались:
Отсюда также можно видеть насколько легко контролировать обновления, вначале обновляется карта мира (WorldMap), а потом только локация/комната (Room). В юнити пришлось бы больше думать над тем, как создать такую простую вещь. Там просто объекты лежат на уровне как попало, и ты не уверен что первое из них обновится, в гейм мейкере тоже лежат объекты на уровне, и не совсем понятно как они будут обновляться, в каком порядке.
Честно говоря, никогда не приходилось контролировать обновления, хотя у нас в замке 216 комнат и каждая сохраняет, открыт ли в ней сундук, убиты ли враги, есть ли там артефакт, и так далее. Отсюда думается мне, что и клонировать Mount & Blade в 2D вполне реально без управления обновлениями. Если что-то не вычислено на текущем шаге, то можно просто подождать ещё один. Кроме того, в ГМе есть разные суб-кадры одного кадра:
https://kolenka.net/posts/tochnaya-proverka-korotkikh-intervalov-vremeni-v-game-maker
Цифрами 123 я обозначил доступные тебе моменты внутри одного кадра. Если одни юниты будут в Begin Step, а другим нужно опираться на вычисления первых, то ставь вторых в Normal Step. А если третьим нужно на вторых и/или первых, то ставь их в End Step. Решений, в общем, много. Пока что ни одну задачу, которую ты поставил, не было сложно решить в ГМе.
За картинку и статью лайкус
В GML это можно сделать в две строки:
Или в другие две строки, чтобы убрать растровую часть рендера, но оставить векторную:
Обратно соответственно true и 1.
Можно просто поставить все объекты в координаты за экраном (скажем, отнять от всех координат 100500 и они будут где-то далеко-далеко наверху слева), и они не будут отрисовываться (я имею в виду, даже тратить время на рендер в application_surface), потому что находятся за экраном; но будут работать, так как не теряют своих координат, масок коллизий, ивентов и кода. Просто стоят где-то там.
Но знаешь, я что-то очень сильно сомневаюсь, что в Mount & Blade объекты, находящиеся на далёких локациях, действительно существуют в памяти в виде таких же объектов, как на текущей локации. То есть, когда ты в одной крепости, в другой в это время (помимо рендера) не идёт просчёт реальных коллизий, не воспроизводятся звуки на громкости зависящей от расстояния до игрока, и самое трудоёмкое - не существует реалтаймового ИИ.
На это просто не хватило бы процессора, поэтому я практически уверен, что как только ты выходишь на глобальную карту, а тем более на другую локацию, все юниты, ландшафт и конструкции - преобразуются в простые числа в массивах и так и воюют с обновлением своей логики, скажем, раз в секунду, а не 60 раз в секунду.
А как опять включать? И как проверить что уже отключал, получается нужно больше проверок и переменных?!
Спасибо за пример с With, я так понял это внутри объекта работает и просит все объекты одного типа отключить или как? Пошёл гуглить про with, ибо пока-что для меня это какая-то новая команда в моей практике программирования, не помню аналогов в других языках.
visible=!visible переключает в 1 если сейчас 0, и переключает в 0 если сейчас 1.
Нет. with all отключает ВСЕ объекты всех типов. Если тебе нужно отключить отрисовку объекта врага, пишешь:
И ещё не стоит путать отключение отрисовки и отключение логики объекта. Чтобы отключить отрисовку вместе с логикой, нужно использовать функции активации/деактивации:
https://docs.yoyogames.com/source/dadiospice/002_reference/objects%20and%20instances/instances/deactivating%20instances/index.html
А потому что их и нет. Ближайший аналог в Юнити это вот этот монстр:
https://docs.unity3d.com/ScriptReference/Object.FindObjectsOfType.html
Который ещё и тормозит:
Note: This function is very slow. It is not recommended to use this function every frame. In most cases you can use the singleton pattern instead.
Жаль. Я просто в Unity с помощью SendMessage отправлял данные об уроне по врагу или любому объекту.
А как тут конкретное число урона отправлять ещё не знаю, но думаю с теми примерами что скачал сегодня, разберусь, может там есть примеры.
Давай сразу в корень проблемы - зачем отправлять число урона? Ты хочешь отнять хитпоинты - тогда просто отними их из одного объекта у другого объекта. Если там сложная формула - то пропиши скрипт который будет отнимать хитпоинты, броню, и прочие резистансы. А именно Message слать не обязательно.
самое простое в стандартном ивенте коллизии делать что-то вроде
other.hp--;
Спасибо! То что надо) Хорошо что тут не надо ещё дополнительные строки писать чтобы просто вначале получить доступ к скрипту как в юнити, а сразу обращаемся к переменной, люблю когда нужно меньше писать кода)
Ну в целом, я разобрался) Тут легче, чем в юнити получать доступ к переменным другого объекта