完成了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)
任何想法如何使其发挥作用?
答案 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的完整代码。