如何解决Pygame 中的移动子弹
我正在 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)
# [...]
如果您想发射多发子弹,请参阅问题的答案:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。