Игра «Поиск предметов» одной строкой

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





# Это мини-игра по поиску предметов
# сохранить этот код в файл game.rpy в корне игры

# Вызывается примерно так:

# $ InitGame("bg_room", 5.0, True, (735, 300), "figure1", (640, 226), "figure2", (288, 38), "figure3", (115, 260), "figure4")
# $ StartGame()

# где bg_room - имя файла фона без указания расширения .jpg
# 5.0 - количество секунд на выполнение поиска
# если <= 0, таймер отключен, взять можно лишь один предмет, он сохранится в oRes
# (735, 300), "figure1" - координаты и имя файла предмета
# без расширения .png
# предметов может быть сколько угодно
# все фоны и картинки предметов должны быть в папке images
# в oRes - истина или ложь (уложились в отведенное время или нет) - либо название предмета
# количество найденных предметов в переменной oLen
# общее количество предметов в переменной maxLen

# $ GameAsBG() # показывает экран с картинками в качестве фона, не кликабельного

# в папке sounds должен лежать звук «click.mp3»
# либо, если его нет, то нужно закомментировать строку:
# renpy.play("sounds/click.mp3", channel="sound")

init python:
    # окно по центру экрана
    import os
    os.environ['SDL_VIDEO_CENTERED'] = '1'
    # автоматическое объявление спрайтов
    config.automatic_images_minimum_components = 1
    config.automatic_images = [' ', '_', '/']
    config.automatic_images_strip = ["images"]
    oXY = []
    oN = []
    oLen = 0
    maxLen = 0
    oBg = ""
    oLast = -1
    oTime = 0.0
    oMaxTime = 5.0
    needTimer = False
    oActive = False
    oRes = False

    # Инициализация игры, размещение предметов на экране
    def InitGame(bg, time, *args):
        global oBg, oXY, oN, oLen, maxLen, oLast, oTime, oMaxTime, oActive, needTimer, oRes
        oXY = []
        oN = []
        oLen = 0
        oBg = bg
        oLast = -1
        oTime = time
        oMaxTime = time
        maxLen = 0
        oActive = True
        oRes = False
        if oTime > 0.0:
            needTimer = True
        for xy, obj_name in zip(args[0::2], args[1::2]):
            oXY.append(xy)
            oN.append(obj_name)
            maxLen += 1

    # Запуск игры
    def StartGame():
        global oActive
        oActive = True
        need = True
        while need:
            renpy.call_screen("game", _layer="master")
            need = oRes == False
            if needTimer and (oTime <= .0):
                need = False

    # Показать экран игры в виде неактивного фона
    # Уже найденные предметы не будут отображаться
    def GameAsBG():
        global oActive
        oActive = False
        renpy.show_screen("game", _layer="master")

    # Обработчик клика по предмету
    def o_click(i):
        global oLen, oRes
        if i >= 0:
            if oN[i]:
                temp = oN[i]
                oN[i] = ""
                oLen += 1
                renpy.play("sounds/click.mp3", channel="sound")
                renpy.restart_interaction()
                if needTimer:
                    if oLen >= maxLen:
                        oRes = True
                else:
                    oRes = temp
    oClick = renpy.curry(o_click)

# Собственно экран игры, запускать из функции StartGame()
screen game:
    modal True
    if oActive and needTimer:
        timer 0.01 repeat True action [SetVariable("oTime", oTime-.01), If(oTime <= .0, true=[Return()])]
    add oBg
    for i in range(0, len(oN)):
        if oN[i]:
            imagebutton:
                focus_mask True
                pos(oXY[i])
                idle oN[i]
                hover oN[i]
                # можно продублировать картинки предметов,
                # назвав их "images/имяпредмета_hover.png"
                # и высветить их в графическом редакторе
                # и заменить строку выше на строку ниже
                # тогда при наведении курсора, они будут подсвечиваться
                # hover oN[i] + " hover"
                if oActive:
                    action [oClick(i), Return()]
                else:
                    action []
    if oActive and needTimer:
        # if oTime > .1:
            # text "[oTime]" align(.1, .1) size 48
        # else:
            # text "0.0" align(.1, .1) size 48
        bar value StaticValue(oTime, oMaxTime):
            align(.5, .001)
            xmaximum 400
            ymaximum 20
            left_bar Frame("slider_left.png", 10, 10)
            right_bar Frame("slider_right.png", 10, 10)
            thumb None
            thumb_shadow None

Комментарии

  1. А можно ли, пользуясь этим кодом, сделать так, чтобы предметы подсвечивались при наведении? И как поменять стиль часиков?) Спасибо))

    ОтветитьУдалить
    Ответы
    1. можно заменить строку «hover "images/" + oN[i] + ".png"» на строку «hover "images/" + oN[i] + "_hover.png"»
      и все файлы картинок с предметами продублировать.
      например, если есть картинка «object1.png», то нужно добавить еще одну такую-же, но подсвеченную в графическом редакторе (того же размера!), и назвать ее «object1_hover.png»

      Удалить
    2. Спасибо! В отличии от других методов, ваш позволяет не загромождать код, а использовать один и тот же метод сколько угодно раз, с любыми материалами. Крайне полезный блог у вас. Спасибо еще раз!

      Удалить
    3. Вот вы написали, что нужна картинка того же размера. С чем это связано?

      Удалить
    4. если, например добавить свечение вокруг и для того, чтобы оно поместилось в кадр, добавить пустого места, то светящаяся картинка станет больше. но размещаться она будет по тем же координатам, а якорь привязан к левому верхнему углу. а значит, при наведении курсора предмет будет дрыгаться - визуально смещаться вправо и вниз. оно вам надо? делайте уж все предметы с запасом места вокруг для эффектов, чтобы размеры не менялись при наведении курсора. да что я объясняю, попробуйте добавить места вокруг любаякартинка_hover.png и посмотрите, что получится.

      Удалить
  2. Спасибо, всё развёрнуто и понятно.
    Есть такой вопрос... Вот игра началась и у меня есть на экране список предметов которые нужно найти, можно ли сделать так, чтобы при нахождении определённого предмета, он перечёркивался или исчезал в списке?

    ОтветитьУдалить

Отправить комментарий