Среда, 13 Ноября 2024, 15:05

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Результаты поиска
useruserДата: Среда, 11 Октября 2017, 19:35 | Сообщение # 1 | Тема: Как работать с камерой?
был не раз
Сейчас нет на сайте
Есть хороший урок на русском с примерами как работать с камерой в плане изменения разрешения игры?
Стандартное изменение размера/разрешения экрана и пропорциональное изменение графики.

Желательно готовое решение т.к. оно одно.
На ютубе много уроков и много "воды", где объясняют как работает гмс, как пропорционально изменяется графика...но не приводят результат - решение.
useruserДата: Среда, 04 Октября 2017, 13:25 | Сообщение # 2 | Тема: Вопрос про image_speed
был не раз
Сейчас нет на сайте
С помощью image_speed мы можем задавать скорость анимации спрайта. Спрайт может состоять из нескольких картинок.
Зная fps игры, как рассчитать количество картинок в секунду?

Связаны (согласуются) ли как то значения fps, image_speed, кол-во картинок в спрайте?
Или в теории можно задать любые значения?
useruserДата: Вторник, 03 Октября 2017, 07:05 | Сообщение # 3 | Тема: Утечка памяти? (GMS2)
был не раз
Сейчас нет на сайте
maker-rus спасибо за ответы

Цитата maker-rus ()
Если верить документации, перед использованием этой функции Вы должны проверить существование поверхности

Да знаю, читал. Но на официальном форуме мне посоветовали писать так.

Цитата 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
useruserДата: Понедельник, 02 Октября 2017, 10:26 | Сообщение # 4 | Тема: Утечка памяти? (GMS2)
был не раз
Сейчас нет на сайте
Цитата maker-rus ()
Что за "нулевой объект", за которым нужно следить камере (выделил жирным)?

И правда.
object The object ID (or instance ID) for the camera view to follow (default is -1, no object).
Изменил на -1.
Код
camera_create_view(display_width_left, display_height_top, display_width,display_height, 0, -1, 0, 0, 0, 0);

Тот же результат.

Заметил, что ошибка происходит чаще при использовании графики.
Добавил простейший код меню с анимацией и начало чаще "вылетать" при запуске и завершении игры.
Если не переходить во вторую комнату - то вылетов нет. Разместил меню в первой комнате. Не вылетает.
Я думаю, что то не то с камерой.

Вот кстати весь проект
https://cloud.mail.ru/public/RxXf/cdXbapP2W


Сообщение отредактировал useruser - Понедельник, 02 Октября 2017, 10:43
useruserДата: Понедельник, 02 Октября 2017, 07:18 | Сообщение # 5 | Тема: Утечка памяти? (GMS2)
был не раз
Сейчас нет на сайте
Скорее всего в коде объекта присутствует ошибка, вызывающая утечку памяти.
Поможете её найти?


GMS2 v2.1.0.136, Win7x64.
Объект objects_special_camera_create_and_set Его задача - создание камеры и вида.
Объект не persistent. Он помещен в 2 комнаты (пока 2 комнаты в проекте, планирую помещать во все).
Если объект помещен в одну комнату - ошибки не возникало.
Если объект помещен в две комнаты и осуществляется переход из первой комнаты во вторую (goto_room) - возникает ошибка.

Ошибка появляется в 20% случаев как зависание при запуске игры. Темный экран приложения и зависание.
Ошибка появляется в 40% случаев как зависание при завершении игры. При нажатии на крестик-закрыть окно или выполнении кода game_end(); игра зависает.
Ошибка не появляется во время игры. Хотя игра пока - 2 комнаты и одно меню.

Windows error


GMS2 output


Код событий
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

view_camera[0] = camera_create_view(display_width_left, display_height_top, display_width,display_height, 0, 0, 0, 0, 0, 0);
view_set_xport(0, 0);
view_set_yport(0, 0);
view_set_wport(0, display_width);
view_set_hport(0, display_height);
view_visible[0] = true;
view_enabled = true;

//Отключаем и перерисовываем поверхность
application_surface_draw_enable(false);
//Изменяем поверхность в соответствии с настройками
surface_resize(application_surface, display_width, display_height);


Clean Up
Код

//Уничтожаем камеру
camera_destroy(view_camera[0]);


Post-Draw
Код

//Объект включает отображение поверхности
draw_surface_ext(application_surface, 0, 0, 0, 0, 0, 0, 0);
application_surface_draw_enable(true);


Сообщение отредактировал useruser - Понедельник, 02 Октября 2017, 07:21
useruserДата: Вторник, 26 Сентября 2017, 17:46 | Сообщение # 6 | Тема: Что такое Texture Groups?
был не раз
Сейчас нет на сайте
ASH2 Спасибо.
useruserДата: Суббота, 23 Сентября 2017, 11:31 | Сообщение # 7 | Тема: Что такое Texture Groups?
был не раз
Сейчас нет на сайте
Собственно вот это.


В своей игре я хочу использовать большое количество картинок.
Картинки (спрайты) я могу подгружать к объектам на этапе разработки игры - используя GMS редактор. Но тогда они вроде будут прикомпилированы к экзешнику.
То есть много картинок так загружать очень плохо.

