Перейти к содержимому
Открыть в приложении

Лучший способ просмотра. Узнать больше.

АнимеФорум

Полноэкранное приложение на домашнем экране с push-уведомлениями, значками и другими функциями.

Чтобы установить это приложение на iOS и iPados
  1. Нажмите на иконку «Поделиться» в Safari
  2. Прокрутите меню и нажмите Добавить на домашний экран.
  3. Нажмите Добавить в правом верхнем углу.
Чтобы установить это приложение на Android
  1. Нажмите на меню из трёх точек (⋮) в правом верхнем углу браузера.
  2. Нажмите Добавить на домашний экран или Установить приложение.
  3. Подтвердите, нажав Установить.

Визуальные новеллы своими руками.

Являясь не только анимешником, но и геймером, я большой любитель визуальных новелл. Видя их достаточно простое в большинстве случаев исполнение, я давно задумывался о возможности создания новелл своими руками. И вот недавно, бродя по просторам Сети, я наткнулся на движок визаульных новелл (), берущий большую часть технических трудностей этого процесса на себя, и к тому же очень простой в обращении. И теперь я хочу поделиться своим открытием со всеми.

Я взял на себя смелость и создал локализацию игрового интерфейса движка (файл template\localize.rpy) а также перевёл на русский демонстрацию. Всё это согласованно с создателем движка и включено в распространяемый архив, доступный с [url="http://www.renpy.org/wiki/renpy/rus" target="_blank" rel="nofollow">Русской Странички движка Ren'Py

Также я написал небольшое руководство по быстрому старту и маленькую игру-пример с некоторой информацией по визуальным новеллам по этому руководству, доступные там же

Спойлер
(не ждите ничего сверхъестественного. Сделана на скорую руку, только как пример. Приведённая в игре информация может быть предметом дискуссии. Если считаете, что она неточна -- милости прошу.)

 

От всей души надеюсь, что вас это заинтересует.

И помните, теперь судьба визуальных новелл на русском и в ваших руках!

 

ЗЫ. ОГРОМНАЯ просьба: протестируйте демо и файл локализации на предмет очепяток и отпишитесь сюда. Пожалуйста!

Отредактировано от Гость (см. историю изменений)

Цензуре - твёрдое и решительное "НЕТ"!!!

YesToFreedom.org

  • Ответы 1 тыс.
  • Просмотры 393,2 тыс.
  • Создано
  • Последний ответ

Лучшие авторы в этой теме

Самые популярные посты

  • Алекс__
    Алекс__

    Рен'пи ожидал конец строки, а обнаружил двоеточие... (должно быть просто <jump dush>) Двоеточие ставится в конце первой строки блока - оно показывает, что последующие строки этого блока должны и

  • Что ж, не думаю что это хорошо браться с середины, но надо же хоть как то начинать)) К концку недели ждите первый перевод... наверно по порядку, так что - ATL. Может кому пример подам ^_^   Кому инте

  • Вот файл немного доделанного (не полностью) перевода для новой версии Ren'Py 6.14.1 (Откуда взял первоначальный файл не помню. Может и с этого форума ) Скачать   Положить в <Ren'Py 6.14.1/launcher/

Опубликованные изображения

Рекомендуемые ответы

Такой вопрос — вот есть, предположим, класс:

class test:
   def __init__(self, name, strenght, agility):
       self.name = name
       self.str = strenght
       self.agi = agility

 

далее следующий код:

$Dima = test("Dima", 5, 2)
$Katya = test("Katya", 2, 5)

$Actors = [Dima, Katya]

 

и, теперь главное, функция сортировки (да-да, я знаю, что «пузырьки» отстой :lol: ) в зависимости от параметра для сравнения,

нечто в таком духе:

def bubble_sort (inlist, param):
   for i in range (0, len(inlist)-1):
       for j in range (0, len(inlist)-1-i):
           if inlist[j].param > inlist[j+1].param:
               inlist[j], inlist[j+1] = inlist[j+1], inlist[j]
   return inlist

 

ну и дальше нужен результат, примерно так:

$champions_str = bubble_sort(Actors, str)
$champions_agi = bubble_sort(Actors, agi)

 

Этот код не работает, т.к. не получается таким способом в функцию bubble_sort передать нужный параметр для сравнения (param).

Собственно, вопрос, как переработать функцию так, чтобы она понимала нужный параметр?

 

Есть, конечно, извращенный вариант:

def bubble_sort (inlist, param):
   if param == "str":
       for i in range (0, len(inlist)-1):
           for j in range (0, len(inlist)-1-i):
               if inlist[j].str > inlist[j+1].str:
                   inlist[j], inlist[j+1] = inlist[j+1], inlist[j]
       return inlist

и далее:

$champions_str = bubble_sort(Actors, "str")

,но это именно что извращение и дикие костыли. :unsure:

Отредактировано от Vielstern (см. историю изменений)

Питон - сортировка по ключу.

http://habrahabr.ru/post/138535/

http://habrahabr.ru/post/138625/

 

Для того чтобы не плодить лишнего кода можно использовать "безымянные функции" (lambda)

