Упоротые уроки от Славы-сенсей. Тут планируется цикл "альтернативных" уроков по РенПи и иже с ним. Там, в соседнем треде, во всю рассказывают про простые, и жизненно необходимые вещи. Тут же будут всякие грязные приемчики чтобы прикрутить всякие свистелки-звенелки способами, за которые любой адекватный кодер вам пальчики пооткручивает. Слава-сенсей не имеет отношения к программированию, и является самым что ни на есть быдлокодером со всеми вытекающими последствиями. Читайте на свой страх и риск. Я Вас предупредило.
Урок 0: "Ложки нет. Пишем на голом питоне" РенПи связан с Питоном(питон = язык программирования Python) настолько сильно, что скорее всего и сам является ничем иным а его надстройкой\оболочкой. А значит - все что мы пишем стандартным РенПи кодом, можно написать и на питоне. Это существенно усложнит нам жизнь, но откроет дополнительные возможности, недоступные стандартными средствами.
Итак.
(примеры здесь и далее совершенно копипастонепригодны, они тут только для примера уж извините ^^)
Код
scene forest
show vasya
pause 2
hide vasya
show vasya at drunkfadeout
show petya at soberfadein
show pornotvlogo onlayer watermark
jump wastelands
вот так этот же код выглядит в питоне
Код
python:
````renpy.scene()
````renpy.show("forest")
````renpy.show("vasya")
````renpy.pause(2)
````renpy.hide("vasya")
````renpy.show("vasya",at_list=["drunkfadeout"])
````renpy.show("petya",at_list=["soberfadein"])
````renpy.show("pornotvlogo",layer="watermark")
````renpy.jump("wastelands")
````
Ужасно выглядит, не правда ли? с: Но обратите внимание теперь мы все обьявленные картинки вносим в кавычках как обычные строки текста. Теперь мы на их место можем поставить переменные, и оперировать ими как желаем.
Вот чоткий пример того, как это можно эксплуатировать. Вот кусочек кода из "облачи нястеньку". Его задача - выполнить перемещение игрока на локацию слева. выполняется каждый раз когда игрок перемещается меж локациями.
Код
label goleft(p_to,p_from=here,p_whoin="",p_whoout=with_who,nojump=False):
````python:
````````renpy.hide(p_from)
````````renpy.show(p_from,at_list=[toleft])
````````if p_whoout<>"":
````````````renpy.hide(p_whoout)
````````````renpy.show(p_whoout,at_list=[s_toright])
````````````with_who = ""
````````renpy.show(p_to, at_list=[fromright])
````````if p_whoin<>"":
````````````renpy.show(p_whoin,at_list=[s_fromleft])
````````renpy.pause(1)
````````renpy.scene()
````````renpy.show(p_to)
````````if p_whoin<>"":
````````````renpy.show(p_whoin,at_list=[top])
````````````with_who = p_whoin
````````here = p_to
````````if not nojump:
````````````renpy.jump("r_%s" %p_to)
````return
Теперь тоже самое только с построчными комментариями
Код
label goleft(p_to,p_from=here,p_whoin=r_who[p_to],p_whoout=with_who,nojump=False):
#назначаем закладку с уточняющими переменными. закладка "пойти налево"
#переменные p_to - локация куда идти, p_from - откуда(по умолчанию - отсюда)
# p_whoin,p_whoout (персонажи которые возможно находятся или в соседней локации или на экране сейчас)
# nojump - если True - перехода на обьявленую строчку не будет, выполнение кода продолжится со следующей строки.(обычно идет переход на строки с локации, куда герой переходит)
# все это будет использоватся вместо текста в кавычках показанного выше. пристегнитесь.
````python: # все отступленное после этой команды будет читатся как если перед ним добавлять $
````````renpy.hide(p_from)
````````# cбрасываем переходы задника который у нас сейчас уплывет направо
````````renpy.show(p_from,at_list=[toleft])
````````# вот он направо уплывает.
````````# toleft (и далее fromright, s_toright, s_fromleft) - это transform-ы обьявленые стандартными средствами
````````if p_whoout<>"": # если перед этим задником был персонаж
````````````renpy.hide(p_whoout)
````````````# сбрасываем переходы персонажа
````````````renpy.show(p_whoout,at_list=[s_toright])
````````````# персонаж уплывает направо.````
````````````with_who = ""
````````````# обьявляем, что перед нами персонажа больше нет
````````renpy.show(p_to, at_list=[fromright])
````````# задник соседней комнаты приплывает слева
````````if p_whoin<>"": # если на соседней локации кто-то есть
````````````renpy.show(p_whoin,at_list=[s_fromleft])
````````````# то пускай он тоже приплывет слева
````````renpy.pause(1)
````````# пауза необходимая чтобы все уплыли/приплыли
````````renpy.scene()
````````# сбрасываем все переходы всех спрайтов
````````renpy.show(p_to)
````````# показываем статичный задник новой комнаты
````````if p_whoin<>"": # а если там еще был и персонаж
````````````renpy.show(p_whoin,at_list=[top])
````````````# рисуем статично и его тоже
````````````with_who = p_whoin
````````````# и обьявляем что с нами теперь он
````````here = p_to # обьявляем, что мы теперь находимся в комнате что была слева.
````````if not nojump: # если мы этого не запретили...
````````````renpy.jump("r_%s" %p_to)
````````````# перепрыгиваем на закладку с локацией, куда мы переместились, от куда игра продолжится
````return # конец закладки.
Теперь эту махину можно многократно использовать с помощью команды:
````call goleft("куда")
````# и, если нужны дополнительные опции например
````# call goleft("куда", p_from = "ниоткуда", p_whoout = "нястенька", nojump = True)
вот фрагмент когда где оно вызывается
Код
label r_toyroom:
````call screen m_move(left = r_who["toyroom"] == "", right = r_who["toyroom"] == "", read = r_who["toyroom"] == "", talk = r_who["toyroom"] == "marina")
````$ r = _return
````if r == "left":
````````call goleft("kitchen") ####### ВОТ ТУТ
````elif r == "right":
````````if battle or not lv3_nyastya:
````````````call goright("dressroom")
````````else:
````````````call goright("library")
вот наглядно как это работает.
http://youtu.be/qRaXhk0ZVws?t=1m46s подозреваю, самая распространенная реакция будет "я ничего не понял!". Не расстраивайтесь. То что Вам сейчас нужно понять - это то, что питон может многое =3
Читайте мануалы, и да прибудет с вами сила! Вот наиболее релевантный.
http://www.renpy.org/doc/html/statement_equivalents.html
Комментарии к записи: 10
Вопрос: можно ли комбинировать Python- и RenPy-код? Например, у меня есть питоновская функция с renpy.scene() и кучей математики. И из неё хочу сделать вызов типа: "show PersName at left with dissolve: xalign 0.55 yalign 1.0"
И вопрос номер 2: почему goleft - именно label, а не function?
Не скорее всего а именно этим и является ))
>>можно ли комбинировать Python- и RenPy-код?
Можно, если представить команды ренпи как код (например не show, а renpy.show() ).
Label, screen... они все всё равно как функции работают, просто со специфичными настройками внутри движка.
Вы расскажите на пальцах, что нужно сделать, чтобы на питоне кодировать в ренпае?
пойду учить с++..