2016-10-19 2 views
1

Я недавно начал играть с Kivy и хотел бы сделать простую стреляющую игру.Kivy - удалить объекты на touch_down

Это мой код:

import kivy 
kivy.require('1.9.0') 

from kivy.config import Config 
Config.set('graphics', 'width', '800') 
Config.set('graphics', 'height', '600') 

from kivy.app import App 
from kivy.clock import Clock 
from kivy.core.text import LabelBase 
from kivy.core.window import Window 
from kivy.uix.widget import Widget 
from kivy.uix.label import Label 
from kivy.uix.boxlayout import BoxLayout 
from kivy.graphics import Rectangle 
from kivy.lang import Builder 
from kivy.config import Config 
import random, time 

a = Builder.load_string(''' 
<BattleField> 
    BoxLayout: 
     orientation: 'vertical' 

<Target> 
    canvas: 
     Rectangle: 
      pos: self.pos 
      size: self.size 
      source: 'target.jpg'  

''') 

class BattleField(Widget): 

    #to destroy target 
    def on_touch_down(self,touch): 
     #if self.collide_point(*touch.pos): 
     if self.collide_widget(self.target): 
      self.remove_widget(self.target) 

    def appear_target(self, *args): 

     random_pos = tuple([random.randint(0, 600) for i in range(2)]) 
     self.target = Target() 
     self.target.pos = (random_pos) 
     self.add_widget(self.target) 


class Target(Widget): 

    pass 

class ClockApp(App): 

    def build(self): 
     g = BattleField() 
     Clock.schedule_interval(g.appear_target, 1) 
     return g 

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

Поэтому на данный момент это добавить новую цель 1 раз в секунду. Тем не менее, у меня есть несколько проблем здесь:

  1. можно удалить только недавно добавили виджет
  2. недавно добавленный виджет удаляется независимо где я нажимаю.

Может кто-нибудь, пожалуйста, помогите мне исправить это? Благодаря!

ответ

0

Там вы идете (не так много изменений в исходное сообщение). Вы должны взглянуть на this page на официальной документации

from kivy.config import Config 
Config.set('graphics', 'width', '800') 
Config.set('graphics', 'height', '600') 
from kivy.app import App 
from kivy.clock import Clock 
from kivy.core.text import LabelBase 
from kivy.core.window import Window 
from kivy.uix.widget import Widget 
from kivy.uix.label import Label 
from kivy.uix.boxlayout import BoxLayout 
from kivy.graphics import Rectangle 
from kivy.lang import Builder 
from kivy.config import Config 
import random, time 

a = Builder.load_string(''' 
<BattleField> 
    BoxLayout: 
     orientation: 'vertical' 

<Target> 
    canvas: 
     Rectangle: 
      pos: self.pos 
      size: self.size 
      source: 'target.jpg'  

''') 

class BattleField(Widget): 

    def __init__(self, **kwargs): 
     super(BattleField, self).__init__(**kwargs) 
     Clock.schedule_interval(self.appear_target, 1) 


    def appear_target(self, *args): 
     random_pos = tuple([random.randint(0, 600) for i in range(2)]) 
     target = Target() 
     target.pos = random_pos 
     self.add_widget(target) 


class Target(Widget): 

    def on_touch_down(self, touch): 
     if self.collide_point(*touch.pos): 
      self.parent.remove_widget(self) 


class ClockApp(App): 

    def build(self): 
     return BattleField() 

if __name__ == '__main__': 
    ClockApp().run() 
+0

Работает как шарм, спасибо! Я немного играл с кодом и узнал, что, не создавая __init__ в BattleField и добавляя Clock в приложение, как и раньше, он тоже работает. Есть ли какая-то особая причина, по которой вы это сделали? Я обязательно прочитаю ссылку, которую вы предоставили. Еще раз спасибо! – Rezney

+0

Главным образом для удобства чтения. Рад, что это помогло! –

0

Вы пробовали «self.parent.remove_widget (self.target)» вместо «self.remove_widget (self.target)»? Чтобы удалить виджет, ваш код должен действовать из более высокой точки в дереве виджетов (я бы хотел протестировать ваш, но у меня сейчас нет компьютера).

+0

Я попытался это, но даже не самый последний виджет не удаляется впоследствии. Я чувствую, что мне не хватает какой-то важной концепции здесь, чтобы удалить старые объекты, – Rezney

+0

Тем не менее, спасибо вам большое за ваш вклад ... – Rezney

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