Есть хороший урок на русском с примерами как работать с камерой в плане изменения разрешения игры? Стандартное изменение размера/разрешения экрана и пропорциональное изменение графики.
Желательно готовое решение т.к. оно одно. На ютубе много уроков и много "воды", где объясняют как работает гмс, как пропорционально изменяется графика...но не приводят результат - решение.
С помощью image_speed мы можем задавать скорость анимации спрайта. Спрайт может состоять из нескольких картинок. Зная fps игры, как рассчитать количество картинок в секунду?
Связаны (согласуются) ли как то значения fps, image_speed, кол-во картинок в спрайте? Или в теории можно задать любые значения?
Если верить документации, перед использованием этой функции Вы должны проверить существование поверхности
Да знаю, читал. Но на официальном форуме мне посоветовали писать так.
Цитатаmaker-rus ()
Потому что на данный момент, непонятно с какой Вы поверхностью работаете.
application_surface - поверхность по умолчанию. Её не надо создавать. Она уже есть.
Анализируя ошибку вот что ещё вышло Возможно, ошибка связана с камерой, но.... В моёй игре у меня пока две комнаты. В каждой из которых есть камера. Вот код комнат.
Комната 1
Код
//Создаем глобальный массив с основными настройками (один раз только в первой комнате ) create_main_settings_array();
//Показываем логотип show_main_logo();
//Показываем бэкграунд show_main_background();
//Переходим в следующую комнату room_goto_next();
Комната 2
Код
//Показываем логотип show_main_logo();
//Показываем бэкграунд show_main_background();
//Показываем главное меню show_main_menu();
С таким кодом комнат часто возникает ошибка.
Первая комната будет использоваться позже. Т.е. я наполню её контентом потом. Пока комната 1 вызывает пару скриптов и сразу осуществляется переход в комнату 2. В комнате 2 меню.
Но если изменить код первой комнаты, убрать там
Код
//Переходим в следующую комнату room_goto_next();
и разместить в этой комнате таймер или объект для перехода в комнату 2, то ошибка появляться не будет. По крайней мере пока не появлялась.
Выходит, что быстрое выполнение кода в комнате 1 (наверно доли секунды) и почти мгновенный переход в комнату 2 вызывает ошибки?
Сообщение отредактировал useruser - Вторник, 03 Октября 2017, 07:07
Заметил, что ошибка происходит чаще при использовании графики. Добавил простейший код меню с анимацией и начало чаще "вылетать" при запуске и завершении игры. Если не переходить во вторую комнату - то вылетов нет. Разместил меню в первой комнате. Не вылетает. Я думаю, что то не то с камерой.
Вот кстати весь проект https://cloud.mail.ru/public/RxXf/cdXbapP2W
Сообщение отредактировал useruser - Понедельник, 02 Октября 2017, 10:43
Скорее всего в коде объекта присутствует ошибка, вызывающая утечку памяти. Поможете её найти?
GMS2 v2.1.0.136, Win7x64. Объект objects_special_camera_create_and_set Его задача - создание камеры и вида. Объект не persistent. Он помещен в 2 комнаты (пока 2 комнаты в проекте, планирую помещать во все). Если объект помещен в одну комнату - ошибки не возникало. Если объект помещен в две комнаты и осуществляется переход из первой комнаты во вторую (goto_room) - возникает ошибка.
Ошибка появляется в 20% случаев как зависание при запуске игры. Темный экран приложения и зависание. Ошибка появляется в 40% случаев как зависание при завершении игры. При нажатии на крестик-закрыть окно или выполнении кода game_end(); игра зависает. Ошибка не появляется во время игры. Хотя игра пока - 2 комнаты и одно меню.
Windows error
Signature of the problem: The name of the problem event: APPCRASH Application name: Runner.exe Application version: 99.99.99.99 Application timestamp: 59a526a1 Module name with error: Runner.exe The version of the module with an error: 99.99.99.99 Timestamp of the module with error: 59a526a1 Exception code: c0000005 Offset exception: 00071cb0 OS version: 6.1.7601.2.1.0.256.1 Language code: 1049 Additional Information 1: 0a9e Additional information 2: 0a9e372d3b4ad19135b953a78882e789 Additional Information 3: 0a9e Additional Information 4: 0a9e372d3b4ad19135b953a78882e789
Read the privacy statement on the Internet: http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0419
If the privacy statement on the Internet is not available, check out its local version: C: \ Windows \ system32 \ en-US \ erofflps.txt
GMS2 output
Saving project to: D:\Облако mail.ru\Личные папки\Евгений\Синхронизируемые файлы и папки\GameMaker Studio 2\My game\Проект\24\game\game.yyp "C:\ProgramData/GameMakerStudio2/Cache/runtimes\runtime-2.1.0.136/bin/Igor.exe" -options="C:\Users\User\AppData\Local\GameMakerStudio2\GMS2TEMP\build.bff" -- Windows Run
Loaded Macros from C:\Users\User\AppData\Roaming\GameMakerStudio2\Cache\GMS2CACHE\game_57A3FC7A\macros.json Options: C:\ProgramData/GameMakerStudio2/Cache/runtimes\runtime-2.1.0.136\bin\platform_setting_defaults.json Options: C:\Users\User\AppData\Roaming/GameMakerStudio2\2405384_1231723\local_settings.json Options: C:\Users\User\AppData\Roaming\GameMakerStudio2\Cache\GMS2CACHE\game_57A3FC7A\targetoptions.json C:\ProgramData/GameMakerStudio2/Cache/runtimes\runtime-2.1.0.136/bin/GMAssetCompiler.exe /c /zpex /mv=1 /iv=0 /rv=0 /bv=0 /j=4 /gn="game" /td="C:\Users\User\AppData\Local\GameMakerStudio2\GMS2TEMP" /cd="C:\Users\User\AppData\Roaming\GameMakerStudio2\Cache\GMS2CACHE\game_57A3FC7A" /zpuf="C:\Users\User\AppData\Roaming/GameMakerStudio2\2405384_1231723" /m=windows /tgt=64 /nodnd /cfg=default /o="C:\Users\User\AppData\Local\GameMakerStudio2\GMS2TEMP\game_79DFBCEC_VM" /sh=True /optionsini="C:\Users\User\AppData\Local\GameMakerStudio2\GMS2TEMP\game_79DFBCEC_VM\options.ini" /cvm /baseproject="C:\ProgramData/GameMakerStudio2/Cache/runtimes\runtime-2.1.0.136\BaseProject\BaseProject.yyp" "D:\Облако mail.ru\Личные папки\Евгений\Синхронизируемые файлы и папки\GameMaker Studio 2\My game\Проект\24\game\game.yyp" /preprocess="C:\Users\User\AppData\Roaming\GameMakerStudio2\Cache\GMS2CACHE\game_57A3FC7A" Reading project file....D:\Облако mail.ru\Личные папки\Евгений\Синхронизируемые файлы и папки\GameMaker Studio 2\My game\Проект\24\game Reading project file....C:\ProgramData\GameMakerStudio2\Cache\runtimes\runtime-2.1.0.136\BaseProject Reading config delta 'D:\Облако mail.ru\Личные папки\Евгений\Синхронизируемые файлы и папки\GameMaker Studio 2\My game\Проект\24\game\options\main\inherited\options_main.inherited.yy' finished.
C:\Windows\system32\cmd.exe DONE (0) DoSteam Igor complete. [Run] Run game Options: C:\Users\User\AppData\Roaming\GameMakerStudio2\Cache\GMS2CACHE\game_57A3FC7A\MainOptions.json C:\ProgramData/GameMakerStudio2/Cache/runtimes\runtime-2.1.0.136/windows/Runner.exe -game "C:\Users\User\AppData\Local\GameMakerStudio2\GMS2TEMP\game_79DFBCEC_VM\game.win" Attempting to set gamepadcount to 12 DirectX11: Using hardware device Total memory used = 104006085(0x063301c5) bytes
C:\ProgramData/GameMakerStudio2/Cache/runtimes\runtime-2.1.0.136/windows/Runner.exe exited with non-zero status (-1073741819) elapsed time 00:00:37.8991677s for command "C:\ProgramData/GameMakerStudio2/Cache/runtimes\runtime-2.1.0.136/bin/Igor.exe" -options="C:\Users\User\AppData\Local\GameMakerStudio2\GMS2TEMP\build.bff" -- Windows Run started at 09/27/2017 16:10:26 FAILED: Run Program Complete
Код событий Create
Код
//ОБЪЕКТ УСТАНАВЛИВАЕТ, НАСТРАИВАЕТ И УДАЛЯЕТ КАМЕРУ //Получаем ширину и высоту экрана пользователя display_width=display_get_width(); display_height=display_get_height(); //Позиция камеры (левый верхний угол) display_width_left=(2560-display_width)/2; //x display_height_top=(1440-display_height)/2; //y
//Отключаем и перерисовываем поверхность application_surface_draw_enable(false); //Изменяем поверхность в соответствии с настройками surface_resize(application_surface, display_width, display_height);
В своей игре я хочу использовать большое количество картинок. Картинки (спрайты) я могу подгружать к объектам на этапе разработки игры - используя GMS редактор. Но тогда они вроде будут прикомпилированы к экзешнику. То есть много картинок так загружать очень плохо.
Пока использую этот вариант. Но говорят, что это не рационально т.к. во первых большое число загрузок (когда картинок будет много), а главное - создание большого количества графических страниц.
Рекомендуют использовать Texture Groups. Как их использовать? Ведь я могу их использовать только для прекомпилированной графики. То есть мне сначала потребуется загрузить картинку в спрайт...
На основе http://docs2.yoyogames.com/index.html?page=source%2F_build%2F3_scripting%2F4_gml_reference%2Fcameras%20and%20display%2Fcameras%2Fcamera_set_view_pos.html
У меня есть комната 2560x1440. Я хочу видеть центр этой комнаты в окне игры 1024x768. Я могу это всё сделать в настройках комнаты-Viewports and Cameras. Рассчитаем центр (2560-1024)/2=768, (1440-768)/2=336. Свойства камерыe X Pos=768, Y Pos=336, Width=1024, Height=768. Свойства Viewport X Pos=0, Y Pos=0, Width=1024, Height=768. Компилируем-запускаем. Всё отлично выглядит. То, что я хотел.
Но всё это мне нужно сделать программно, из моего кода Создадим камеру с id=0 и свойствами X Pos=768, Y Pos=336, Width=1024, Height=768. Без углов наклона, привязки к объектам и т.д. Сделаем эту камеру по умолчанию.
Итак - камера есть. Компилируем-запускаем. Я вижу не то что хотел. А именно - всю комнату. Похоже, что надо ещё создать Viewport и задать ему свойства. Но нет функции viewport_create.
Как программно сделать то, что я делал с помощью настроек комнаты? Как создать viewport?
Я не думаю, что тут ошибка. С точки зрения программирования и даже GML ("язык" без явной типизации) ошибки нет.
Вот этот код будет работать и мы увидим 2 картинки - одну над другой, как и хотели. Но тут 2 объекта - картинки. Я поместил 2 объекта в комнату. А мне нужен 1 объект и свойство background. В идеале.
Зачем? И какое отношение событие Draw для данного объекта будет иметь к спрайтам других объектов? Более того, встает вопрос области видимости переменных. Да и как и на каком этапе отрисовывать спрайты, когда у меня используется одна (общая) переменная под спрайт. А я хотел весь этот код поместить в отдельный скрипт...
Пардон, но что-то тут не так. Такие финты ушами ради тривиальной задачи загрузки 2х картинок.
сдвигает рисунок на 400 пикселей влево и вверх. То есть, если мне надо сдвинуть рисунок на 400 пикселей вправо, относительно нулевых координат комнаты, то мне надо писать -400. Но в любом языке программирования, в любой IDE, фотошопе...где угодно координаты будут положительные. А тут наоборот?
PS Я сдвинул рисунок (фон-бэкграунд), а под ним ничего нет....
Сообщение отредактировал useruser - Четверг, 07 Сентября 2017, 07:12
И когда я меняю местами код - "//Логотип //Бэкграунд" выводится то, что идет последним. Идет в конце код бэкграунда (как сейчас) - увидим бэкграунд. А поменяем местами, чтобы сначала был код бэкграунда, а в конце был код логотипа и увидим только логотип.
Я хочу загрузить бэкграунд комнате authorization_room. И сверху бэкграунда вывести логотип. Код ниже. Но я вижу только бэкграунд без логотипа. И если закоментировать код бэкграунда - увидим логотип. Возможно, бэкграунд перекрывает логотип. Как это исправить?
Код
//Скрипт загрузки основных картинок //Загрузка изображений из секции Included Files (хранятся в папке datafiles)
if (sprite_index=SprLeft)(sprite_index=mSprLeft) { // if (sprite_index=SprRight)(sprite_index=mSprLeft) { // if (sprite_index=SprRight)(sprite_index=mSprLeft) { // if (sprite_index=SprUp)(sprite_index=mSprLeft) { // if (sprite_index=SprDown)(sprite_index=mSprLeft) { // }
Я новичек в ГМ, но знаю 2 языка и разбираюсь еще в нескольких )
Синтаксис условных операторов неверен, с точки зрения любого языка. Скорее всего так
Код
if (sprite_index=SprRight) {sprite_index=mSprLeft}; //Может и без скобок т.к. 1 команда.
Но и логика неверна. Вообще что то вроде этого
Код
if (sprite_index=SprLeft or sprite_index=SprRight or sprite_index=SprUp or sprite_index=SprDown) sprite_index=mSprLeft;
PS Стыд и позор GML Синтаксис отсутствует как понятие.
Недавно начал изучать тему создания игр и Game Maker Studio 2.0. Вопрос такой - как сделать игру под разные разрешения экрана? Планирую сделать игру в полноэкранном режиме. Посмотрел кучу видео по этой теме и так и не нашел ответа на свой вопрос. Может что то и не понял.
Все ниже моё представление о графике и ИМХО. Возможно и неверное. ------- Давайте разберем проблему разрешения экрана на примере игры - шахматы. Игрок видит всю доску и фигуры на доске. Т.е. всю комнату, говоря языком Game Maker Studio. Пусть мы нарисовали графику (растровая) для разрешения экрана 1024х768. Выглядит отлично. Что нам теперь важно, с точки зрения графики? Две вещи - положение графики (картинок объектов) и их пропорциональность.
То есть - если у пользователя разрешение экрана не 1024х768, а 800х600 (рассмотрим простой пример с соотношением сторон 1.3) то мы должны как то уменьшить всю нашу картинку. Доску, фигуры и т.д. И тут вопрос - как правильно это делать?
Хорошо, мы уменьшили нашу картинку. Пропорции и положение сохранено, но графика стала хуже. Уже не видно части линий и изгибов. Объективно - уменьшение растровой графики вызовет её ухудшение. Мы потеряем часть пикселей при уменьшении. А вот при пропорциональном увеличении произойдет дублирование пикселей (при равном соотношении сторон) и качество графики должно остаться прежним.
Несмотря на это мы видим, что в большинстве игр то же окно авторизации (как и другие объекты) намного больше на разрешении 800х600 и меньше на 1024х768. Т.е. окно не изменяет свой размер. Выходит окно имеет постоянный размер и только меняет позицию - всегда по центру экрана. Т.е. при запуске игры идет расчет положения объектов в зависимости от разрешения экрана? Например в игре Warcraft 3. При низком разрешении мы увидим большие здания, юнитов и немного карты вокруг. При высоком - мы увидим нормальные здания, юнитов и большой участок карты вокруг. Наверно на плазменной панели на пол стены мы увидим пол карты - если игра это позволяет.
Но вернёмся к нашей игре - шахматы. Мы хотим сделать наилучшую графику на всех разрешениях. Уменьшать - плохо. Как сделать хорошую графику на низком разрешении? В принципе мы можем изменить область камеры. Не показывать что за доской, а сфокусировать камеру на доске (viewport). Тогда будет не очень удобно - часть доски может быть не видна. Но цель мы достигнем.
А если нам нужно сделать хорошую графику на высоком разрешении? Мы можем увеличивать картинку или увеличивать область камеры. Если у нас за доской ещё что то есть. То есть если на 1024х768 доска занимала весь экран, то на 1920х1080, при увеличении области камеры, доска будет занимать уже пол экрана. А при увеличении картинки - графика будет пропорционально увеличена на весь экран.
Но не всегда разрешения экрана пропорциональны (1.3). Например 1024х768 (1.3) и 1366х768 (1.7). И тогда будет искажение графики либо черные полосы на экране. И как тут быть? На примере шахмат. Мы уже не можем пропорционально увеличить картинку. Не хватает ширины экрана. И тут мы получим черную полосу справа - около 342 пикселя. Но мы можем сделать огромную комнату, изменять области камеры. Но тогда будет около 342 пикселей справа. А при больших разрешениях - куча свободного места. Положение графики нарушено. То, что раньше было в правом углу теперь на 342 пикселя левее. Т.к. игра разрабатывалась под ширину экрана 1024, а у нас 1366. Значит нужно менять положение объектов, если это возможно. Т.е. производить расчет положения объекта относительно разрешения экрана. Картинка всегда должна быть в правом нижнем углу? Значит её координата х = ширина экрана-ширина картинки. Неужели нужен такой расчет? --- Вот такие мысли.