Python 在官方的Kivy Pong教程中,如何使用“分散”来移动球拍?

Python 在官方的Kivy Pong教程中,如何使用“分散”来移动球拍?,python,kivy,scatter,pong,Python,Kivy,Scatter,Pong,在完成了官方的Kivy网站上的测试后,我继续他们的测试。在那里,我看到了一个神奇的东西,他们称之为Scatter,它几乎可以让你开箱即用,用鼠标移动UI 我认为这将为乒乓球比赛中控制球拍提供一种更为流畅的方式。最初的方法是在PongGame对象(PongGame类继承自Widget)的方法上的上放置拨片移动逻辑,这是一个简单的方法: if touch.x < self.width / 3: # if you clicked in 1/3 of the window to the left

在完成了官方的Kivy网站上的测试后,我继续他们的测试。在那里,我看到了一个神奇的东西,他们称之为Scatter,它几乎可以让你开箱即用,用鼠标移动UI

我认为这将为乒乓球比赛中控制球拍提供一种更为流畅的方式。最初的方法是在PongGame对象(PongGame类继承自Widget)的方法上的上放置拨片移动逻辑,这是一个简单的方法:

if touch.x < self.width / 3:  # if you clicked in 1/3 of the window to the left
    player1.center_y = touch.y  # level the first paddle's center vertically with the mouse click position
由于我使用了一个散射对象,并且两个挡板都需要独立移动,因此我设想这可能会导致问题(单击一个会使两个挡板同时移动),但我认为这将是一个良好的开端

不走运!这不会使挡板使用鼠标光标移动。它们仍然会弹起球(即使它们在小部件树中向下移动,并且除了注释PongGame类主体中的
on\u touch\u move()
方法之外,我还没有更改Python代码-我猜对连接在
pong.kv
文件中的拨片的ObjectProperty实例的引用仍然有效),但他们不会移动


有什么办法可以让它工作吗?

所以问题是,拨片会跳到一个新的位置,而
on\u touch\u move
方法会对此负责。在无分散的可运行代码中,我将第84-88行更改为:

def on_touch_move(self, touch):
    if touch.x < self.width / 3:
        self.player1.center_y += touch.dy
    if touch.x > self.width - self.width / 3:
        self.player2.center_y += touch.dy
不确定我是否得到了一切,分散做了很多事情,其中一些你不需要或不想要。与以前的版本相比,散射pong需要更高的精度。您仍然需要代码来检查挡板是否超出边界。总的来说,我更喜欢前面的解决方案


您可以找到带有散点的完整代码。

您可以发布完整的可运行代码(您自己的带有散点的版本)吗?我想我知道问题出在哪里,但我想在发布答案之前检查一下。我会在答案中加入完整的代码作为奖励。只是添加了链接。我的乒乓球游戏版本与教程末尾的版本略有不同。按照作者的建议,我添加了一个玩家胜利标签和一个按钮来重新启动游戏。只需更改代码中的4个字符?你在开玩笑吗?:)。这正是我想让桨移动的方式。我还让他们留在屏幕上:我对你的答案投了更高的票,但不会被接受,因为这个问题实际上是关于使用分散来移动桨的。我仍然不明白为什么速成班的第一个视频中的标签移动自如,但使用“分散在这里”和“划桨”不起作用。是因为这里有一个Widget对象作为基本Widget,而这里是FloatLayout吗?或者是因为在CC Scatter中是第一个添加到基本小部件的小部件吗?对不起,我意识到使用Scatter不是很优雅,但我将编辑答案以包含解决方案。分散有很多含义,但它确实有自己的位置。恐怕这次不是。啊,所以窍门是让PongPaddle类从Scatter继承,而不是向PongGame对象添加Scatter小部件,然后向Scatter添加PongPaddle对象。我知道在速成班中,作者需要一个标签,这样他就不能真正让它从散点类继承。另一方面,PonglePable是一个通用的小部件,在画布上放置一个矩形,因此它完全可行,并且工作良好。非常感谢!我仍然觉得这是一个有趣的想法,任何运行您的代码而没有“dou rotation=dou scale=dou translation\ux=Property(False)”的人都可以轻松地检查自己。欢闹随之而来!:)关于《分散》的内部作品也非常有信息量。我鼓励大家尝试一下。
def on_touch_move(self, touch):
    if touch.x < self.width / 3:
        self.player1.center_y += touch.dy
    if touch.x > self.width - self.width / 3:
        self.player2.center_y += touch.dy
do_rotation = do_scale = do_translation_x = Property(False)