python - 在 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, 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)
# [...]
如果您想发射多发子弹,请查看以下问题的答案:
推荐阅读
- django - Django 没有在错误 500 上向管理员发送电子邮件(但电子邮件设置可以与 send_mail 一起使用!)
- keras - keras-yolov3: Preprocess_true_boxes vs yolo_eval
- excel - 将所有行(范围)从一个工作簿复制到新的 excel - 但首先删除重复项
- python - 有没有办法监控循环花费的时间并在 Python 中对时间采取行动?
- pytorch - Pytorch:使用 CUDA 会阻止优化工作
- python - 物体在 camera.ui ursina 游戏引擎中产生噪音
- pycharm - Pycharm:在 Code With me 中运行 GUI 程序
- html - 这个默认间距是从哪里来的?
- download - CMIP6 未来气候月度时间序列
- sql - 如何在合并语句中插入子查询中的值