我一直在研究 Kivy Pong 教程,加快框架的速度,看看是否可以实现一些想法。我删除了大部分 Pong 功能,因此我只能在屏幕上显示弹跳球,并添加一些代码以在屏幕上生成多个弹跳球(在触摸时生成)。效果很好。然后我添加了一些额外的 Canvas 指令,因此我会绘制一条线来指示球移动的方向。这就是事情变得奇怪的地方。第一个球的行为正如其应有的那样,在屏幕上弹跳。但是任何后续的点击都会生成离开屏幕的球,随机改变方向和速度,并且通常表现得很困惑。我一直在查看我的代码,但似乎找不到任何可能出现问题的迹象。我保留对小部件的所有引用,将它们添加到根小部件中,我似乎没有在它们之间共享任何信息......无论如何,这是代码,也许有人可以启发我。使用最新的kivy和python 3.6。
from random import randint from kivy.app import App from kivy.clock import Clock from kivy.config import Config from kivy.vector import Vector from kivy.uix.widget import Widget from kivy.properties import AliasProperty, ListProperty, NumericProperty, ReferenceListProperty class Playground(Widget): critters = ListProperty([]) def update(self, dt): for critter in self.critters: critter.move() if (critter.y self.height): critter.v_y *= -1 if (critter.x self.width): critter.v_x *= -1 self.score.text = "{}".format(len(self.critters)) def on_touch_down(self, touch): critter = Critter() critter.pos = touch.x, touch.y self.critters.append(critter) self.add_widget(critter) class Critter(Widget): angle = NumericProperty(0) v_x = NumericProperty(0) v_y = NumericProperty(0) velocity = ReferenceListProperty(v_x, v_y) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.velocity = Vector(5, 0).rotate(randint(0, 360)) self.angle = Vector(*self.velocity).angle(Vector(1, 0)) def move(self): self.pos = Vector(*self.velocity) + self.pos self.angle = Vector(*self.velocity).angle(Vector(1, 0)) class WorldApp(App): def build(self): game = Playground() Clock.schedule_interval(game.update, 1.0/60.0) return game if __name__ == '__main__': Config.set('kivy', 'desktop', 1) Config.set('kivy', 'exit_on_escape', 1) Config.set('graphics', 'resizable', 0) WorldApp().run()
和KV文件
<Playground> score: score canvas: Color: rgb: 0.0, 0.1, 0.0 Rectangle pos: self.pos size: self.size Label: id: score pos: self.parent.width - self.size[0], self.parent.height - self.size[1] font_size: 16 size: self.texture_size <Critter> size: 30, 30 canvas: Rotate: angle: self.angle origin: self.center axis: 0, 0, 1 Color: rgb: 0.5, 0.0, 0.0 Ellipse: pos: self.pos size: self.size Color: rgb: 1, 1, 0.0 Line: width: 2 points: self.center[0], self.center[1], self.center[0] + self.size[0] / 2, self.center[1]
最佳答案
我不确定这是否会导致您的问题,但您的旋转指令不受窗口小部件规则的限制,并且会影响任何后续的窗口小部件 - 因此每个小动物的旋转都会应用于后面的每个小动物。
为避免这种情况,请在 Canvas 规则的顶部添加 PushMatrix:
并在底部添加 PopMatrix:
。这些说明可有效保存并在稍后恢复到更改之前的初始旋转状态。
关于python - Kivy 小部件行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41624151/