Kivy小部件行为异常

2024-05-28 20:21:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在玩kivypong教程,了解框架的运行速度,看看是否可以实现一些想法。我删除了大部分的乒乓球功能,所以我只能在屏幕上弹跳球,并添加了一些代码在屏幕上生成多个弹跳球,在触摸屏上生成。效果不错。然后我添加了一些额外的画布说明,这样我就可以画一条线来指示球移动的方向。这就是事情变得奇怪的地方。第一个球就像它应该做的那样,在屏幕上弹跳。但接下来的任何一次点击都会产生一些球,这些球会离开屏幕,随机改变方向和速度,通常会表现出混乱。我一直在查看我的代码,似乎找不到任何可能出错的迹象。我保留了所有对小部件的引用,我将它们添加到根部件中,我似乎没有在它们之间共享任何信息。。。不管怎样,这是密码,也许有人能给我启发。使用最新的kivy和python3.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文件

^{pr2}$

Tags: fromimportselfconfig屏幕defwidgettouch
1条回答
网友
1楼 · 发布于 2024-05-28 20:21:49

我不确定这是否导致了你的问题,但是你的旋转指令不受widget规则的限制,并且会影响到任何以后的widget,所以每个Critter的旋转都会应用到后面的每个widget上。在

要避免这种情况,请在画布规则的顶部添加PushMatrix:,在底部添加{}。这些指令有效地保存并稍后恢复到更改前的初始旋转状态。在

相关问题 更多 >

    热门问题