Создание квеста про котёнка на Ren'py.
Сразу оговорюсь, что создание квеста на этом движке - не такое-то уж и простое дело. Ну мне очень хотелось сделать игру про котёнка такой, чтобы она была похожа на квест, при этом у меня уже на тот момент было много наработок на Ren'py по этой игре (если кто не в курсе - это такой движок для визуальных новелл).
Так что было решено добавить туда элемент квеста с помощью графических карт. Этот способ я придумала не сама, отдельная благодарность Krism, за то, что подсказал его. Мне это очень помогло, возможно, кому-нибудь такой способ тоже пригодится.
Графическая карта (англ. image map) – это изображение с несколькими активными областями, то есть один рисунок содержит несколько участков. В зависимости от того в какую область картинки кликнет пользователь могут совершаться те или иные действия.
Пример того, как работает этот способ можно наблюдать на этом видео по моей игре
С чего начать.
Для того, чтобы сделать такую вот кликабельную картинку, нужно в первую очередь создать два изображения. Одно из них будет основным, а второе - как бы изнанкой. Оно будет проявляться только при наведении на него. Там мы можем сделать подписи, подсветку и прочее на ваше усмотрение. Например, у меня таким образом сделаны стрелочки. Наверное, вы обратили внимание, что когда на них наводишь, то появляется текст, куда это ведёт.
Вот, например, две картинки - основа и изнанка:
Первая картинка в игре называется "find begin.jpg", а вторая "find begin_map.jpg"
И теперь самое интересное, как это реализовано в скрипте:
# помечены комментарии-пояснения
label click:
# Все эти цифры в конструкции - координаты.
# Координаты хотспотов - невидимых активных зон -
# икс-игрек левой верхней точки прямоугольника,
# затем икс-игрек правой ниженй - всего 4 цифры.
# При наведении мыши на хотспот "просвечивает" второй фон,
# причем только та часть, которая ограничена координатами.
# Так можно сделать предметы, "оживающие" под курсором мыши.
# После координат задаем метку, на которую будем переходить по клику на хотспот.
# Координаты в пикселях удобнее смотрять прямо в фотошопе.
# Сначала получаем результат клика -
$ result = renpy.imagemap("find begin.jpg", "find begin_map.jpg", [
(0, 0, 112, 91, "help"),
(13, 274, 120, 346, "home"),
(643, 497, 765, 580, "karusel"),
(674, 275, 790, 357, "pravo"),
(650, 152, 740, 245, "river"),
(300, 283, 430, 409, "cat"),
(66, 116, 738, 126, "volga")
])
# Внимание - не теряй нужные закрывающие скобки!
# Теперь проверяем получившися результат и переходим -
if result == "home":
if yes:
play sound "begin5.mp3"
#"Скоро я уже буду дома! Вот она обрадуется!"
"I'll soon be home! She would be so happy!"
jump home
else:
play sound "begin6.mp3"
#"Пойду домой."
"Let's go home."
jump home
elif result == "pravo":
play sound "begin7.mp3"
#"Пойду вперед!"
"Let's go forward!"
jump img
elif result == "karusel":
play sound "begin8.mp3"
#"Пойду к каруселям."
"Let's go to the carousels."
jump attr
elif result == "river":
play sound "begin9.mp3"
#"Пойду к речке!"
"Let's go to the river."
$ wwerh = True
jump river
elif result == "cat":
if yes:
play sound "homeA.mp3"
#"В какую сторону домой?"
"Which way leads back to my home?"
else:
play sound "gdeIskat.mp3"
"Where should I search?"
#"Где же искать?"
jump click
elif result == "volga":
play sound "begin10.mp3"
#"Это река - Волга"
"This river is called the Volga."
jump click
elif result == "help":
call menuuu
jump click
Для отлавливания нужных областей можно использовать также пейнт. Ну, в любом случае основная сложность этого способа в том, что если областей много, то занятие вылавливания каждой точки весьма утомительно. Ну, ничего не поделаешь, нужно набраться терпения.
Для как каждой области задаем метку. Допустим, мы кликнули на область, огороженную х1=650, y1=152, x2=740,y2= 245, что соответствует метке "river".
В результате у нас подсвечивается область с подписью "к речке" из изображения find begin_map.jpg и будет выполняться часть скрипта, идущая после elif result == "river":
И так я для каждого варианта задала свою метку, а потом в зависимости от этого переходим в нужное место и там же совершаем нужное нам действие. В данном случае мы выводим текст на экран, а также озвучку, и переходим на другую локацию с речкой.
А если нажимаем на котёнка, то идёт фраза "Где же искать?" и возвращаемся к нашей первой метке click:, то есть на начало. И можем дальше сколько хочется кликать.
Заключение.
Эта игра про котёнка сейчас проходит гринлайт, и вы можете поддержать её по этой ссылке: http://steamcommunity.com/sharedfiles/filedetails/?id=865351...
Спасибо вам и приятных выходных!
Музыка в меню зависит от времени суток на RenPy
Картинка взята из ПокеСообщества, в виде примера как выглядит Меню в Визуальных Новеллах
init python:
# окно игры – в центр экрана
import os
os.environ['SDL_VIDEO_CENTERED'] = '1'
# функция переводит текущее время в название времени суток
import datetime
def get_t():
h = int(datetime.datetime.now().strftime("%H"))
res = "night" # по умолчанию ночь
# границы любого времени суток можно поменять
if (h > 6) and (h < 11):
res = "morning"
if (h >= 11) and (h <= 18):
res = "day"
if (h > 18) and (h < 23):
res = "evening"
return res
last_t = None
# функция меняет музыку и освещение в меню
# в зависимости от времени суток
def change_mus():
global last_t
if last_t != get_t():
last_t = get_t()
# перезапускаем отрисовку меню
renpy.restart_interaction()
# меняем мелодию в главном меню
config.main_menu_music = last_t + ".ogg"
if renpy.music.get_playing() != last_t + ".ogg":
renpy.music.play(last_t + ".ogg")
# функцию - в action
ChangeMus = renpy.curry(change_mus)
# картинка для фона главного меню
style.mm_root.background = "mm.jpg"
# в main_menu после style "mm_root":
# timer .05 repeat True action ChangeMus()
# if last_t:
# add last_t
init:
# фильтры для освещения
image morning = "#8404"
image day = "#0000"
image evening = "#0484"
image night = "#000b"
# Игра начинается здесь.
label start:
"Вы создали новую игру Ren'Py."
return
Собсна ссылка на архив: https://yadi.sk/d/TYQcSSMA38dTEo
Чтобы запустить нужно разархивировать содержимое test-timemusic.zip в папку с вашим проектом игры. Не советую скидывать содержимое в готовое или почти готовое, да и вообще, если вы хоть как-то изменили новую игру, то лучше не надо. Покопайтесь в коде.
Автор: Руслан Небыков. Страница:
Мини-игра жанра QTE (быстро нажимай нужные кнопки) на RenPy
Строите мод к Бесконечному сезону года или создаёте свою ВН на движке RenPy? Тогда вам безусловно понадобятся мини-игры для разбавления всяких текстов и картинок.
Код:
init python:
import string
# переменные (вручную не трогать)
qte_word = ""
next_k = ""
qteTime = .0
qteMaxTime = 5.0
abc = list(string.ascii_lowercase)
# инициализация игры при запуске экрана
# параметры передаются при вызове экрана игры
# если слово пустое, то генерируется рандомное длиной length
# time - время, отведенное на игру в секундах
def qte_init(word="", time=5.0, length=5):
global qte_word, next_k, qteMaxTime, qteTime
qteMaxTime = time
qteTime = time
qte_word = word.lower()
if word:
next_k = qte_word[0]
else:
for i in range(0, length):
qte_word = qte_word + renpy.random.choice(abc)
next_k = qte_word[0]
renpy.restart_interaction()
# нажатие очередной нужной кнопки, переходим к следующей
def next_key():
global qte_word, next_k
qte_word = qte_word[1:]
next_k = ""
if qte_word:
next_k = qte_word[0]
renpy.restart_interaction()
NextKey = renpy.curry(next_key)
qteInit = renpy.curry(qte_init)
# сам экран игры
screen scr_qte(word="", time=5.0, length=5):
# инициализация
on 'show' action qteInit(word, time, length)
modal True
if qte_word:
# уменьшаем время, отведенное на игру, и проверяем, не вышло ли оно - проигрыш
timer 0.01 repeat True action [SetVariable("qteTime", qteTime - .01), If(qteTime <= .0, true=Return(False))]
# отображаем, какую кнопку нужно нажать
text next_k.upper() align(.5, .5) size 96
# если что-то нужно нажать, то опрашивает клавиатуру
if len(next_k) == 1:
key next_k action NextKey()
else:
# все кнопки нажаты - победа
timer .1 action Return(True)
# шкала времени
bar value StaticValue(qteTime, qteMaxTime) align(.5, .1) xmaximum 600
Собсна ссылка на архив: https://yadi.sk/d/PfDAzZ6v3EgRw8
Чтобы запустить нужно разархивировать содержимое test-qte.zip в папку с вашим проектом игры. Не советую скидывать содержимое в готовое или почти готовое, да и вообще, если вы хоть как-то изменили новую игру, то лучше не надо.
Автор: Руслан Небыков. Страница:
Напомним: РенПи - это движок для визуальных новелл на основе Питона и Реная.
Сообщество Визуальных Новелл
Набирающий обороты новый жанр текстовых квестов. Сообщества по БЛ и Катава есть, но жанрового нет, а посты про ВН пишутся в Лиге Геймеров и Аниме сообществе. Новое сообщество будет сплавом геймдева с артами, исходниками, примерами и обзорами игр такого жанра от коллег из Азии и Запада.
Моих постов о данной тематике нет, скину посты других людей:
http://pikabu.ru/story/vnezapnoe_otkryitie_4861460
http://pikabu.ru/story/selphine_amp_ritona_4831466
http://pikabu.ru/story/eshchyo_odna_feyk_novella_4310868
http://pikabu.ru/story/vizualnaya_novella_po_komiksu_s_pikab...