网名568 2024-09-10 23:13 采纳率: 0%
浏览 4

键盘上输入空格原本应该出现黄色子弹但是画面却出现了闪退

import pygame
import random
FPS = 60
WIDTH = 500
HEIGHT = 600


WHITE = (255,255,255)
GREEN = (0,255,0)
RED = (255,0,0)
YELLOW = (255,255,0)

#游戏初始化,创建视窗
pygame.init()
screen = pygame.display.set_mode((WIDTH,HEIGHT))
clock = pygame.time.Clock()
running = True

class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((50,40))
        self.image.fill(GREEN)
        #框起物件
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH/2
        self.rect.bottom = HEIGHT -10
        self.speed = 8

    def update(self):
        key_pressed = pygame.key.get_pressed()
        if key_pressed[pygame.K_RIGHT]:
            self.rect.x += self.speed
        if key_pressed[pygame.K_LEFT]:
            self.rect.x -= self.speed
        if key_pressed[pygame.K_UP]:
            self.rect.y -= self.speed
        if key_pressed[pygame.K_DOWN]:
            self.rect.y += self.speed
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.bottom >HEIGHT:
            self.rect.bottom = HEIGHT

    def shoot(self):
        bullet = Bullet(self.rect.x, self.rect.top)
        all_sprites.add(bullet)

class Rock(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((30,40))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = random.randrange(0,WIDTH - self.rect.width)
        self.rect.y = random.randrange(-100,-50)
        self.speedx = random.randrange(-3,3)
        self.speedy = random.randrange(2,8)

    def update(self):
        self.rect.x += self.speedx 
        self.rect.y += self.speedy
        if self.rect.top > HEIGHT or self.rect.left > WIDTH or self.rect.right < 0:
            self.rect.x = random.randrange(0,WIDTH - self.rect.width)
            self.rect.y = random.randrange(-100,-50)
            self.speedx = random.randrange(-3,3)
            self.speedy = random.randrange(2,8)

class Bullet(pygame.sprite.Sprite):
    def __init__(self,x,y):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((10,20))
        self.image.fill(YELLOW)
        self.rect.x = x
        self.rect.bottom = y
        self.speedy = -8

    def update(self):
        self.rect.y += self.speedy
        if self.rect.bottom < 0:
            self.kill()

#创建sprite群组
all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
for i in range(10):
    rock=Rock()
    all_sprites.add(rock)
#更改游戏标题
pygame.display.set_caption("太空生存战")
#游戏回圈
while running:
    #确定帧率
    clock.tick(FPS)
    #取得输入
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                player.shoot()


    #更新游戏
    all_sprites.update()
    #画面显示
    screen.fill(WHITE)
    all_sprites.draw(screen)
    pygame.display.update()

pygame.quit()

请问在出现画面后,键盘上输入空格原本应该出现黄色子弹但是画面却出现了闪退,这是什么原因?要怎么解决

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-10 23:25
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    这个问题可能是由于子弹对象的生命周期管理出现了问题导致的。在你的代码中,当你按下空格键发射子弹时,你没有为子弹对象分配一个图像给 self.image 属性,并且没有正确地将子弹添加到精灵组(sprite group)中。这两个问题可能会导致在发射子弹时程序崩溃或闪退。下面是解决这个问题的步骤:

    首先,在 Bullet 类的 __init__ 方法中,你需要确保正确地设置了子弹的图像和精灵组。修改后的代码如下:

    class Bullet(pygame.sprite.Sprite):
        def __init__(self, x, y):
            pygame.sprite.Sprite.__init__(self)  # 调用父类的构造函数
            self.image = pygame.Surface((10, 20))  # 创建子弹图像
            self.image.fill(YELLOW)  # 设置子弹颜色为黄色
            self.rect = self.image.get_rect()  # 创建矩形对象并设置初始位置
            self.rect.x = x  # 设置子弹的初始位置x坐标
            self.rect.bottom = y  # 设置子弹的初始位置y坐标(底部对齐)
            self.speedy = -8  # 设置子弹的移动速度(向下移动)
            all_sprites.add(self)  # 将子弹添加到所有精灵组中(用于渲染)
    

    在这个修改中,我们确保了子弹有一个有效的图像属性,并将其添加到 all_sprites 精灵组中。这将允许你正确地在屏幕上渲染子弹对象。

    请注意,上面的修改仅针对你的代码中的问题进行了调整。你的代码中还有其他地方可能存在问题或可以改进的地方。如果还有其他问题或需要进一步帮助,请继续询问。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月10日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见