Киви, непрозрачность вокруг мыши, открывающая картинку

#python #kivy

Вопрос:

Я хотел бы сделать головоломку, в которой кто-то должен пройти лабиринт и собрать буквы, которые нужно будет ввести позже в качестве ответа. (Не собирается программой, а просто запоминает, какие буквы передаются, и вводит их позже при выходе из лабиринта.)

 from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.config import Config

Config.set('graphics', 'width', '806')
Config.set('graphics', 'height', '706')

class Touch(Widget):
    def __init__(self, **kwargs):
        super(Touch, self).__init__(**kwargs)

    def on_touch_down(self, touch):
        pass

    def on_touch_down(self, touch):
        pass

    def on_touch_down(self, touch):
        pass
    
class MyGrid(GridLayout):
    pass
    
class DrawingWindow(App):
    def build(self):
        return MyGrid()

if __name__ == "__main__":
    DrawingWindow().run()
 
 <MyGrid>:
    
    GridLayout:
        cols:1
        size:1000,706

        canvas:
            
            Rectangle:
                size: 808,706
                source: 'Puzzle.png'
 

Я узнал, как нарисовать круг там, где находится ваша мышь (не добавленный в код, так как я думаю, что, вероятно, будет использоваться другой метод), но как сделать все вокруг определенного радиуса черным, чтобы он показывал только небольшой круг в пределах этого радиуса. Возможно, использование непрозрачности в радиусе-это решение проблемы. Если бы кто-нибудь мог подтолкнуть меня в правильном направлении, это было бы действительно полезно.

Это не обязательно должно оставаться раскрытым, скорее, не на самом деле. Надеюсь, это также несколько упростит задачу.

Надеюсь, я ясно изложил, в чем проблема. Заранее благодарю вас за потраченное время и усилия.

Комментарии:

1. Я думаю, что проще всего было бы использовать затемненный фон лабиринта, который всегда является первой обновленной частью представления, а затем нарисуйте освещенную мышь (с видимым фоном) в ее круге.

Ответ №1:

Для этого вы можете использовать инструкции по трафарету. Вот простой пример:

 from kivy.app import App
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.properties import NumericProperty, ListProperty
from kivy.uix.widget import Widget

kv = '''
RelativeLayout:
    ImageWithHole:
        id: hole
        canvas:
            StencilPush
            Ellipse:  # draw the hole
                pos: self.hole_pos[0] - self.radius, self.hole_pos[1] - self.radius
                size: self.radius*2, self.radius*2
            StencilUse
            Color:
                rgba: 1,1,1,1
            Rectangle:
                source: 'Puzzle.png'  # draw the maze
                pos: 0,0
                size: self.size
            StencilUnUse
            Ellipse:  # erase the hole (must be identical to original draw above)
                pos: self.hole_pos[0] - self.radius, self.hole_pos[1] - self.radius
                size: self.radius*2, self.radius*2
            StencilPop
'''


class ImageWithHole(Widget):
    radius = NumericProperty(50)
    hole_pos = ListProperty([400, 300])


class TestApp(App):
    def build(self):
        Window.bind(mouse_pos=self.on_motion)
        return Builder.load_string(kv)

    def on_motion(self, src, mouse_pos):
        hole = self.root.ids.hole
        hole.hole_pos = mouse_pos

TestApp().run()
 

Комментарии:

1. Чувак. Огромное спасибо. Ты потрясающая. Я делаю какую-то головоломку/комнату для побега для своей девушки, чтобы она получила свой подарок в веселой форме. Спасибо, брат.