python - Kivy 小部件行为异常

标签 python kivy

我一直在研究 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/

相关文章:

python - kivy 圆形菜单

Python Kivy 严重文本错误。无法找到任何有值(value)的文本提供者

python - 使用 ReportLab 将数据框转换为 PDF 中的 GRID。我怎样才能在网格的一列中划线

python - 接收 Google Calendar API 通知时出现 403 错误

python - Kivy:无法引用 .kv 文件属性

python-3.x - Kivy RecycleView 作为 ListView 的替代品?它是如何工作的?

Python:调整窗口大小时调整小部件的大小(使用 PLACE 管理器)

python - 如何使用 python 子进程从 curl 检索信息

python - 线程和进程之间的范围问题?

python - 使用 Python 在手机中进行实时 gps 跟踪