在官方的KivyPong教程中如何使用分散移动桨?

2024-05-19 02:25:16 发布

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

在完成了Kivy官方网站上的Pong Game tutorial之后,我继续他们的Crash Course。在the very first video我看到了一个神奇的东西,他们称之为分散(Scatter),它可以让你开箱即用鼠标移动用户界面上的东西。在

我认为这将为乒乓球比赛提供一种更流畅的控制划桨的方法。最初的方法是将桨叶移动逻辑放在pongame对象的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

如果您碰巧开始将鼠标光标移到桨的下方或上方,则会导致启动不平稳。我认为分散的效果会更好。唉,到目前为止我还没能成功。在

我开始是注释掉on_touch_move()方法,然后在pong.kv文件中添加一个Scatter对象作为PongGame类的子对象,并将现有的PongPaddle对象作为Scatter对象的子对象。像这样:

^{pr2}$

由于我使用了一个分散的物体,两个桨叶都需要独立移动,我设想这可能会引起问题(单击一个会使两个同时移动),但我认为这将是一个好的开始。在

不走运!这不会使桨叶随鼠标光标移动。它们仍然弹起球(即使它们在小部件树中向下移动,我除了注释掉pongame类主体中的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)

有什么办法吗?在


Tags: the对象方法moveifonwith鼠标
1条回答
网友
1楼 · 发布于 2024-05-19 02:25:16

所以问题是桨叶跳到了一个新的位置,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改变了多少)的delta值,因此您只需移动鼠标就可以移动挡板,而不是将挡板中心移动到鼠标的y。这使比赛变得非常顺利和美好。我真的很奇怪为什么他们一开始就不这么做。在

但是有一个问题-现在球拍可能会离开游戏屏幕。这可以很容易地通过检查桨的中心是否离开屏幕来解决(使用PongGame高度)。我将把这个作为练习,但如果你被卡住了,请随时询问。在

所以,既然你很好奇,有一种方法可以用散射来实现。所以,首先,分散本身是一个小部件,它被拖动、调整大小和旋转,它不是一个布局(它可以,但我们只需要桨本身来移动,而不是整个屏幕)。因此,Paddle继承自Scatter。取下我们用来移动桨叶的on_touch。在

现在您会注意到,一旦您这样做,就会出现一个视觉错误。分散在某些方面是很奇怪的。删除.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.

所以画布在桨中的位置是相对于桨(散射)的,而不是相对于屏幕的。在

现在花点时间欣赏一下你的比赛。桨叶可以在任何地方移动,也可以旋转等等。你可以用鼠标右键点击设置一个由红点表示的虚拟“触摸”,然后做一些移动手势来调整大小和旋转。玩得开心,你应得的。我们会在你休息后修理这些“虫子”。在

好吧,还有一些你不需要的分散功能。禁用.py文件PongPaddle类中的x缩放、旋转和拖动:

^{pr2}$

不确定我是否得到了一切,分散做了很多事情,有些你不需要或不想要。与之前的版本相比,分散式pong需要更高的精度。你仍然需要代码来检查划桨是否越界。总的来说,我更喜欢前面的解决方案。在

Here您将找到带有散点的完整代码。在

相关问题 更多 >

    热门问题