2015-05-04 2 views
0

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

Сообщения об ошибках:

File "bbgsa1.py", line 47, in Update 
    self.parent.remove_widget(self) 
AttributeError: 'NoneType' object has no attribute 'remove_widget' 

и

File "bbgsa1.py", line 45, in Update 
    self.parent.zicie = self.parent.zicie - 1 
AttributeError: 'NoneType' object has no attribute 'zicie' 

Вот часть кода с ошибкой:

class level(Widget): 
    zicie = NumericProperty(10)# the variable containg the life of the player 
    zloto = NumericProperty(0) 
    e_killed = NumericProperty(0) 
    intv1 = NumericProperty(2/1.) 
    def __init__(self, **kwargs): 
     super(level, self).__init__(**kwargs) 
     Clock.schedule_interval(self.Update, self.intv1) 
    def Update(self, *args):# this funktion generates enemys 
     obj = ROOT.ids.place.ids.level 
     obj.add_widget(Enemy(pos=(800,100))) # the widget enemy is added here 

class Enemy(Widget): 
    imgp = StringProperty('enemy.png') 
    velocity = NumericProperty(1) 
    intv = NumericProperty(0/60.) 
    def __init__(self, **kwargs): 
     super(Enemy, self).__init__(**kwargs) 
     Clock.schedule_interval(self.Update, self.intv) 

    def Update(self, *args):# the funktion that lets the enemy move 
     self.x -= self.velocity 
     if self.x < 1:# checks if the enemy widget reached the end 
      self.velocity = 0#m akes the enemy stop moving 
      self.parent.zicie = self.parent.zicie - 1# the variable zicie that is not found 
      self.parent.remove_widget(self) # this command is also not working 

    def on_touch_down(self, touch):# the funktion, that lets the enemy die 
     if self.collide_point(*touch.pos): 
      self.velocity = 0 
      self.imgp = 'enemyd.png' 
      self.parent.e_killed += 1 
      self.parent.zloto += 10 
      self.parent.remove_widget(self) 

ответ

1

Эти ошибки, потому что это self.parent Нет в точке, где выполняются линии. Я не проверял подробно, но один из способов, который может возникнуть, это то, что функция часов часов self.Update вызывается даже после того, как Enemy был удален из своего родителя.

Вы должны быть осторожны, чтобы отключить функцию после того, как Enemy был удален с экрана (чтобы избежать увеличения числа запланированных функций), но также может непосредственно решить проблему, проверяя, является ли self.parent None, прежде чем пытаться делать вещи на основе ее ценности.

+0

Я попытался снять его с: self.unschedule (self.Update), но это не сработало – Gilgamesch

+0

Хорошо, я понял, я идиот XD Спасибо – Gilgamesch

Смежные вопросы