http://www.py-my.ru/post/4bfb3c691d41c846bc000030

Не закрывай рта тем кто открывает тебе глаза.

И твердо встав на ноги, не забывай тех, кто поднимал тебя на руках.

Спасибо! list.sort() — то, что надо. Видимо, плохо гуглил. С lambda тоже попробую разобраться. :)
  • 3 недель позже...

Хм, столкнулся тут то ли с багом (новой версии? Версия 6.18.2.729, если что) RenPy, то ли я в чем-то туплю (что тоже вполне может быть :D).

 

В общем, такой код:

init:
$ spisok = []

label start:
"bla-bla-bla"
"место, где мы сохраняемся"
"bla-bla-bla"	
$spisok.append("a")	
"место, где мы загружаемся на предыдущее сохранение"

 

сохраняемся до добавления элемента в список, после добавления загружаемся на это сохранение и видим... что элемент все равно уже добавлен.

 

При этом, если убрать объявление списка из init вот так:

 

label start:
$ spisok = []
"bla-bla-bla"
"место, где мы сохраняемся"
"bla-bla-bla"	
$spisok.append("a")	
"место, где мы загружаемся на предыдущее сохранение"

,то после загрузки получаем пустой список, как и должно быть. То же самое с remove и т.д.

 

А вот если прописать код вот так:

init:
$ spisok = []

label start:
"bla-bla-bla"
"место, где мы сохраняемся"
"bla-bla-bla"	
$spisok = ["a"]	
"место, где мы загружаемся на предыдущее сохранение"

, то после загрузки видим пустой список, несмотря на объявления списка в init.

 

В общем, вопрос — это баг и надо просто подождать, пока его исправят, или я что-то не понимаю, и так и должно быть?

Дело в том что при загрузке инит не исполняется.

В ините объявляются только константы.

Не закрывай рта тем кто открывает тебе глаза.

И твердо встав на ноги, не забывай тех, кто поднимал тебя на руках.

