|
发表于 2022-8-8 16:08:48
|
显示全部楼层
本帖最后由 鱼cpython学习者 于 2022-8-8 16:12 编辑
判断的确实是小球是否受控,但你看这个判断,它是被包在碰撞判断里的。
也就是说,当小球碰撞的时候,会检测该小球是否受控,受控的话就让其失控
- each.side[0] = -1
- each.side[1] = -1
复制代码
这两句我的看法是这样的:
在游戏刚开始时,所有的speed都为正数,负数的只有side
而到了后期,玩家控制过一些小球,就会出现速度为负数的情况,因为有
- if event.key == K_w: #W,上
- for each in group:
- if each.control:
- each.speed[1] -= 1
-
- if event.key == K_a: #a,左
- for each in group:
- if each.control:
- each.speed[0] -= 1
复制代码
那么就要把方向调成-1,相当于对速度取反,因为碰撞就会设置self.control = False
而在Ball.move方法中,self.control如果为False,那么就需要side参与计算,如果取反速度的话,还有side可能影响运动方向
我说的有点乱,举个例子
假设一个小球A速度为[5, 3], 方向为[1, -1],移动方向为向下,向左
过了一会它变成受控状态,此时Ball.move判断self.control为True,调用self.rect.move(self.speed),代表self.side不用参与运算
又过了一会,经过玩家的操控,A的速度为[-5, 3], 方向仍然为[1, -1],移动方向为向上,向右,因为此时不依靠side来指定移动方向了
此时,A和另一个小球B碰撞,B方向取反,往反方向移动。A失控,self.control变为False
那么此时A应该往反方向移动,即向下,向左移动,为[5, -3]
如果把A的速度取反,变为[5, -3],移动方向为向下,向左,似乎是正确的
但在Ball.move方法中,判断self.control为False,那么调用self.rect = self.rect.move((self.side[0] * self.speed[0], self.side[1] * self.speed[1]))
那么此时传给self.rect.move()的,则是(5 * 1, -3 * -1),即(5, 3),移动方向为向下,向右
这样就不是完全的反方向了。
而把A的方向设为[-1, -1],传给self.rect.move的,是(-5 * -1, 3 * -1),为[5, -3],刚好是我们想要的目标
我说的可能不太清楚,你可以琢磨一下,如果我的看法有错误请指出 |
|