问题描述
我正在 pygame 中制作一个简单的游戏,在该游戏中,您应该躲避或射击穿过屏幕的目标。到目前为止,我已经创建了这艘船并设法设置了子弹和船的运动,至于它们的键绑定。然而,子弹的 x 坐标似乎根本没有改变,即使我在子弹类的 init 方法中定义了子弹的 x 坐标等于船的 x 坐标,因此,子弹总是会离开船的位置。相反,子弹总是离开屏幕的中间。我找不到问题。任何帮助将不胜感激
import pygame,sys
pygame.init()
clock = pygame.time.Clock()
screen_width = 600
screen_height = 800
screen = pygame.display.set_mode((screen_width,screen_height))
pygame.display.set_caption("Space Race Game")
class ROCKET:
def __init__(self):
self.rocketImg = pygame.image.load("spaceship.png")
self.rocket_x = screen_width/2 - 32
self.rocket_y = screen_height/2 + 100
def draw_rocket(self):
screen.blit(self.rocketImg,(self.rocket_x,self.rocket_y))
def move_rocket(self):
key = pygame.key.get_pressed()
if key[pygame.K_LEFT] and self.rocket_x + 15 > 0:
self.rocket_x -= 5
if key[pygame.K_RIGHT] and self.rocket_x < screen_width - 40:
self.rocket_x += 5
class BULLET(ROCKET):
def __init__(self):
super().__init__()
self.bullet_width = 10
self.bullet_height = 20
self.bullet_x = self.rocket_x + 25
self.bullet_y = self.rocket_y
self.move = [0,0]
self.bullet_speed = 5
self.bullet_rect = pygame.Rect(self.bullet_x,self.bullet_y,self.bullet_width,self.bullet_height)
def draw_bullet(self):
key = pygame.key.get_pressed()
if key[pygame.K_SPACE]:
self.bullet_x = self.rocket_x
self.move[1] = -1
self.bullet_y += self.move[1] * self.bullet_speed
self.bullet_rect.topleft = (self.bullet_x,self.bullet_y)
if self.bullet_y < self.rocket_y - 10:
pygame.draw.rect(screen,(0,0),self.bullet_rect)
if self.bullet_y < - 20:
self.bullet_y = self.rocket_y
self.move[1] = 0
rocket = ROCKET()
bullet = BULLET()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
screen.fill((255,255,255))
rocket.draw_rocket()
rocket.move_rocket()
bullet.draw_bullet()
pygame.display.flip()
clock.tick(60)
解决方法
您必须通过火箭当前的 x 坐标设置子弹的 x 坐标。
向类 rocket
的方法 draw_bullet
添加参数 BULLET
。确保只有在子弹尚未发射时才能发射子弹 (self.move[1] == 0
)。计算火箭的中心并设置子弹的位置(rocket.rocket_x + self.rocketImg.get_width() // 2
):
class BULLET(ROCKET):
# [...]
def draw_bullet(self,rocket):
key = pygame.key.get_pressed()
if key[pygame.K_SPACE] and self.move[1] == 0:
rocket_center_x = rocket.rocket_x + self.rocketImg.get_width() // 2
self.bullet_x = rocket_center_x - self.bullet_width // 2
self.move[1] = -1
# [...]
将 ROCKET
的实例传递给方法 draw_bullet
:
while True:
# [...]
bullet.draw_bullet(rocket)
# [...]
如果您想发射多发子弹,请参阅问题的答案: