Киви: Как автоматизировать процессы часов один за другим - PullRequest
0 голосов
/ 02 сентября 2018

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

#All modules have been imported
class block1(Widget):

    def __init__(self, **kwargs):
        super(block1, self).__init__(**kwargs)
        xpositions = (0, 50, 100, 150, 200, 250, 300, 350, 400)
        self.bind(pos= self.fall)
        self.pos_x = random.choice(xpositions)
        self.pos_y = Window.height
        self.pos = (self.pos_x,self.pos_y)
        self.vel_x = 0
        self.vel_y = -5
        velocity = vel_x,vel_y

    def fall(self, **kwargs):
        self.pos =  Vector(*self.position) + self.pos
        if self.pos[1]==0:
            self.position[1] = 0
            return self.pos

    @classmethod
    def new_widget(cls):
        return cls
        #This widget is intended to help me create the new instance of a the 
same class i.e to multiply this block within my app
class block2(Widget):

    def __init__(self, **kwargs):
        super(block1, self).__init__(**kwargs)
        xpositions = (0, 50, 100, 150, 200, 250, 300, 350, 400)
        self.bind(pos= self.fall)
        self.pos_x = random.choice(xpositions)
        self.pos_y = Window.height
        self.pos = (self.pos_x,self.pos_y)
        self.vel_x = 0
        self.vel_y = -5
        velocity = vel_x,vel_y

    def fall(self, **kwargs):
        self.pos =  Vector(*self.position) + self.pos
        if self.pos[1]==0:
            self.position[1] = 0
            return self.pos
    @classmethod
    def new_widget(cls):
        return cls
    #This widget is intended to help me create the new instance of a the 
same class i.e to multiply this block within my app

У меня три проблемы. Первый из моей функции - мой вызов класса блока fall Я получаю сообщение об ошибке block1 has no attribute called velocity, когда оно явно находится в моей функции __init__.

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

def build(self):
    game= board()
    first = block1()
    second = block2()
    game.add_widget(first)
    Clock.schedule_interval(first.fall, 1/60)
    if first.pos[1] == 0:
        game.add_widget(second)
        Clock.schedule_interval(second.fall, 1/60)

Во-вторых, в моей функции init я пытался связать функцию fall со свойством pos класса, так что при падении блока свойство pos класса изменяется вместе с ним. Независимо от того, кажется, программа не обнаруживает изменения в pos независимо от привязки.

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

game = tetrisgame()#This is the main layout for the game
while game:#To create a loop to keep adding new blocks
        blockchoice = randint(1,6)
        if blockchoice == 1:
            game.add_widget(block1.new_widget)
            Clock.schedule_interval(block1.fall,1/60)
            for i in allblocks:
                if block1.collide_widget(i):
                    block1.position[1] = 0

Это дает мне сообщение об ошибке, связанное с ошибкой widget.bind, и не может создать новый экземпляр для моего класса. Может ли кто-нибудь помочь мне уточнить? Примечание. Я попытался выбрать части кода, которые были источником ошибки, чтобы избежать публикации с большим количеством кода, поэтому обратите внимание, что все модули были импортированы и файлы .kv со всеми проектами опущены.

1 Ответ

0 голосов
/ 03 сентября 2018

Здесь много проблем. Ваш block1 действительно не имеет атрибута velocity. velocity, упомянутый в вашем __init__(), является только локальной переменной. Если вы хотите, чтобы это был атрибут, вы должны назначить его как self.velocity=. Также ссылка на velx,vely не ссылается на атрибуты self.velx и self.vely.

Ваш fall() метод ссылается на self.position, который я нигде не вижу определенным.

Я не вижу, как меняется позиция вашего виджета. Возможно, эта строка в вашем методе fall() должна быть: self.pos = Vector(*self.velocity) + self.pos.

Атрибут pos Widget указывает Kivy, где его рисовать, поэтому я не думаю, что вы беспокоитесь о привязке pos к чему-либо, это будет позиция Widget.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...