Картинки я могу загружать из кода
Код

//set position
main_logo.x=10;
main_logo.y=10;
//set sprite
main_logo.sprite_index=sprite_add("main_logo_spite.png", 1, 0, 0, 0, 0);
//set depth
main_logo.depth=-1;

Пока использую этот вариант. Но говорят, что это не рационально т.к. во первых большое число загрузок (когда картинок будет много), а главное - создание большого количества графических страниц.

Рекомендуют использовать Texture Groups.
Как их использовать? Ведь я могу их использовать только для прекомпилированной графики.
То есть мне сначала потребуется загрузить картинку в спрайт...
useruserДата: Пятница, 08 Сентября 2017, 11:05 | Сообщение # 8 | Тема: Как программно создать камеру и вид?
был не раз
Сейчас нет на сайте
На основе
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. Без углов наклона, привязки к объектам и т.д. Сделаем эту камеру по умолчанию.
Код

view_camera[0] = camera_create_view(768, 336, 1024, 768, 0, 0, 0, 0, 0, 0);
camera_set_default(0);

Итак - камера есть.
Компилируем-запускаем. Я вижу не то что хотел. А именно - всю комнату.
Похоже, что надо ещё создать Viewport и задать ему свойства.
Но нет функции viewport_create.

Как программно сделать то, что я делал с помощью настроек комнаты?
Как создать viewport?
useruserДата: Четверг, 07 Сентября 2017, 11:03 | Сообщение # 9 | Тема: Бэкграунд перекрывает логотип?
был не раз
Сейчас нет на сайте
Цитата USeR14 ()
Вот тестовый проект GMS с кодом загрузки и вывода изображений

Спасибо, но у меня GMS2.
Наверно остановлюсь на варианте 2 объекта.
useruserДата: Четверг, 07 Сентября 2017, 10:39 | Сообщение # 10 | Тема: Бэкграунд перекрывает логотип?
был не раз
Сейчас нет на сайте
Цитата Vuvk ()
тьфу ты, блин. Вот и твоя ошибка!

Я не думаю, что тут ошибка. С точки зрения программирования и даже GML ("язык" без явной типизации) ошибки нет.

Вот этот код будет работать и мы увидим 2 картинки - одну над другой, как и хотели.
Но тут 2 объекта - картинки. Я поместил 2 объекта в комнату.
А мне нужен 1 объект и свойство background. В идеале.

Код

var
image_sprite; //Общая переменная спрайта

//Логотип (объект logo_object помещён в комнату)
image_sprite = sprite_add("resources/images/common_images/logo.png", 1, 0, 0, 0, 0);
logo_object.sprite_index=image_sprite;

//Бэкграунд
image_sprite = sprite_add("resources/images/common_images/background_01.png", 1, 0, 0, 0, 0);
//Назначение бэкграундов комнатам
//authorization_room.sprite_index=image_sprite;
object1.sprite_index=image_sprite;

//УСТАНАВЛИВАЕМ ГЛУБИНУ - она нужна (узнали опытным путём)
object1.depth = 0;
logo_object.depth = -5;


Сообщение отредактировал useruser - Четверг, 07 Сентября 2017, 10:42
useruserДата: Четверг, 07 Сентября 2017, 10:18 | Сообщение # 11 | Тема: Бэкграунд перекрывает логотип?
был не раз
Сейчас нет на сайте
Цитата bodya_WM ()
создаешь новый объект, в событии Draw пишешь

Зачем? И какое отношение событие Draw для данного объекта будет иметь к спрайтам других объектов?
Более того, встает вопрос области видимости переменных.
Да и как и на каком этапе отрисовывать спрайты, когда у меня используется одна (общая) переменная под спрайт.
А я хотел весь этот код поместить в отдельный скрипт...

Пардон, но что-то тут не так. Такие финты ушами ради тривиальной задачи загрузки 2х картинок.
useruserДата: Четверг, 07 Сентября 2017, 09:43 | Сообщение # 12 | Тема: Бэкграунд перекрывает логотип?
был не раз
Сейчас нет на сайте
Цитата bodya_WM ()
useruser, в событии Draw?

Нет. Я не смог найти подходящий объект с таким событием.
useruserДата: Четверг, 07 Сентября 2017, 09:09 | Сообщение # 13 | Тема: Бэкграунд перекрывает логотип?
был не раз
Сейчас нет на сайте
Цитата bodya_WM ()
Как я уже сказал если глубины не осилил

Как их "осилить"? Пишу код - ничего не изменяется.

Код

//УСТАНАВЛИВАЕМ ГЛУБИНУ
authorization_room.depth=0; //ниже фон
logo_object.depth = -5; //выше лого


Цитата bodya_WM ()
DrawSprite(bg, 0, 0, 0);
DrawSprite(logo, 0, 0, 0, 0);

Функции DrawSprite нет.
И даже так
Код

draw_sprite(image_sprite, 0, 0, 0);

