Kivy:删除_widget后,它从屏幕上消失,但留在ID中



我正在制作Arkanoid游戏并遇到问题:碰撞后,我使用remove_widget方法从布局中删除小部件。因此它从屏幕上消失了,但仍在那里,可以由ids获得,如果球再次进入该点,它仍然与小部件相撞。

这是一些代码:

gemsgrid.kv

<Brick@Widget>:
    canvas:
        Rectangle:
            size: self.size
            pos: self.pos
<GemsGrid@FloatLayout>:
    size_hint: None, None
    Brick:
        pos: 300, 100
        id: 1
    Brick:
        pos: 300,200
        id: 2

main.py

from kivy.app import App
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.uix.relativelayout import RelativeLayout
from kivy.properties import NumericProperty

Builder.load_file('paddle.kv')
Builder.load_file('ball.kv')
Builder.load_file('gemsgrid.kv')

class Game(RelativeLayout):
    lives = NumericProperty(5)
    def __init__(self, **kwargs):
        super(Game, self).__init__(**kwargs)
        self.game_started = False
    def on_touch_move(self, touch):
        if touch.y < self.height / 3:
            self.ids.paddle_widget.center_x = touch.x
            if not self.game_started:
                self.ids.ball_widget.serve_ball()
                self.game_started = True
    def update(self, dt):
        if self.game_started:
            self.ids.ball_widget.move()
            self.ids.paddle_widget.bounce_ball(self.ids.ball_widget)
            for id, gem in self.gemsgrid.ids.iteritems():
                if self.ids.ball_widget.collide_widget(gem):
                    self.gemsgrid.remove_widget(gem)
                    self.right_left_collissioned(self.ids.ball_widget, gem)
                    self.top_bottom_collissioned(self.ids.ball_widget, gem)
        # bounce off top and bottom
        if (self.ids.ball_widget.top > self.height):
            self.ids.ball_widget.velocity_y *= -1
        # bounce off left and right
        if (self.ids.ball_widget.x < 0) or (self.ids.ball_widget.right > self.width):
            self.ids.ball_widget.velocity_x *= -1
        # subtract one life if hit the bottom but not the paddle
        if (self.ids.ball_widget.y < self.y):
            self.lives -= 1
            self.ids.ball_widget.reset()
            self.game_started = False
    def right_left_collissioned(self, ball, gem):
        if ball.y > gem.y and ball.y < (gem.y + gem.height):
            ball.velocity_x *= -1
    def top_bottom_collissioned(self, ball, gem):
            if ball.x > gem.x and ball.x < gem.x + gem.width:
                ball.velocity_y *= -1

class MainApp(App):
    def on_pause(self):
        return True
    def build(self):
        game = Game()
        Clock.schedule_interval(game.update, 1/60)
        return game

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

我缺少什么?

.kv解析时,将生成ids。这样它将保持这种状态。

使用 self.children而不是检查它是否仍然存在。

ids dict是静态的,并且不打算这样更新(尽管如果人们真的想要该功能,我不知道为什么它不能更改(。听起来好像不适合您的问题,我会手动管理对象参考。

最新更新