pygame - 我的 pygame 子弹精灵每次通过循环只触发一次。想多次开火
问题描述
我对编码很陌生,我正试图让一艘船发射多发子弹,但每次我按下空格键时,子弹都会重新触发,并且不会到达屏幕的末尾。似乎每次只调用我的 Bullet 类的一个实例,但我不知道如何修复它。这是我到目前为止的代码:
import sys
import pygame
from pygame.sprite import Sprite
class Sideship():
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode((1200,800))
self.screen_rect = self.screen.get_rect()
pygame.display.set_caption("Side Ship")
self.bg_color = (50, 50, 255)
self.bullets = pygame.sprite.Group()
self.jet = Jet()
def run_game(self):
self.jet.rect.x = -20
self.jet.rect.y = 290
self.bullet = Bullet()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_DOWN:
self.jet.moving_down = True
if event.key == pygame.K_UP:
self.jet.moving_up = True
if event.key == pygame.K_SPACE:
self.new_bullet = Bullet()
self.bullets.add(self.new_bullet)
self.new_bullet.rect.x = self.jet.rect.x+200
self.new_bullet.rect.y = self.jet.rect.y+30
if event.type == pygame.KEYUP:
if event.key == pygame.K_DOWN:
self.jet.moving_down = False
if event.key == pygame.K_UP:
self.jet.moving_up = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
sys.exit()
self.jet.update()
self.bullets.update()
self.screen.fill(self.bg_color)
self.bullets.update()
for bullet in self.bullets.sprites():
pygame.draw.rect(self.screen, self.new_bullet.bullet_color, self.new_bullet.rect)
self.screen.blit(self.jet.image, self.jet.rect)
pygame.display.flip()
class Jet():
def __init__(self):
self.image = pygame.image.load('jet.bmp')
self.rect = self.image.get_rect()
self.moving_down = False
self.moving_up = False
self.rect.y = float(self.rect.y)
self.rect.x = float(self.rect.x)
def update(self):
if self.moving_down and self.rect.bottom < 801:
self.rect.y += 1.9
if self.moving_up and self.rect.top > -14:
self.rect.y -= 1.4
class Bullet(Sprite):
def __init__(self,):
super().__init__()
self.bullet_width = 30
self.bullet_height = 5
self.bullet_color = (250,250,250)
self.rect = pygame.Rect(0,0, self.bullet_width, self.bullet_height)
def update(self):
self.rect.x += 4
side_ship = Sideship()
side_ship.run_game()
解决方案
问题出在循环中,它绘制了子弹。当您遍历项目符号时,当前元素由 引用bullet
。因此,您必须绘制bullet
,而不是self.new_bullet
:
pygame.draw.rect(self.screen, self.new_bullet.bullet_color, self.new_bullet.rect)
for bullet in self.bullets.sprites():
pygame.draw.rect(self.screen, bullet.bullet_color, bullet.rect)
推荐阅读
- python - 值列表的运行函数
- python-3.x - 从 NOAA 下载数据的 python 脚本
- c# - 从 DropDownList 中抓取所选项目
- python - Jupyter 笔记本的 R 内核
- typescript - Typescript中对类的构造函数的类型引用?
- c# - 更新 ASP.NET Core 2.1 身份验证 Cookie 中的声明
- google-apps-script - Gscript 读取 gmail 附件
- go - 获取内部结构值
- ios - 如果图像的外部边界反应本机,如何剪掉图像
- javascript - FullCalendar 在 asp.net 中单击按钮时不刷新事件