我在我的破砖游戏中遇到了一个问题,在那里球拍有圆形的边缘,我想用完美的Angular 反射球,我使用了Angular 和sin和cos作为方向,但在推荐后我转向了矢量,为了简单起见,我也遇到了类似的问题. 以下是代码:
import sys
import pygame
pygame.init()
w, h = 1200, 800
screen = pygame.display.set_mode((w, h))
clock = pygame.Clock()
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((10, 10))
self.image.set_colorkey((0,0,0))
pygame.draw.circle(self.image, (255, 0, 0), (5, 5), 3)
self.rect = self.image.get_rect(topleft = (x, y) )
self.mask = pygame.mask.from_surface(self.image)
self.velocity = pygame.Vector2(0, -10)
def update(self, circlex, circley, circle_mask):
if self.rect.y < 0 or self.rect.y > 800:
self.kill()
if self.rect.x < 0 or self.rect.x > 1200:
self.kill()
self.rect.y += self.velocity.y
offset = circlex - self.rect.x, circley - self.rect.y
if p := self.mask.overlap(circle_mask, offset):
v = pygame.Vector2(p)
self.velocity.reflect_ip(v)
def draw(self, screen):
screen.blit(self.image, self.rect)
circle = pygame.Surface((400, 400))
pygame.draw.circle(circle, (255, 255, 255), (200, 200), 150)
circle_rect = circle.get_rect(topleft = (400, 100))
circle.set_colorkey((0, 0, 0))
circle_mask = pygame.mask.from_surface(circle)
gun = pygame.Surface((100, 40))
gun_rect = gun.get_rect(topleft = (200, 750))
gun.fill("red")
bullets = pygame.sprite.Group()
while True:
mx, my = pygame.mouse.get_pos()
for e in pygame.event.get():
if e.type == pygame.QUIT:
pygame.quit()
sys.exit()
if e.type == pygame.MOUSEBUTTONDOWN:
b = Bullet(mx, 750)
bullets.add(b)
screen.fill((30, 30, 30))
gun_rect.centerx = mx
screen.blit(gun, gun_rect)
screen.blit(circle, circle_rect)
bullets.update(circle_rect.x, circle_rect.y, circle_mask)
bullets.draw(screen)
pygame.display.flip()
clock.tick(120)
the issue is the bullet is getting straight through the circle, if you could explain how vector works that would be great.