python - Pygame Pong 有条件使球反弹
问题描述
是否可以将条件添加到此代码中,这将导致 x_direction 发生变化,使球在超出宽度时看起来会反弹?例如:如果 x_val > width x_direction == x_direction * -1?(对于 y_direction 也是如此)。
import pygame
BLACK = (0,0,0)
WHITE = (255,255,255)
BLUE = (50,50,255)
YELLOW = (255,255,0)
width = 64
height = 480
pygame.init()
size = (width,height)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Pong")
done = False
clock = pygame.time.Clock()
ball_width = 20
x_val = 150
y_val = 200
x_direction = 1
y_direction = 1
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
x_val = x_val + x_direction
y_val = y_val + y_direction
screen.fill (BLACK)
# condition to go here to make ball bounce
pygame.draw.rect(screen, BLUE, (x_val,y_val,ball_width,20))
pygame.display.flip()
clock.tick(60)
pygame.quit()
解决方案
您的x_val
和y_val
需要在主循环内递增,否则它们将被递增一次并且永远不会再递增。
您非常接近获得所需的条件。下面是一些代码,如果球撞到屏幕的墙壁,它会改变方向:
if x_val < 0 or x_val > width:
x_direction = x_direction * -1
if y_val < 0 or x_val > height:
y_direction = y_direction * -1
这段代码也必须包含在主循环中,因为我们需要检查球的位置,看它是否在每一帧都与墙壁发生碰撞。
由于你的球有一个尺寸,而你的x_val
和y_val
变量代表你的球的中心,你必须在上面的条件中包括球的尺寸,以使球从它的边缘反弹,而不是从它的中心反弹。
推荐阅读
- r - 按特定列创建具有数据表顺序的新列不起作用
- c++ - __int64 到 CString 返回错误值 - C++ MFC
- java - 比较字符串的第一个字母
- php - mysql group by 如何优化和提高查询速度?
- sqlite - ionic 3 sqlite - 如何执行来自文件的请求
- java - 我在使用 protocol=http/1.1, code=200 的 Retrofit 中得到奇怪的响应
- css - 引导程序中的选项卡窗格现在显示
- javascript - 可以承诺正文在下一行之前执行
- html - : 在 Edge 中悬停和消失的滚动条
- ios - ReactNative 设置 EXPO_DEBUG 问题