python - Kivy Pong 官方教程中如何使用 Scatter 移动 Racket ?

标签 python kivy scatter pong

完成了 Pong Game tutorial从 Kivy 官方网站我继续他们的 Crash Course .在the very first video里面我看到了这个他们称之为 Scatter 的神奇东西,它几乎可以让您开箱即用,让 UI 东西用鼠标移动。

我认为这应该提供一种在乒乓游戏控制 Racket 的更流畅的方式。最初的方法是将 Racket 移动逻辑放在 PongGame 对象(PongGame 类继承自 Widget)的 on_touch_move() 方法中,它是一个简单的:

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

如果您碰巧开始将鼠标光标移动到桨的下方或上方,这会导致开始时出现刺耳的声音。我认为 Scatter 会更好用。唉,到目前为止我没能让它发挥作用。

我首先注释掉 on_touch_move() 方法,然后添加一个 Scatter 对象作为 PongGame 的子对象pong.kv 文件中的 类,并使现有的 PongPaddle 对象成为 Scatter 对象的子对象.像这样:

<PongGame>:
    Scatter:
        do_scale: False
        do_rotation: False
        do_translation_x: False

        PongPaddle:
            id: player_left
            x: root.x
            center_y: root.center_y  

        PongPaddle:
            id: player_right
            x: root.width - self.width
            center_y: root.center_y

因为我使用了一个单一的Scatter 对象并且两个桨需要独立移动我预想这可能会导致问题(点击一个会使两个桨同时移动) 但仍然认为这将是一个好的开始。

运气不好!这不会使桨随鼠标光标移动。它们仍然弹回球(即使它们在小部件树中向下移动并且我除了注释掉 PongGame 中的 on_touch_move() 方法之外没有更改 Python 代码类主体 - 我猜对连接在 pong.kv 文件中的桨的 ObjectProperty 实例的引用仍然有效),但它们不会移动。

Whole runnable code (my own version with the scatter)

Whole runnable code (my own version without the scatter)

有什么想法可以让它发挥作用吗?

最佳答案

所以问题是桨跳到一个新位置,on_touch_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

基本上,触摸包含 y 的增量值(y 改变了多少),因此您可以像移动鼠标一样移动桨,而不是将桨中心移动到鼠标的中心。这使得游戏非常流畅和漂亮。我真的想知道为什么他们一开始不这样做。

但有一个问题 - Racket 现在可能会远离游戏屏幕。这可以通过检查 Racket 的中心是否在屏幕外(使用 PongGame 高度)轻松解决。我将把它留作练习,但请随时询问您是否遇到困难。

所以,既然您很好奇,那么有一种方法可以使用 Scatter 来做到这一点。所以,首先,Scatter 本身是被拖动、调整大小和旋转的小部件,它不是布局(它可以,但我们只需要桨本身移动,而不是整个屏幕)。因此,Paddle 继承自 Scatter。删除我们用于移动桨的 on_touch

现在您会注意到执行此操作后会出现视觉错误。 Scatter 在某些方面很奇怪。删除.kv文件中Paddlepos: self.posThis帖子总结得很好:

...specific behavior makes the scatter unique, and there are some advantages / constraints that you should consider:

  • The children are positioned relative to 0, 0. The scatter position has no impact of the position of children.

所以canvas在Paddle中的位置是相对于Paddle(散点)的,而不是屏幕。

现在花点时间欣赏一下您得到的游戏。桨叶可以移动到任何地方,也可以旋转等等。您可以使用鼠标右键单击来设置由红点指示的假想“触摸”,然后执行移动类型的手势来调整大小和旋转。玩得开心,你应得的。我们将在您休息后修复这些“错误”。

好吧,还有一些您并不真正需要的 Scatter 功能。通过 .py 文件 PongPaddle 类中的 x 禁用缩放、旋转和拖动:

do_rotation = do_scale = do_translation_x = Property(False)

不确定我是否掌握了所有内容,Scatter 可以做很多事情,其中​​一些是您不需要或不需要的。与之前的版本相比,Scatter pong 需要更高的精度。您仍然需要代码来检查 Racket 是否也超出了边界。总的来说,我更喜欢以前的解决方案。

Here您将找到带有 Scatter 的完整代码。

关于python - Kivy Pong 官方教程中如何使用 Scatter 移动 Racket ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45258176/

相关文章:

python - 将外键从一个数据帧附加到另一个数据帧的最快方法

python - 更新 pyplot.scatter 的位置和颜色

matplotlib - 如何在散点图上设置圆形标记的固定/静态大小?

Python:numpy:检测到解释器更改 - 每个进程只能将此模块加载到一个解释器中

python - 如何使用 cx_Oracle 运行非查询 sql 命令?

python - SUDS 信封无效

Mac 上 Eclipse IDE 中的 Python Kivy

python - 错误 : video system not initialized (kivy, ipython)

python - 在 Kivy 中使用和移动小部件/按钮

java - 用于字符串处理的 Akka 分散-聚集