Game Maker - создание игр | HellRoom Games
Январь 16, 2025, 08:11:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Автоматическая загрузка спрайтов из папки  (Прочитано 20263 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dva_Kota
Гл. Администратор
*

Репутация: 636
Offline Offline

Пол: Мужской
Награды:
3000 сообщений!За постоянность! [500 дней на форуме]За лояльность! [+500 репутации]Настоящий игродел!Тру Админ :D1 место за игру: Energy Wars (Конкурс Золотые Руки)...
API: GameMaker Studio Standard
Сообщений: 3245



« : Апрель 19, 2011, 17:16:19 »

Автоматическая загрузка спрайтов из папки и автоматическое назначение этих спрайтов объектам.
(дополнение к статье "Добавление ресурсов (Спрайтов, звуков, тайлов, бэкграундов) из папок").

Суть этого способа в следующем:

Первый вариант (с помощью переменных). Пример load_sprites_variable)

1. Спрайты делятся на две категории:
  1.1. спрайты которые назначаются объектам в самом начале;
  1.2. остальные спрайты, которые используются в процессе игры.

2. Для этого спрайты размещаем в двух папках (в примере это data\sprites – спрайты по умолчанию для объектов; data\other_sprites – остальные спрайты).

3. В игру спрайты спрайты из обоих папок загружаем одним и тем же кодом, только в первом случае сразу назначаем их объектам. Здесь есть особенности:
  3.1. Имена спрайтов должны быть такими же как имена объектов, которым мы их будем назначать, только без obj в начале (например объект называется obj_01, а спрайт для него будет называться _01.png)
  3.2. В коде индексы загруженных спрайтов будут записаны в переменные spr+имя_файла_без_расширения (например спрайт _01.png в игре будет называться spr_01)
  3.3. Писать просто spr_01 будет не достаточно, т.к. это переменная, находящаяся в объекте obj_load_sprites. Для использования этого спрайта в коде нужно писать obj_load_sprites.spr_01 (например sprite_index=obj_load_sprites.spr_01).

4. Вот код для загрузки спрайтов и назначения их объектам:

В примере объект загрузчик obj_load_sprites и три объекта для теста спрайтов. Левой кнопкой мыши можно менять спрайт объекта obj_01.




Второй вариант (с помощью ds_map). Пример load_sprites_ds_map.

Пункты 13.1 точно такие же
  3.2. хранить индексы спрайтов не в переменных, а в ds_map (спасибо TGA). Выглядит почти так: создаем глобальную переменную spr_all (это будет id для ds_map), создаем ds_map и записываем id в эту переменную.
  3.3. Все остальное аналогично, только индексы спрайтов будем записывать не в переменные а в ds_map при помощи функции ds_map_add() и они будут соответствовать ключам spr+имя_файла_без_расширения (например спрайт _01.png в игре будет соответствовать ключу spr_01)
  3.4. Для обращения к загруженному спрсйту нужно будет писать sprite_index=ds_map_find_value(spr_all,' spr+имя_файла_без_расширения расширения ')
Например для назначения объекту спрайта _01.png нужно будет писать:
sprite_index=ds_map_find_value(spr_all,'spr_01')

4.  Вот код для загрузки спрайтов и назначения их объектам:





Третий вариант (с помощью ds_map). Спрайты назначаются функцией object_set_sprite(). Пример load_sprites_ds_map_2.

