Как использовать столкновение виджетов для переключения экранов в kivy? - PullRequest
0 голосов
/ 16 апреля 2020

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

.py файл:

class Transit(Widget):

    def transit(self,circle):
        if self.collide_widget(circle):
            WindowManager.manager.current = "a1"
    pass

class Wall(Widget):

    def collision(self, circle):
        if circle.collide_widget(self):
            if circle.center_x > (self.pos[0] + self.size[0]) or circle.center_x < self.pos[0]:
                circle.velocity_x = -1 * circle.velocity_x
            elif circle.center_x > self.pos[0] and circle.center_x < (self.pos[0] + self.size[0]):
                circle.velocity_y = -1 * circle.velocity_y

class Circle(Widget):
    velocity_x = NumericProperty(0)
    velocity_y = NumericProperty(0)
    velocity = ReferenceListProperty(velocity_x, velocity_y)

    def move(self):
        self.pos = Vector(*self.velocity) + self.pos

class Move(Widget):

    circle = ObjectProperty(None)
    wall1 = ObjectProperty(None)
    wall2 = ObjectProperty(None)
    wall3 = ObjectProperty(None)
    wall4 = ObjectProperty(None)
    transit1 = ObjectProperty(None)


    def __init__(self, **kwargs):
        super(Move, self).__init__(**kwargs)
        self._keyboard = Window.request_keyboard(self._keyboard_closed, self)
        self._keyboard.bind(on_key_down = self._on_keyboard_down)
        Clock.schedule_interval(self.update, 0)

    def update(self, dt):
        self.circle.move()
        self.wall1.collision(self.circle)
        self.wall2.collision(self.circle)
        self.wall3.collision(self.circle)
        self.wall4.collision(self.circle)


        self.transit1.transit(self.circle)


    def _keyboard_closed(self):
        self._keyboard.unbind(on_key_down=self._on_keyboard_down)
        self._keyboard = None

    def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] == 'left':
            self.circle.velocity_x -= 0.1
        elif keycode[1] == 'right':
            self.circle.velocity_x += 0.1
        elif keycode[1] == 'up':
            self.circle.velocity_y += 0.1
        elif keycode[1] == 'down':
            self.circle.velocity_y -= 0.1
        return True

class Menu(Screen):

    pass

class Start(Screen):

    pass

class area1(Screen):

    pass

class WindowManager(ScreenManager):

    pass

kv = Builder.load_file("dw.kv")

class Adventure(App):
    def build(self):
        return kv


Adventure().run()

и вот мой файл .kv

Circle:

    size: 30,30
    canvas:
        Ellipse:
            pos: self.pos
            size: self.size

WindowManager:

    Menu:
    Start:
    area1:




Menu>:

    name: "menu"
    #Adding gridlayout
    GridLayout:
        rows :3
        cols :  1

        AnchorLayout:
            anchor_x : "center"
            anchor_y : "center"

            Label:
                text: "Adventure"
                font_size: 40

        AnchorLayout:
            anchor_x : "center"
            anchor_y : "center"

            TextInput:
                id: ign
                size_hint : (.4, None)
                height : 30
                hint_text : "Enter your name"
                multiline : False

        AnchorLayout:
            anchor_x : "center"
            anchor_y : "center"

            Button:
                text: "Start"
                font_size: 40
                size: 100, 75
                size_hint: (None, None)
                on_release: app.root.current = "start"
Start>:

    name: "start"
    Move:
        wall1 : r1
        wall2 : r2
        wall3 : r3
        wall4 : r4
        transit1 : t1
        circle : circle
        Circle:
            id : circle
            pos: root.center_x , root.center_y


        Wall:
            id : r1
            pos: 0, 400
            size: 350, 250
            canvas:
                Rectangle:
                    pos: self.pos
                    size: self.size
        Wall:
            id : r2
            pos: 0 , 0
            size: 350, 250
            canvas:
                Rectangle:
                    pos: self.pos
                    size: self.size
        Wall:
            id : r3
            pos: 500 , 400
            size: 800, 250
            canvas:
                Rectangle:
                    pos: self.pos
                    size: self.size
        Wall:
            id : r4
            pos: 500 , 0
            size: 800, 250
            canvas:
                Rectangle:
                    pos: self.pos
                    size: self.size
        Transit:
            id : t1
            pos: 0, root.center_y
            size: 1, 600

area1>:

    name: 'a1'

1 Ответ

0 голосов
/ 16 апреля 2020

Ваша единственная проблема в том, что строка:

WindowManager.manager.current = "a1"

пытается получить доступ к атрибуту manager класса WindowManager. Вы действительно хотите получить доступ к этому атрибуту экземпляра WindowManager. Для этого вы можете заменить эту строку на:

App.get_running_app().root.current = "a1"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...