Доброго всем. Решил настругать для своего удовольствия новеллу. Ren`py вроде податлив но в то же время информации на русском недостаточно. А от обильного набивания головы туториалами по питону пучит в зрачках. У меня возникло несколько вопросов. Рассчитываю на вас.

По аналогии с накоплением очков за ответы, я сделал наличные. ( Например 1. Мама дай на интернет +200 2. Пап дай на кино +300 и тд тп)

Вопрос №1. Как например подобным образом реализовать оплату. Просто сменить + на -?

$ money +=100 #дали

$ money -=100 #отжали

Вопрос №2. Как вывести коинсы чтобы они всегда в процессе игры были перед глазами?

Вопрос №3. Если не ошибаюсь в игре можно сколько угодно копилок с баллами создавать лишь бы экрана хватало. И деньги и полоса отношений и здоровье... Можно

$ *** = "начальное значение" вынести в init а не писать после label start ибо такая кашица начинается.

Вопрос №4. Как осуществить автоматическое напоминание в игре если скажем для оплаты квартиры необходима определённая сумма которой у меня в данный момент нет. И как только я её насобираю, возможно игрок сам забудет что его ща выселят а игра сама напомнит "у вас достаточно денег для оплаты комнаты". Было бы идеально пустить уведомление бегущей строкой.

1. Да, так.

2. Можно сделать экран, который будет отображать значение переменной "деньги" (важно: в версии 6.9.3 экранов еще нет, они появились в версии 6.11)

screen money_scr:
   text "На кармане [money] деревянных." size 35 align (0.05, 0.05) 

label start:
   $ money = 0
   scene black
   show screen money_scr
   "Мама, дай на интернет"
   $ money +=200
   "Пасиба ^-^"
   "Надо оплатить и-нет..."
   $ money -=200
   "... а то танчики без меня уедут"

http://www.renpy.org...ml/screens.html

http://www.renpy.org...en_actions.html

 

3. а) количество переменных не ограничено, если есть желание показать огромное количество данных - можете поместить их внутрь вьюпорт'а - http://www.renpy.org...s.html#viewport,

б) значения переменным лучше всего присваивать в самом начале метки start - для их правильного сохранения - http://www.renpy.org...d_rollback.html

 

4. Попробуйте сделать экран, который в случае не оплаты комнаты будет показывать надпись о достаточности денег.

screen oplata_scr:
   textbutton "Оплатить" action If((oplata and (money>tax)), [setVariable("money", money-tax), SetVariable("oplata", False)], None) align (0.95, 0.05)
   text "На кармане [money] деревянных." size 35 align (0.05, 0.05) 
   if oplata:
       if money < tax:
           text "Пора платить, а денег не хватает..." size 35 align (0.05, 0.15)
       else:
           text "У вас достаточно денег для оплаты комнаты" size 35 align (0.05, 0.15)

label start:
   $ money = 0
   $ tax = 400
   $ oplata = False
   scene black
   show screen oplata_scr
   "А не пора ли платить за квартиру?"
   $ oplata = True
   "Ой, пора..."
   "Мама, дай на интернет"
   $ money +=200
   "Пап, дай на кино"
   $ money +=300
   "Пасиба ^-^"
   "???"

Бегущую строку и прочие эффекты сможете сделать при помощи ATL - http://www.renpy.org/doc/html/atl.html

2Алекс__ Всё вбагрил, всё радует. Первый метод мне подходит а второй(4) навёл на интересную мыслю. Спасибо
  • 4 недель позже...

Привет. Столкнулся с проблемой, когда у копий экземпляра класса меняются одновременно атрибуты по не очень понятному мне алгоритму.

Вот такой примерно код:

 

label start:

python:
   from copy import copy
   class test_cl:
       def __init__ (self, var, list):
           self.var = var
           self.list = list


$tester_base = test_cl(10, ["a", "b"])
$tester1 = copy(tester_base)
$tester2 = copy(tester_base)

$tester1.var -= 5
"1 этап. Всё в порядке, меняется значение только у tester1"
$tester1.list.append("x")
"2 этап. \"x\" добавляется и в tester1, и в tester2, и в tester_base"    
$tester1.list = ["x"]
"3 этап. меняется list только у tester1"

return

объясните, плз, почему на втором этапе происходит такое и как этого избежать.

Отредактировано от Vielstern (см. историю изменений)

Потому что остаются ссылки на старые структуры данных.

 

1) попробуй deepcopy

2) измени код:

import copy as cp
$tester1 = cp.copy(tester_base)

- хотя хз, мб это то же самое будет.

3) Сделай собственную функцию копирования которая гарантированно не оставляет ссылок на старые структуры данных (если у тебя классы небольшие то норм, почитай про атрибут __dict__ )

Не закрывай рта тем кто открывает тебе глаза.

И твердо встав на ноги, не забывай тех, кто поднимал тебя на руках.

Спасибо, deepcopy помогло. Второй вариант — то же самое, да. Третий не успел попробовать, но буду еще изучать. :)
  • 1 месяц позже...
Привет. Как можно сделать, чтобы viewport при каждом обновлении текста (или другого контента) в нем автоматически перематывался вниз до последней строчки?
  • 4 недель позже...
Добрый день. Столкнулся с проблемой использования $ renpy.movie_cutscene, а именно: видео идет, но оно исчезает при нажатии левой кнопки мыши. Можно ли как-нибудь заставить его идти, не реагируя на нажатия игрока? Как параметр interact=False в $ renpy.say, только для видео.

Привет всем.

Перелистал весь форум, но так и не нашел ответ на вопрос :с

Собсна, сам вопрос: можно ли менять картинку в главном меню в соответствии с реальным временем? Например, если в реальном времени (на компьютере/телефоне) показывает вечернее время, то картинка в главном меню одна; если дневное время, то другая?

post-256524-0-04128500-1421053255_thumb.png

 

С трудом, но удалось это сделать в самой игре (см. скрин).

Но всё так же не знаю, как это вставить в главное меню :(

Можно ли сделать, чтобы при первом запуске игры, перед splashscreen показывался экран (imagemap), предлагающий выбор режима отображения игры?

Если да, то как это правильно реализовать?

Можно ли сделать, чтобы при первом запуске игры, перед splashscreen показывался экран (imagemap), предлагающий выбор режима отображения игры?

Если да, то как это правильно реализовать?

Почему не сделать данный выбор частью splashscreen'а?

всем привет, делаю менюшку без фреймов, возникла следующая проблема.

сделал кнопки меню таким образом:

http://s7.hostingkartinok.com/uploads/images/2015/01/ea9b79e0448078a4bbdf50797d8e599a.jpg

vbox xalign .1 yalign .24:
           imagebutton:
               idle "Images/okno1.png"
               hover "Images/okno2.png"
               action Preference("display", "window")   	
               
vbox xalign .1 yalign .18:
           imagebutton:                  
               idle "Images/polniiekran1.png"
               hover "Images/polniiekran2.png"
               action Preference("display", "fullscreen")

они работают как должны, но если увести курсор с кнопки, она все равно визуально "не активирована" (видно на картинке выше).

мне просто надо поставить картинки "Images/okno2.png" или "Images/polniiekran2.png" поверх кнопки, после клика по ней. как это можно реализовать? чувствую что решение в 2 слова, но как ни бился, не получается.

если решить эту задачу то меню полностью готово. Спасибо

18413885_1203511827_bp.gif

Присоединяйтесь к обсуждению

Вы можете опубликовать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, войдите сейчас, чтобы публиковать с вашего аккаунта.
Примечание: Ваш пост требует одобрения модератора перед публикацией.

Гость
Ответить на эту тему...

Последние посетители 0

  • Ни одного зарегистрированного пользователя не просматривает данную страницу.

Важная информация

Аккаунт

Навигация

Поиск

Настроить push-уведомления в браузере

Chrome (Android)
  1. Нажмите на значок замка рядом с адресной строкой.
  2. Выберите Разрешения → Уведомления.
  3. Настройте предпочтения.
Chrome (Desktop)
  1. Нажмите на значок замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите пункт Уведомления и настройте параметры по своему усмотрению.