python - Pygame Paddle 与类的碰撞
问题描述
所以我目前正在使用 Pygame 进行 Ping,我只是不知道应该如何与桨发生碰撞。我有一个没有课程的乒乓球比赛,我是这样做的
if paddle.colliderect(ecl):
bewegungx = abs(bewegungx)
在这种情况下,ecl 是球,这是我的课程。我目前只有一个桨,因为我想先弄清楚碰撞,然后再做剩下的。
先感谢您 :)
import pygame
white = (255, 255, 255)
black = (0, 0, 0)
WIDTH = 400
HEIGHT = 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
FPS = 60
clock = pygame.time.Clock()
class Ball():
def __init__(self):
self.ball_w = 30
self.ball_h = 30
self.ball_x = 100
self.ball_y = 150
self.ball_speedx = 3
self.ball_speedy = 3
self.ball_draw = pygame.Rect(self.ball_x, self.ball_y, self.ball_w, self.ball_h)
def draw(self):
pygame.draw.rect(screen, white, self.ball_draw)
def move(self):
self.ball_x += self.ball_speedx
self.ball_y += self.ball_speedy
self.ball_draw.topleft = (self.ball_x, self.ball_y)
def wall_collision(self):
if self.ball_draw.top <=0:
self.ball_speedy = self.ball_speedy *-1
if self.ball_draw.right >= WIDTH:
self.ball_speedx = self.ball_speedx *-1
if self.ball_draw.left <=0:
self.ball_speedx = self.ball_speedx *-1
if self.ball_draw.bottom >= HEIGHT:
self.ball_speedy = self.ball_speedy *-1
class Paddle():
def __init__(self):
self.paddle_w = 30
self.paddle_h = 130
self.paddle_x = 10
self.paddle_y = 150
self.paddle_speed = 0
self.paddle_left = pygame.Rect(self.paddle_x, self.paddle_y, self.paddle_w, self.paddle_h)
def draw(self):
pygame.draw.rect(screen, white, self.paddle_left)
def move(self):
key = pygame.key.get_pressed()
if key[pygame.K_w] and self.paddle_left.top > 0:
self.paddle_left.y -=7
if key[pygame.K_s] and self.paddle_left.bottom < 600:
self.paddle_left.y += 7
ball = Ball()
paddle = Paddle()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
screen.fill(black)
#Ball Functionsw
ball.draw()
ball.move()
ball.wall_collision()
#Paddle Functions
paddle.draw()
paddle.move()
pygame.display.flip()
clock.tick(FPS)
解决方案
当球击中桨时,球的方向会改变。paddle_left_collision
在类中添加一个方法Ball
:
class Ball():
# [...]
def paddle_left_collision(self, paddle_rect):
if self.ball_draw.colliderect(paddle_rect):
self.ball_speedx = abs(self.ball_speedx)
在应用程序循环中调用它
while True:
# handle events
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
# move objects and detect collisisons
ball.move()
paddle.move()
ball.wall_collision()
ball.paddle_left_collision(paddle.paddle_left)
# draw scene
screen.fill(black)
ball.draw()
paddle.draw()
pygame.display.flip()
clock.tick(FPS)
请注意,如果您有两个桨,请按如下方式更改方法:
def paddles_collision(self, paddle_left_rect, paddle_right_rect):
if self.ball_draw.colliderect(paddle_left_rect):
self.ball_speedx = abs(self.ball_speedx)
if self.ball_draw.colliderect(paddle_right_rect):
self.ball_speedx = -abs(self.ball_speedx)
推荐阅读
- java - Kafka Connect 启动,但没有任何反应
- arrays - 从 Oracle 19c 表中的数组中选择 json 值
- reactjs - 在多个 onClicks 上使 redux 操作异步
- kubernetes - 如何有效实施 EKS 集群自动扩展
- sql - 使用另一个表中的值更新表中列的所有记录
- r - 基于多列合并两个数据集,但使时间列在分钟范围内灵活
- python-3.x - 如何设置 px.timeline tickvals?
- django - 如何从 django 模板中的 for 循环中获取特定的 id?
- javascript - Stripe - 如何添加持卡人姓名和邮政编码
- python - 使用 ZipFile 读取文件后如何编码 html 文件?