Ничего не изменяется.
useruserДата: Четверг, 07 Сентября 2017, 07:12 | Сообщение # 14 | Тема: Бэкграунд перекрывает логотип?
был не раз
Сейчас нет на сайте
Цитата USeR14 ()
useruser, даже не знаю, в чем причина. Где-то в проекте явно другой косяк.

В проекте ничего другого нет.

И вот этот код
Код

image_sprite = sprite_add("resources/images/common_images/background_01.png", 1, 0, 0, 400, 400);

сдвигает рисунок на 400 пикселей влево и вверх. То есть, если мне надо сдвинуть рисунок на 400 пикселей вправо, относительно нулевых координат комнаты, то мне надо писать -400.
Но в любом языке программирования, в любой IDE, фотошопе...где угодно координаты будут положительные.
А тут наоборот?

PS
Я сдвинул рисунок (фон-бэкграунд), а под ним ничего нет....


Сообщение отредактировал useruser - Четверг, 07 Сентября 2017, 07:12
useruserДата: Среда, 06 Сентября 2017, 14:49 | Сообщение # 15 | Тема: Бэкграунд перекрывает логотип?
был не раз
Сейчас нет на сайте
Цитата bodya_WM ()
useruser, какая глубина фона?

Я не знаю. Весь код выше.
Я пробовал делать по разному, вот так например
Код


//Скрипт загрузки основных картинок
//Загрузка изображений из секции Included Files (хранятся в папке datafiles)

var
image_sprite; //Общая переменная спрайта

//Логотип (объект logo_object помещён в комнату)
image_sprite = sprite_add("resources/images/common_images/logo.png", 1, 0, 0, 0, 0);
logo_object.sprite_index=image_sprite;

//Бэкграунд
image_sprite = sprite_add("resources/images/common_images/background_01.png", 1, 0, 0, 0, 0);
//Назначение бэкграундов комнатам
authorization_room.sprite_index=image_sprite;

//УСТАНАВЛИВАЕМ ГЛУБИНУ
authorization_room.depth=0; //ниже фон
logo_object.depth = -5; //выше лого

но так тоже видно только фон.

Цитата bodya_WM ()
DrawSprite(bg, 0, 0, 0);
DrawSprite(logo, 0, 0, 0, 0);

не ясно - что рисовать?
Код

draw_sprite(image_sprite, 0, 0, 0);

У меня 2 объекта - комната (если это объект) и логотип.
useruserДата: Среда, 06 Сентября 2017, 14:25 | Сообщение # 16 | Тема: Бэкграунд перекрывает логотип?
был не раз
Сейчас нет на сайте
Цитата bodya_WM ()
глубину логотипу например 2

И так тоже ничего не меняется.
useruserДата: Среда, 06 Сентября 2017, 14:07 | Сообщение # 17 | Тема: Бэкграунд перекрывает логотип?
был не раз
Сейчас нет на сайте
Цитата vampir0305 ()
logo_object.depth = -5

Не помогает.

И когда я меняю местами код - "//Логотип //Бэкграунд" выводится то, что идет последним.
Идет в конце код бэкграунда (как сейчас) - увидим бэкграунд.
А поменяем местами, чтобы сначала был код бэкграунда, а в конце был код логотипа и увидим только логотип.
useruserДата: Среда, 06 Сентября 2017, 13:44 | Сообщение # 18 | Тема: Бэкграунд перекрывает логотип?
был не раз
Сейчас нет на сайте
Я хочу загрузить бэкграунд комнате authorization_room. И сверху бэкграунда вывести логотип.
Код ниже.
Но я вижу только бэкграунд без логотипа.
И если закоментировать код бэкграунда - увидим логотип. Возможно, бэкграунд перекрывает логотип.
Как это исправить?

Код

//Скрипт загрузки основных картинок
//Загрузка изображений из секции Included Files (хранятся в папке datafiles)

var
image_sprite; //Общая переменная спрайта

//Логотип (объект logo_object помещён в комнату)
image_sprite = sprite_add("resources/images/common_images/logo.png", 1, 0, 0, 0, 0);
logo_object.sprite_index=image_sprite;

//Бэкграунд
image_sprite = sprite_add("resources/images/common_images/background_01.png", 1, 0, 0, 0, 0);
//Назначение бэкграундов комнатам
authorization_room.sprite_index=image_sprite;
useruserДата: Вторник, 05 Сентября 2017, 14:02 | Сообщение # 19 | Тема: Вопрос - Ответ (Game Maker)
был не раз
Сейчас нет на сайте
Цитата Yakutian_Boy ()

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
Синтаксис отсутствует как понятие.
useruserДата: Вторник, 05 Сентября 2017, 13:35 | Сообщение # 20 | Тема: Вопросы про разрешение экрана
был не раз
Сейчас нет на сайте
Недавно начал изучать тему создания игр и 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.
Значит нужно менять положение объектов, если это возможно. Т.е. производить расчет положения объекта относительно разрешения экрана.
Картинка всегда должна быть в правом нижнем углу? Значит её координата х = ширина экрана-ширина картинки.
Неужели нужен такой расчет?
---
Вот такие мысли.
  • Страница 1 из 1
  • 1
Поиск:

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