По правде говоря двумя строками, специально разделил, чтобы можно было как фон использовать с учетом уже найденных предметов.
# Это мини-игра по поиску предметов # сохранить этот код в файл 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
А можно ли, пользуясь этим кодом, сделать так, чтобы предметы подсвечивались при наведении? И как поменять стиль часиков?) Спасибо))
ОтветитьУдалитьможно заменить строку «hover "images/" + oN[i] + ".png"» на строку «hover "images/" + oN[i] + "_hover.png"»
Удалитьи все файлы картинок с предметами продублировать.
например, если есть картинка «object1.png», то нужно добавить еще одну такую-же, но подсвеченную в графическом редакторе (того же размера!), и назвать ее «object1_hover.png»
Спасибо! В отличии от других методов, ваш позволяет не загромождать код, а использовать один и тот же метод сколько угодно раз, с любыми материалами. Крайне полезный блог у вас. Спасибо еще раз!
УдалитьВот вы написали, что нужна картинка того же размера. С чем это связано?
Удалитьесли, например добавить свечение вокруг и для того, чтобы оно поместилось в кадр, добавить пустого места, то светящаяся картинка станет больше. но размещаться она будет по тем же координатам, а якорь привязан к левому верхнему углу. а значит, при наведении курсора предмет будет дрыгаться - визуально смещаться вправо и вниз. оно вам надо? делайте уж все предметы с запасом места вокруг для эффектов, чтобы размеры не менялись при наведении курсора. да что я объясняю, попробуйте добавить места вокруг любаякартинка_hover.png и посмотрите, что получится.
УдалитьСпасибо, всё развёрнуто и понятно.
ОтветитьУдалитьЕсть такой вопрос... Вот игра началась и у меня есть на экране список предметов которые нужно найти, можно ли сделать так, чтобы при нахождении определённого предмета, он перечёркивался или исчезал в списке?
что делать если не работает пишет что что-то не так со строчками 72 102 107 108 109
ОтветитьУдалить