如何使用Scatter在官方的Kivy Pong教程中移动拨片?

时间:2017-07-22 19:03:56

标签: python kivy scatter pong

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

我认为这应该为乒乓游戏中的控制拨号提供更顺畅的方式。最初的方法是将paddle移动逻辑放在 PongGame 对象的on_touch_move()方法中( 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

如果您碰巧开始将鼠标光标移动到桨的下方或上方,则会导致震动。我认为 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文件中连接到paddles的ObjectProperty实例的引用仍然有用,但是它们不会移动。

Whole runnable code (my own version with the scatter)

Whole runnable code (my own version without the scatter)

任何想法如何使其发挥作用?

1 个答案:

答案 0 :(得分:1)

所以问题是paddle跳转到一个新位置,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更改了多少),因此您可以像移动鼠标一样移动球拍,而不是将球拍中心移动到鼠标{{1 }}。这使得游戏非常流畅和漂亮。我真的很想知道他们为什么不首先这样做。

但是有一个问题 - 桨现在可以离开游戏画面。通过检查球拍中心是否离开屏幕可以很容易地解决这个问题(使用y高度)。我会把它留作练习,但随时可以问你是否卡住了。

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

现在,一旦你这样做,你会发现有一个视觉错误。分散在某些方面很奇怪。删除.kv文件中on_touch的{​​{1}}。 This帖子总结得很好:

  

...特定的行为使得分散是唯一的,并且有一些   您应该考虑的优势/限制:

     
      
  • 儿童的位置相对于0,0。分散位置对儿童的位置没有影响。
  •   

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

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

好的,所以你也不需要Scatter的一些功能。禁用.py文件pos: self.pos类中的x进行缩放,旋转和拖动:

Paddle

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

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