gpt4 book ai didi

python - Kivy 小部件行为异常

转载 作者:太空宇宙 更新时间:2023-11-04 00:41:47 25 4
gpt4 key购买 nike

我一直在研究 Kivy Pong 教程,跟上框架的速度,看看我是否可以实现一些想法。我已经删除了大部分 Pong 功能,因此我只能在屏幕上显示弹跳球,并添加了一些代码以在屏幕上生成多个弹跳球,这些弹跳球是在触摸时生成的。效果很好。然后我添加了一些额外的 Canvas 说明,所以我会画一条线来指示球的移动方向。这就是事情变得奇怪的地方。第一个球就像它应该的那样,在屏幕上弹跳。但是随后的任何点击都会产生离开屏幕的球,随机改变方向和速度并且通常表现困惑。我一直在查看我的代码,但似乎找不到任何可能出错的迹象。我保留了对小部件的所有引用,我将它们添加到根小部件,我似乎没有在它们之间共享任何信息......无论如何,这是代码,也许有人可以启发我。使用最新的 kivy 和 python 3.6。

from random import randintfrom kivy.app import Appfrom kivy.clock import Clockfrom kivy.config import Configfrom kivy.vector import Vectorfrom kivy.uix.widget import Widgetfrom kivy.properties import AliasProperty, ListProperty, NumericProperty, ReferenceListPropertyclass 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 gameif __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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com