Kivy, систематическая анимация с использованием ошибки Clock.interval - PullRequest
0 голосов
/ 26 августа 2018

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

#Block 1 - 5 are stated above
class Block6(Widget):
    vel_x = NumericProperty(0)
    vel_y = NumericProperty(-5)
    position = ReferenceListProperty(vel_x,vel_y)
    def fall(self, pos):
        self.pos =  Vector(self.position) + self.pos
        if self.pos[1]==0:
            self.position[1] = 0

class TetrisApp(App):
    def build(self):
        game = TetrisGame()
        x = Window.width
        block1 = Block1(pos=(randint(0,x),Window.height))
        block2 = Block2(pos=(randint(0,x),Window.height))
        block3 = Block3(pos=(randint(0,x),Window.height))
        block4 = Block4(pos=(randint(0,x),Window.height))
        block5 = Block5(pos=(randint(0,x),Window.height))
        block6 = Block6(pos=(randint(0,x),Window.height))
        allblocks = (block1, block2, block3, block4, block5, block6)
        while game:
            blockchoice = randint(1,6)
            if blockchoice == 1:
                game.add_widget(block1)
                Clock.schedule_interval(block1.fall,1/60)
                for i in allblocks:
                    if block1.collide_widget(i):
                        block1.position[1] = 0
            elif blockchoice == 2:
                game.add_widget(block2)
                Clock.schedule_interval(block2.fall,1/60)
                    for i in allblocks:
                    if block2.collide_widget(i):
                        block2.position[1] = 0
            elif blockchoice == 3:
                game.add_widget(block3)
                Clock.schedule_interval(block3.fall,1/60)
                for i in allblocks:
                    if block3.collide_widget(i):
                        block3.position[1] = 0
            elif blockchoice == 4:
                game.add_widget(block4)
                Clock.schedule_interval(block4.fall,1/60)
                for i in allblocks:
                    if block4.collide_widget(i):
                        block4.position[1] = 0
            elif blockchoice == 5:
                game.add_widget(block5)
                Clock.schedule_interval(block5.fall,1/60)
                for i in allblocks:
                    if block5.collide_widget(i):
                        block5.position[1] = 0
            elif blockchoice == 6:
                game.add_widget(block6)
                Clock.schedule_interval(block6.fall,1/60)
                for i in allblocks:
                    if block6.collide_widget(i):
                        block6.position[1] = 0
            else:  
                print('this is not possible')
        return game

if __name__ == '__main__':
    TetrisApp().run()

Я написал свой файл kv и все, но продолжаю получать эту ошибку This is the error i keep getting

Я был бы очень признателен за любую помощь, откуда приходит ошибка

1 Ответ

0 голосов
/ 26 августа 2018

Tetris Game

Существует семь тетромино.В любой момент, есть только одно падение тетромино.Пожалуйста, обратитесь к предложению / фрагменту.

Фрагмент

class TetrisApp(App):

    def build(self):
        game = TetrisGame()
        x = Window.width
        allblocks = []

        while game:
            blockchoice = randint(1,6)
            if blockchoice == 1:
                block = Block1(pos=(randint(0, x), Window.height))
            elif blockchoice == 2:
                block = Block2(pos=(randint(0, x), Window.height))
            elif blockchoice == 3:
                block = Block3(pos=(randint(0, x), Window.height))
            elif blockchoice == 4:
                block = Block4(pos=(randint(0, x), Window.height))
            elif blockchoice == 5:
                block = Block5(pos=(randint(0, x), Window.height))
            elif blockchoice == 6:
                block = Block6(pos=(randint(0, x), Window.height))
            elif blockchoice == 7:
                block = Block7(pos=(randint(0, x), Window.height))

            game.add_widget(block)

            Clock.schedule_interval(block.fall,1/60)

            for i in allblocks:
                if block.collide_widget(i):
                    block.position[1] = 0
            else:
                print('this is not possible')
        return game

Решение - WidgetException: невозможно добавить ... у него уже есть родительский элемент

Перед добавлением каждого блока вынужно проверить, существует ли каждый блок.

Фрагмент

if block1 in game.children:
    # block1 existed
    block1.y = Window.height    # reset y i.e. start from top again
else:
    # block does not exist
    game.add_widget(block1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...