2015-12-29 3 views
-1

С приведенным ниже кодом я могу получить добавленный спрайт для удаления и удаления из списка на случай нажатия, но, к сожалению, это не то, что мне нужно. Я часами пытался обманывать его, пытаясь заставить его автоматически удалять и удалять из списка после того, как он зациклился по классу движения 15 раз. (Я могу поставить, что, если вам это нужно, чтобы помочь мне с этим.Удаление и удаление добавленного объекта - python

class projectilesGroup(object): 

    def __init__(self, canvas): 
     self.canvas = canvas 
     self.projectiles = list() 
     self.moving = True 

    def clicked(self, event, projectile): 
     print('clicked:', projectile), 

     # remove oval from canvas   
     self.canvas.delete(projectile.oval) 

     # remove enemy from list 
     self.projectiles.remove(projectile) 

    def add_new_projectile(self): 
     print(len(self.projectiles)) 
     if len(self.projectiles) < 5: 
      e = projectile(self.canvas) 
      # stop new enemy if all enemies are stoped 
      e.moving = self.moving 
      self.canvas.tag_bind(e.oval, '<Button-1>', lambda event:self.clicked(event, e)) 
      self.projectiles.append(e) 
     else: 
      print("You have 5 spells active - I can't add more.") 

спасибо.

def move(self): 
    if repcount < 15: 
    if self.moving: # to stop root.after 
     if self.direction == 1: # up 
      self.y1 -= self.radius 
      self.y2 -= self.radius 
     elif self.direction == 2: # down 
      self.y1 += self.radius 
      self.y2 += self.radius 
     elif self.direction == 3: # left 
      self.x1 -= self.radius 
      self.x2 -= self.radius 
     elif self.direction == 4: # right 
      self.x1 += self.radius 
      self.x2 += self.radius 
     self.canvas.coords(self.oval, self.x1, self.y1, self.x2, self.y2) 
     repcount += 1 
     root.after(20, self.move) 
    else: 
     print('done') 

ответ

1

Во-первых, каждый объект нуждается в переменную для подсчета движений. Когда counter рассчитывает до 15, то объект может удалить сам по себе.

Объект может Ис удалить овал из холста, поскольку он имеет self.oval и self.canvas.

Малые Проблема может быть, чтобы удалить объект из projectlist, но вы можете дать доступ к projectlist:

e = projectile(self.canvas, self.projectiles) 

EDIT: это может быть сделано таким образом

class ProjectilesGroup(object): 

    # ... 

    def clicked(self, event, projectile): 
     print('clicked:', projectile), 

     self.remove(projectile) 

    def remove(self, projectile): 

     # remove oval from canvas   
     self.canvas.delete(projectile.oval) 

     # remove enemy from list 
     self.projectiles.remove(projectile) 

    def add_new_projectile(self): 
     print(len(self.projectiles)) 
     if len(self.projectiles) < 5: 
      e = Projectile(self, self.canvas) #parent and canvas 

     # ... 

class Projectile(): 

    def __init__(self, parent, canvas): 
     self.parent = parent 
     self.canvas = canvas 

     # ... 


    def move(self): 

     # .... 

     else: 
      print('done') 
      self.parent.remove(self)  

КСТАТИ: В документе PEP8 есть это sugesstion, чтобы использовать имена классов «CamelCase» - например, Projectile и ProjectilesGroup. Легче распознать класс в коде. Некоторые редакторы даже используют разные цвета для имен CamelCase (SO используют синий цвет)

+0

Да, у меня есть счетчик вокруг класса движения –

+0

см. Новое редактирование. –

+0

сладкое спасибо, я получил его на работу –

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