Имитация стены Вконтакте VK
Перейти к навигации
Перейти к поиску
Имитация упрощённой ленты vk, можно ставить лайки и комментировать посты, не отрываясь от чтения новеллы. Лицензия: creative commons с указанием авторства.
# модуль vk.rpy имитирует упрощённую копию соцсети vk_
# цвета и картинки настраиваются, можно имитировать другую похожую соцсеть
# автор: 7DOTS лицензия: creative commons с указанием авторства
init python:
# автоматическое объявление изображений
config.automatic_images_minimum_components = 1
config.automatic_images = [' ', '_', '/']
config.automatic_images_strip = ["images"]
init -999 python:
# цвета фонов можно заменять на конструкции типа Frame("imagename", 0, 0)
# возможность комментирования по умолчанию включена
vk_can_comment = True
# шрифт поста и комментариев
vk_font = "fonts/Tahoma.ttf"
# полоса, имитирующая шапку соцсети
vk_header = "vk header"
# высота шапки
vk_headerheight = 60
# картинка для авы по умолчанию
vk_avadefault = "vk avadefault"
# маска для обрезания аватарок
vk_ava_mask = "vk avamask"
# размер стороны авы
vk_avasize = 72
# картинка для нажатого лайка
vk_likeon = "vk likeon"
# картинка для ненажатого лайка
vk_likeoff = "vk likeoff"
# суффикс для уменьшенных лайков
vk_zoom = "2"
# картинка для комментария
vk_comment = "vk comment"
# цвет имени пользователя в шапке
vk_usercolor = "#fff"
# цвет для текста заголовка
vk_nickcolor = "#175490"
# цвет для счетчика лайков и комментариев
vk_countcolor = "#96A0B4"
# цвет для счетчика лайков при нажатом лайке
vk_likecolor = "#CB272F"
# цвет текста
vk_textcolor = "#000"
# цвет экрана вне поста
vk_screencolor = "#EDEEF0"
# цвет экрана внутри поста
vk_postcolor = "#fff"
# ширина поста
vk_postwidth = 1080
# высота экрана
vk_screenheight = 840
# отступ от края поста до содержимого
# (1080 - 28 - 28 = 1024 - оптимальная ширина для картинки в посте)
vk_postpadding = 28
# отступ от аватарки до содержимого комментария
vk_commpadding = 14
# ава пользователя
vk_ava = vk_avadefault
# имя пользователя
vk_nickname = _("Анон Аноныч")
# кегль текста лайков
vk_likesize = 24
# кегль текста заголовков
vk_nicksize = 22
# кегль прочего текста
vk_textsize = 20
# список автозамены текста смайлов на их изображения
vk_smiles = {":)": "vk smile smile", ":(": "vk smile sad", "xD": "vk smile rofl", ":D": "vk smile rofl", "*up*": "vk smile up", "↑": "vk smile up"}
# класс для поста
class VKpost:
def __init__(self, nick=_("Анон Аноныч"), text="", ava=vk_avadefault, likes=0, user=False, comments=[]):
# аватарка, обрезанная по маске (по кругу)
self.ava = AlphaMask(ava, renpy.easy.displayable(vk_ava_mask))
self.nick = nick # имя автора
self.text = text # текст поста
self.likes = likes # лайки поста
self.comments = comments # комментарии (список экземпляров VKpost)
self.count = len(comments) # количество комментариев к этому посту
self.user = user # поставил ли пользователь лайк
# получить количество комментариев к этому посту
def get_com_count(self):
return len(self.comments)
# ставим/убираем лайк пользователя, если user == True
# или просто добавляем кучу левых лайков
def add_likes(self, count=1, user=True):
if user:
if self.user:
self.likes -= 1
else:
self.likes += 1
self.user = not self.user
else:
self.likes += count
# список постов в ленте
vk_posts = []
# установить аватарку пользователя
def vk_set_ava(ava):
global vk_ava
vk_ava = AlphaMask(ava, renpy.easy.displayable(vk_ava_mask))
# лайки к посту
def vk_post_add_like(i, count=1, user=True):
global vk_posts
if i >= 0 and i < len(vk_posts):
vk_posts[i].add_likes(count, user)
VKPostAddLike = renpy.curry(vk_post_add_like)
# лайки к комментарию
def vk_comm_add_like(i, ii, count=1, user=True):
global vk_posts
if i >= 0 and i < len(vk_posts):
if ii >= 0 and ii < len(vk_posts[i].comments):
vk_posts[i].comments[ii].add_likes(count, user)
VKCommAddLike = renpy.curry(vk_comm_add_like)
# обновить экраны
def repaint():
renpy.restart_interaction()
Repaint = renpy.curry(repaint)
# добавляем один пост (но можно и сразу список)
def vk_add_post(post=[]):
global vk_posts
if not isinstance(post, (list, tuple)):
post = [post]
for i in post:
vk_posts.append(i)
# для пролистывания
yadj.value = yadjValue
renpy.restart_interaction()
VKAddPost = renpy.curry(vk_add_post)
# добавить комментарий (или несколько в [списке])
def vk_add_comm(comm, index=0):
global vk_posts
if not isinstance(comm, list):
comm = [comm]
for i in comm:
# убираем пробелы вокруг текста
i.text = i.text.strip()
# убираем двойные пробелы
while i.text.find(" ") >= 0:
i.text = i.text.replace(" ", " ")
# заменяем смайлы на картинки смайлов
keys = vk_smiles.keys()
for k in keys:
i.text = i.text.replace(k, "{image=" + vk_smiles[k] + "}")
# добавляем комментарии
vk_posts[index].comments = vk_posts[index].comments + comm
# определить стиль (цвет) лайка
def vk_like_style(user):
if user:
return "vk_like_on"
return "vk_like_off"
# определить рисунок комментария
def vk_comm_text(comments):
count = len(comments)
text = "{image=" + vk_comment + "}"
if count > 0:
text = text + " " + str(count)
else:
text = text + " "
return text
# определить рисунок лайка
def vk_like_text(user, count=0, zoom=""):
text = "{image=" + vk_likeoff + zoom + "}"
if user:
text = "{image=" + vk_likeon + zoom + "}"
if count > 0:
text = text + " " + str(count)
else:
text = text + " "
return text
# пролистать в самый верх
def vk_scroll0():
yadj.value = 0
renpy.restart_interaction()
# чтобы листать вниз при добавлении постов
yadjValue = float("inf")
yadj = ui.adjustment()
# вызвать подпрограмму ввода комментария
def vk_input(i):
renpy.call_in_new_context("vkinput", i)
VKinput = renpy.curry(vk_input)
init 999:
# стиль для фрейма без отступов
style vk_empty is frame:
# без отступов
xpadding 0 ypadding 0
xmargin 0 ymargin 0
# по центру сверху
align (.5, .0)
# фон
background vk_screencolor
# стиль для экрана
style vk_screen is vk_empty:
# на весь экран
xminimum config.screen_width
xmaximum config.screen_width
# высота жестко задана
yminimum vk_screenheight ymaximum vk_screenheight
# по центру
align(.5, .0)
# фон
background vk_screencolor
# стиль для поста
style vk_post is vk_empty:
# ширина жестко задана
xminimum vk_postwidth
xmaximum vk_postwidth
# отступы от границы поста до содержимого
xpadding vk_postpadding
ypadding vk_postpadding
# оступы между постами (и комментариями)
ymargin vk_commpadding
# по центру
align(.5, .0)
# фон
background vk_postcolor
# стиль для полосы с лайками
style vk_likes is vk_empty:
# ширина жестко задана
xminimum vk_postwidth
xmaximum vk_postwidth
# отступы от границы поста до содержимого
xpadding 0 ypadding 0
# оступы по вертикали
ymargin vk_commpadding
# по центру
align(.5, .0)
# фон
background vk_postcolor
# стиль для комментария
style vk_comm is vk_empty:
# слева
xalign .0
# меньше отступов
ymargin 0
# фон
background None
# стиль для авытарок
style vk_avatar is vk_empty:
# слева по центру
align(.0, .0)
# размеры
xminimum vk_avasize xmaximum vk_avasize
yminimum vk_avasize ymaximum vk_avasize
# фон
background None
# стиль текста
style vk_text is text:
size vk_textsize
color vk_textcolor
font vk_font
# стиль текста заголовка/имени
style vk_nick is text:
size vk_nicksize
color vk_nickcolor
bold True
font vk_font
# экран соцсети
screen vk:
# экран
frame:
style "vk_screen"
vbox:
frame:
style "vk_empty"
yminimum vk_headerheight
ymaximum vk_headerheight
xfill True
# шапка
add vk_header align (.5, .0)
hbox:
xalign .8
spacing vk_commpadding
text vk_nickname style "vk_nick" color vk_usercolor yalign .5
add vk_ava:
zoom .75
yalign .5
# вьюпорт для пролистывания постов
viewport:
id "id vk"
xinitial 1.0
yfill False
xfill False
mousewheel True
draggable True
side_xfill False
transclude
yadjustment yadj
xalign .5
# все посты
vbox:
for i in range(len(vk_posts)):
# фон поста
frame:
style "vk_post"
vbox:
spacing vk_commpadding # отступ текста от авы
# заголовок поста
hbox:
spacing vk_postpadding # расстояние между авой и заголовком
# аватар автора
frame:
style "vk_avatar"
add vk_posts[i].ava
# имя автора
text vk_posts[i].nick style "vk_nick"
# текст поста
text vk_posts[i].text style "vk_text"
# лайки
frame:
style "vk_likes"
xpadding 0
hbox:
xalign .0
# лайки и количество
textbutton vk_like_text(vk_posts[i].user, vk_posts[i].likes):
action [VKPostAddLike(i), Repaint()]
style "vk_text"
if vk_posts[i].user:
text_color vk_likecolor
else:
text_color vk_countcolor
text_size vk_likesize
text_bold True
xminimum 96
yoffset 10
# количество комментариев
textbutton vk_comm_text(vk_posts[i].comments):
if vk_can_comment:
action VKinput(i)
else:
action []
style "vk_text"
text_color vk_countcolor
text_size vk_likesize
text_bold True
yoffset 10
xminimum 96
# комментарии
if len(vk_posts[i].comments) > 0:
# окно всех комментариев
frame:
style "vk_comm"
xpadding 0
vbox:
# перебираем комментарии
for ii in range(len(vk_posts[i].comments)):
# окно очередного комментария
frame:
style "vk_comm"
hbox:
spacing vk_commpadding
# аватар комментатора
frame:
style "vk_avatar"
add vk_posts[i].comments[ii].ava
vbox:
# имя комментатора
text vk_posts[i].comments[ii].nick style "vk_nick"
# текст комментария
text vk_posts[i].comments[ii].text style "vk_text"
# лайки комментария
frame:
style "vk_likes"
xpadding 0
hbox:
spacing vk_commpadding
xalign .8
# лайки и количество
textbutton vk_like_text(vk_posts[i].comments[ii].user, vk_posts[i].comments[ii].likes, vk_zoom):
action [VKCommAddLike(i, ii), Repaint()]
style "vk_text"
if vk_posts[i].comments[ii].user:
text_color vk_likecolor
else:
text_color vk_countcolor
text_size vk_likesize * 3 / 4
text_bold True
yoffset 10
# подпрограмма ввода комментария пользователем
label vkinput(post_index):
scene black
$ text = renpy.input(_("Введите текст комментария:"))
if text.strip():
$ vk_add_comm(VKpost(vk_nickname, text, vk_ava), post_index)
return
# ПРИМЕР ИСПОЛЬЗОВАНИЯ:
# на экране ленты кроме лайков работает и кнопка комментария рядом
label vk_test:
scene bg win
# добавить пост(ы)
python:
# аватарка пользователя
vk_set_ava("7dots")
# ник пользователя
vk_nickname = _("«7DOTS» визуальные новеллы")
# обнуляем все посты
vk_posts = []
# добавляем посты
vk_add_post(VKpost(vk_nickname, "Такая вот сентенция родилась при обсуждении кислотности рувн))\n\n{image=post}", vk_ava, 8))
# добавление комментария к посту номер 0
vk_add_comm(VKpost(_("Аноним Анонистыч"), "Твои игры - гавно!", vk_avadefault, 1), 0)
# добавление комментария к посту номер 0
vk_add_comm(VKpost("Вован Петров", "Ахахах xD", "ava vovan", 1, True), 0)
# добавление комментария к посту номер 0
vk_add_comm(VKpost(vk_nickname, "*up* И эти каменты подтверждают мои слова :)", vk_ava, 3), 0)
# перемотка в самый верх ленты
$ vk_scroll0()
# показать экран vk
show screen vk
with dissolve
# ждём клика мимо ленты
"Пример работы имитации упрощённой ленты «Вконтакте». Можно ставить лайки постам и комментариям. Так же имеется возможность оставлять комментарии, вводя их с клавиатуры."
return
- Ссылка на архив с проектом: test_vk.zip
- Источник: Renpy для чайников: Имитация стены Вконтакте VK
На главную страницу | Книга рецептов Энциклопедии Ren'Py | Renpy для чайников | Вернуться к началу статьи |