Этот способ такой же как второй, только здесь спрайты назначаются объектам при помощи функции object_set_sprite(). Таким образом спрайты назначаются не экземплярам при создании а объектам (т.е. теперь можно узнать индекс спрайта, назначенного объекту, даже если в комнате нет ни одного экземпляра этого объекта при помощи функции object_get_sprite().


Аналогично можно загружать и другие ресурсы.

Автор Dva_Kota
Спасибо за помощь FanTom, DeatHSoul (в теме "Переменные"), TGA

* load_sprites_18_08_11.rar (45.81 Кб - загружено 980 раз.)
« Последнее редактирование: Август 19, 2011, 11:27:34 от Dva_Kota » Записан

Vendet
Гл. Администратор
*

Репутация: 772
Offline Offline

Пол: Мужской
API: Unity 3D
Сообщений: 3949


HellRoom Games


WWW
« Ответ #1 : Апрель 19, 2011, 18:52:25 »

Ого круто, полезная статья, надеюсь кому нибудь пригодится 
Записан
TGA
Пользователь
***

Репутация: 14
Offline Offline

Пол: Мужской
API: 8.0 Pro
Сообщений: 65


« Ответ #2 : Апрель 19, 2011, 21:00:10 »

Алсо, всё тоже самое можно делать без объекта с кучей локальных переменных - через ds_map.
И сразу отвечаю на возможный вопрос: гм очень быстро работает со своими дата-структурами.

Я, например, в последнее время пользуюсь следующей схемой:
-Создаём глобалку;
-Создаём и заносим в неё ds_map;
-Пишем простой скрипт, задача которого в следующем:
--При вызове, скрипту передаётся название ресурса(это можно проделать не только со спрайтами, но и со звуками)
--Сперва ищем этот ресурс в дс_мапе - если находим, возвращаем его; если нет: ищем в папке и если он есть - загружаем его, добавляем в дата-структуру(ключ=имя реса) и возвращаем; если же его нет и в папке - возвращаем какой-нить default_sprite с жирным красным вопросом(для большей крутости, можно искать сразу по нескольким разрешениям: например, сперва ищем файл с нашим именем с расширением bmp - если нет, то с png и т .п.).
-В креате объекта пишем что-то вроде "sprite_index=get_sprite('eee')".

Профит такого способа, собственно, в том, что ресурсы загружаются в процессе игры и только те, которые реально будут использоваться в данный момент игры.
+можно легко перебрать все ключи мапы и выгрузить соответствующие им ресы.
Записан
Dva_Kota
Гл. Администратор
*

Репутация: 636
Offline Offline

Пол: Мужской
Награды:
3000 сообщений!За постоянность! [500 дней на форуме]За лояльность! [+500 репутации]Настоящий игродел!Тру Админ :D1 место за игру: Energy Wars (Конкурс Золотые Руки)...
API: GameMaker Studio Standard
Сообщений: 3245



« Ответ #3 : Апрель 20, 2011, 00:43:25 »

Примерно так (добавил еще один вариант кода c ds_map переменных)?

Загрузку делаю сразу, т.к. загрузка ресурсов в процессе игры подтормаживает (на слабых компах), и если ресурсов не на 100 МБ, то лучше, я думаю, загрузить их сразу.

-В креате объекта пишем что-то вроде "sprite_index=get_sprite('eee')".
У меня основная идея заключается в том, чтобы не писать в Create у каждого объекта "sprite_index=...", но я только сейчас заметил что спрайты я назначаю только тем объектам которые уже есть в комнате... Мда....
завтра исправлю, сегодня уже поздно...  object_event_add() нужно добавлять "sprite_index=..." для объектов, а не через with.
Записан

TGA
Пользователь
***

Репутация: 14
Offline Offline

Пол: Мужской
API: 8.0 Pro
Сообщений: 65


« Ответ #4 : Апрель 20, 2011, 16:01:00 »

Цитировать
Примерно так (добавил еще один вариант кода c ds_map переменных)?
Ну да, можно так.
Цитировать
Загрузку делаю сразу, т.к. загрузка ресурсов в процессе игры подтормаживает (на слабых компах), и если ресурсов не на 100 МБ, то лучше, я думаю, загрузить их сразу.
Если ресурсы не большие - нормально.

Цитировать
что спрайты я назначаю только тем объектам которые уже есть в комнате... Мда....
завтра исправлю, сегодня уже поздно...  object_event_add() нужно добавлять "sprite_index=..." для объектов, а не через with.
Да не надо парится с событиями. Лучше сделай сперва загрузку ресов, а потом назначай их через Create. У тебя же задача какая: сделать загрузку и ресов и удобное обращение к ним. Их использование(назначение тех же спрайтов объектам) не столь важно(/сложно).
Записан
Dva_Kota
Гл. Администратор
*

Репутация: 636
Offline Offline

Пол: Мужской
Награды:
3000 сообщений!За постоянность! [500 дней на форуме]За лояльность! [+500 репутации]Настоящий игродел!Тру Админ :D1 место за игру: Energy Wars (Конкурс Золотые Руки)...
API: GameMaker Studio Standard
Сообщений: 3245



« Ответ #5 : Апрель 20, 2011, 16:10:16 »

Удобное обращение к ресурсом сделано давно. А назначать автоматически ресурсы, не прописывая их каждому объекту в Create хочу сделать для таких случаев.

Добавлено: Апрель 21, 2011, 00:02:25
Переписал статью и заменил пример. Теперь спрайты автоматически назначаются объектам, не нужно в каждом объекте писать "sprite_index=...", ГМ сам определит какому объекту какой спрайт назначать. ;D

Еще раз спасибо, FanTom и DeatHSoul.

Добавлено: Август 25, 2011, 15:59:38
Добавил в первый пост третий вариант, самый лучшей, на мой взгляд и обновил пример.
Вчера выяснилось что при назначении объектам спрайтов через переменную sprite_index узнать какой спрайт был назначен объекту можно только если объект присутствует в комнате. Это не всегда удобно. Способ почти не отличается от второго, но код немного короче.

Добавлено: Август 25, 2011, 16:02:48
Есть у этого способа недостаток: загрузка стрипов Смайлик с ладошкой (нужно ведь указывать количество кадров при загрузке, а у меня стоит 1 кадр всегда)

У меня уже есть идея как решить эту проблему: нужно к имени файла в конце (или в начале) дописывать двухзначным числом количество кадров, а при загрузке на основе этого числа задавать количество кадров. Позже, когда будет время, напишу код.
« Последнее редактирование: Август 25, 2011, 16:02:48 от Dva_Kota » Записан

dasmax
Участник
****

Репутация: 22
Offline Offline

Пол: Мужской
API: Game Maker 8.0 Pro
Деятельность: Gamedev
Сообщений: 107


« Ответ #6 : Август 25, 2011, 16:48:22 »

блин сложновато, хотя мне про загурзку ресурсов еще рано думать, Плюсег поставлю
Записан
Dva_Kota
Гл. Администратор
*

Репутация: 636
Offline Offline

Пол: Мужской
Награды:
3000 сообщений!За постоянность! [500 дней на форуме]За лояльность! [+500 репутации]Настоящий игродел!Тру Админ :D1 место за игру: Energy Wars (Конкурс Золотые Руки)...
API: GameMaker Studio Standard
Сообщений: 3245



« Ответ #7 : Август 25, 2011, 16:55:05 »

На самом деле ничего сложного. Код можно копировать практически без изменений (поменять нужно только путь к папке со спрайтами, если у Вас он другой).
Записан

Dgon
GM Pro user
*

Репутация: 40
Offline Offline

Пол: Мужской
Награды:
За постоянность! [50 дней на форуме]
API: Game Maker 8.0 Pro
Сообщений: 352

Boss


« Ответ #8 : Октябрь 29, 2011, 09:55:40 »

Dva_Kota, а как сделать загрузчик файлов, которые имеют какойнибудь иной формат? Просто, например, что бы обезопасить спрайты от правки.
Что бы их было не возможно открыть.
Записан
Dmi7ry
Гл. Администратор
*

Репутация: 1379
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #9 : Октябрь 29, 2011, 13:00:53 »

Можно использовать что-нибудь вроде Molebox
Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
Daisher
Пользователь
***

Репутация: 0
Offline Offline

Пол: Мужской
API: GameMaker Studio
Деятельность: PM
Сообщений: 54


« Ответ #10 : Октябрь 16, 2013, 12:20:50 »

Народ, помогите несчастному пользователю GMS.
В нем функция execute_string не работает, а на ней все завязано. Как это сделать другим способом?
На ГМ не могу перейти, мне надо html5 :(
Записан
AndrewVideoGames
Главный Модератор
*

Репутация: 821
Offline Offline

Пол: Мужской
Награды:
За постоянность! [500 дней на форуме]За лояльность! [+750 репутации]5000 сообщений!За помощь новичкам!
API: GameMaker Studio Pro
Деятельность: А я кто? А я руководитель!
Сообщений: 7316



« Ответ #11 : Октябрь 16, 2013, 15:15:54 »

Народ, помогите несчастному пользователю GMS.
В нем функция execute_string не работает, а на ней все завязано. Как это сделать другим способом?
На ГМ не могу перейти, мне надо html5 :(


 Как вы ее используете?

 Вот, если что, пример замены:
Код:
d=execute_string('return rm_lvl'+string(global.lvl));
room_goto(d);
в gms заменяется на:
Код:
d=asset_get_index('rm_lvl'+string(global.lvl));
room_goto(d);
Записан
Daisher
Пользователь
***

Репутация: 0
Offline Offline

Пол: Мужской
API: GameMaker Studio
Деятельность: PM
Сообщений: 54


« Ответ #12 : Октябрь 16, 2013, 15:24:21 »

Да, я уже  понял, что в каждом конкретном случае замена разная. Меня интересует, как ее заменить в третьем примере сверху.
Записан
AndrewVideoGames
Главный Модератор
*

Репутация: 821
Offline Offline

Пол: Мужской
Награды:
За постоянность! [500 дней на форуме]За лояльность! [+750 репутации]5000 сообщений!За помощь новичкам!
API: GameMaker Studio Pro
Деятельность: А я кто? А я руководитель!
Сообщений: 7316



« Ответ #13 : Октябрь 16, 2013, 15:26:12 »

 Daisher, скорее всего - никак.
Записан
Daisher
Пользователь
***

Репутация: 0
Offline Offline

Пол: Мужской
API: GameMaker Studio
Деятельность: PM
Сообщений: 54


« Ответ #14 : Октябрь 16, 2013, 18:36:57 »

Решил свою задачу добавление этого кода родителю всех объектов:


Можно назначать и на объект тоже, чтобы следующие с ним создавались, но мне это не надо:

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

HellRoom Games © 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
Страница сгенерирована за 0.174 секунд. Запросов: 34.