如何在官方Kivy Pong教程中使用Scatter移动球拍?



从Kivy官方网站完成乒乓球游戏教程后,我继续他们的速成课程。在第一个视频中,我看到了他们称之为Scatter的神奇东西,它几乎可以让你开箱即用,让UI的东西随着你的鼠标移动。

我认为这应该提供一种更流畅的方式来控制乒乓球游戏中的桨。最初的方法是将桨移动逻辑放在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()方法,然后在pong.kv文件中添加一个 Scatter 对象作为 PongGame 类的子对象,并使现有的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 代码 - 我想对 ObjectProperty 实例的引用在pong.kv文件中钩住的桨仍然有效(,但它们不会移动。

整个可运行代码(我自己的散点版本(

整个可运行代码(我自己的版本没有分散(

有什么想法如何让它工作吗?

所以问题是桨跳到一个新的位置,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 的变化量(,因此您可以像移动鼠标一样移动桨,而不是将桨中心移动到鼠标的y。这使得游戏非常流畅和漂亮。我真的想知道为什么他们一开始就没有这样做。

不过有一个问题 - 桨现在可以远离游戏屏幕。这可以通过检查球拍的中心是否离开屏幕(使用PongGame高度(轻松修复。我会把它作为一个练习,但请随时询问您是否遇到困难。

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

现在,一旦您这样做,您会注意到存在一个视觉错误。散射在某些方面很奇怪。删除 .kv 文件中Paddlepos: self.pos。这篇文章总结得很好:

。特定行为使散点唯一,并且有一些 您应该考虑的优点/限制:

  • 子项相对于 0, 0 定位。散点位置对子项位置没有影响。

因此,画布在桨中的位置是相对于划桨(散点(,而不是屏幕。

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

好的,所以还有一些你并不真正需要的 Scatter 功能。禁用按.py文件PongPaddle类中的 x 进行缩放、旋转和拖动:

do_rotation = do_scale = do_translation_x = Property(False)

不确定我是否得到了一切,Scatter 做了很多事情,其中一些你不需要或不想要。与以前的版本相比,Scatter pong需要更高的精度。您仍然需要代码来检查桨是否超出边界。总的来说,我更喜欢以前的解决方案。

在这里,您将找到带有Scatter的完整代码。

相关内容

  • 没有找到相关文章

最新更新