Инвентарь с количеством одинаковых предметов (для нового GUI)
Перейти к навигации
Перейти к поиску
init python:
# окно игры в центре экрана
import os
os.environ['SDL_VIDEO_CENTERED'] = '1'
# автоматическое объявление изображений
config.automatic_images_minimum_components = 1
config.automatic_images = [' ', '_', '/']
config.automatic_images_strip = ['images']
# размеры сетки с инвентарем настраиваются
inv_cols = 2
inv_rows = 3
# размеры иконок в инвентаре
side = 200
# ширина и высота инвентаря
inv_width = inv_cols * side
inv_height = inv_rows * side - 100
# чтобы листать вниз при добавлении предметов
yadjValue = float("inf")
yadj = ui.adjustment()
# найти индекс предмета с указанным id
def inv_geti(id):
for i in range(len(inventory)):
if inventory[i][0] == id:
return i
return -1
# изменение количества предметов в ячейке на plus единиц
# если не было, то будут созданы
# если количество < 1, то удалены вовсе
def iplus(id, plus=1, hint=None, about=None):
global inventory
# вернется эта переменная
res = ["", 0, "", ""]
# ищем индекс предмета с указанным id
i = inv_geti(id)
# если такой есть, то меняем количество
if i >= 0:
cnt = inventory[i][1]
if hint is None:
hint = inventory[i][2]
if about is None:
about = inventory[i][3]
# если plus равен None, то нужно удалить все элементы
if plus is None:
cnt = 0
# иначе добавить нужное количество (можно отрицательное)
else:
cnt += plus
# задаем успешно снятое/добавленное количество предметов
# предметы количеством < 1 удаляются из инвентаря
if cnt < 1:
inventory.pop(i)
# если количество положительное, то меняем его значение
else:
inventory[i] = [id, cnt, hint, about]
# иначе создаем новый предмет
else:
# если пустые поля, то что-то добавляем
if hint is None:
hint = _("Хреновина")
if about is None:
about = _("Нет описания")
# создание предмета работает лишь при положительном количестве
if not plus:
return res
elif plus > 0:
inventory.append([id, plus, hint, about])
# если добавляем новый предмет в конец списка, то стоит промотать список
yadj.value = yadjValue
res = [id, plus, hint, about]
# изменения на экран
renpy.restart_interaction()
# вручную сохраняем измененные данные инвентаря
# а то renpy сохраняет данные только при смене текста в текстбоксе
renpy.retain_after_load()
global inv_last
# на выходе количество убранных/добавленных или созданных предметов
inv_last = res
# возвращаем снятое/добавленное количество предметов
return res
# обработчик кликов,
# чтобы не пихать гору кода в action кнопок
def iclick(i):
# например, вызовем окно применения предмета
renpy.show_screen("scr_use", i)
renpy.restart_interaction()
# кнопка применения предмета
def accept(i):
# уменьшаем количество предметов на 1
iplus(inventory[i][0], -1)
# пролистать в самый верх
def inv_scroll0():
yadj.value = 0
renpy.restart_interaction()
# превращаем функции в action
iClick = renpy.curry(iclick)
Accept = renpy.curry(accept)
InvScroll0 = renpy.curry(inv_scroll0)
init:
image inv_empty = Null(side, side)
# необязательное окно применения предмета
screen scr_use(i):
modal True
frame:
background "#100b"
align(.5, .5)
xminimum 500
has vbox:
xalign .5
text " "
add inventory[i][0] xalign .5
text inventory[i][2] xalign .5 color "#ffb"
text inventory[i][3] xalign .5 color "#fff"
text " "
hbox:
xminimum 500
textbutton _("Применить") xalign .5 xminimum 150 action [Hide("scr_use"), Accept(i)]
textbutton _("Отмена") xalign .5 xminimum 150 action Hide("scr_use")
text " "
# сам экран инвентаря
screen scr_inventory:
on "show" action InvScroll0()
# zorder 111
default tt = Tooltip(" ")
frame:
xmargin 0 ymargin 0
xpadding 0 ypadding 0
align (.95, .05)
background "#0018" # фон инвентаря
xmaximum inv_width xminimum inv_width
vbox:
text _("Инвентарь") xalign .5 color "#fff" xmaximum inv_width xminimum inv_width
viewport id "box":
minimum (inv_width , inv_height)
maximum (inv_width, inv_height)
mousewheel True
draggable True
pagekeys True
yadjustment yadj
# заполняем ячейки
vbox:
for y in range(int((len(inventory) + 1) / (inv_cols))):
hbox:
for x in range(inv_rows - 1):
# индекс ячейки
$ i = x + y * inv_cols
# если не за грницами списка предметов
if i < len(inventory):
button:
xmargin 0 ymargin 0
xpadding 0 ypadding 0
# кликабельны только очертания предмета, не пустота
focus_mask True
# размеры предмета
minimum (side, side)
maximum (side, side)
background inventory[i][0] # картинка предмета
hovered tt.Action(inventory[i][2])
action iClick(i) # действе по клику
# количество
$ cnt = inventory[i][1]
if cnt > 1:
text "x" + str(cnt) align(1.0, 1.0) color "#ffb"
else:
# пустые ячейки
add "inv_empty"
text tt.value xalign .5 color "#ffb" xmaximum inv_width xminimum inv_width
label start:
# если сначала объявить переменную прямо в скрипте,
# то renpy будет сам сохранять ее содержимое
$ inventory = []
# список для хранения последнего использованного предмета
$ inv_last = ["", 0, "", ""]
# заполним инвентарь всеми доступными пузырьками в 1 экземпляре
$ i = 0
while i < 9:
# вторым параметром можно указать стартовое количество хреновин
# третьим - подсказку, появляющуюся при наведении курсора
# а можно ничего не указывать, только имя картинки - 1й параметр
$ i += 1
$ iplus('pot' + str(i), 1, "Хреновина №" + str(i))
scene bg
# покажем экран инвентаря
show screen scr_inventory
with dissolve
"Можно кликнуть по хреновинам в инвентаре."
# пример изменения инвентаря из скрипта
# iplus(спрайт, количество, подсказка, описание)
$ iplus('pot4', 2, "Хреновина №4")
# смотрим в inv_last, что было добавлено в последний раз
# [id, количество, название, описание]
$ id, cnt, hint, about = inv_last
"{image=[id]} Добавлено ещё [hint], [cnt] штук."
return
- Ссылка на архив с проектом: test_inventory_slots.zip
- Источник: Renpy для чайников: Инвентарь с количеством одинаковых предметов (для нового GUI)
На главную страницу | Книга рецептов Энциклопедии Ren'Py | Renpy для чайников | Вернуться к началу статьи |