2016-10-19 72 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

工程就像一個魅力,謝謝!我在玩代碼時發現,如果不在BattleField中創建__init__並將時鐘放入應用程序中,它就會像以前一樣工作。你有沒有特別的理由?我一定會閱讀你提供的鏈接。再次感謝! – Rezney

+0

主要用於閱讀。很高興幫助! –

0

你試過「self.parent.remove_widget(self.target)」而不是「self.remove_widget(self.target)」嗎?要移除一個小部件,您的代碼需要從小部件樹中的較高點開始行動(我想測試您的部件,但我現在沒有計算機)。

+0

我試過了,但沒有最近的部件沒有被刪除後。我覺得我錯過了一些重要的概念,以刪除舊的對象, – Rezney

+0

儘管如此,非常感謝您的輸入... – Rezney