为了账号安全,请及时绑定邮箱和手机立即绑定

Python Space Invaders with PyGame 故障排除

Python Space Invaders with PyGame 故障排除

阿晨1998 2021-12-17 15:36:57
我正在使用 pygame 开发一个简单的太空入侵者游戏,并且首先在我的游戏中为不同的对象或精灵创建类。现在的目标是创建一个可以在 x 轴上来回移动并发射弹丸的角色。我设法让角色在屏幕上来回移动,但是在拍摄时它不起作用,我根本无法让它运行。它告诉我 x 和 y 缺少位置参数,但是当我将镜头附加到数组时,我为其分配了值。我究竟做错了什么?这是我认为这部分应该如何进行。我分配了一个类,它是射击,这是我将要射击的射弹。在定义它时,我设置了参数,以便射弹发射的位置根据我的角色所在的位置而变化。然后我加载我在一个单独文件夹中的图像并为弹丸分配一个速度。接下来,我将允许它在我的主循环中运行的更新部分放在下面。通过设置 if 语句,我确保如果射弹离开屏幕,它就会消失。通过制作一个阵列,我可以一次在屏幕上有多个射弹,并且它们不会相互删除。如果用户按下空格键,则应将新射弹添加到阵列中并发射。因为我是新手,所以我不知道我的概念是否正确,以及我的小错误是否是 米制作。我在教程中学到的不是在课堂上,也没有更新功能,所以这就是我一直试图自己实现的。import pygame, sysfrom pygame import *pygame.init()screen = pygame.display.set_mode((800,600))pygame.display.set_caption("Space Invaders")pygame.mouse.set_visible(0)WIDTH = 800vel = 5width = 64BLACK = (0, 0, 0)all_sprites = pygame.sprite.Group()class Player(pygame.sprite.Sprite):    def __init__(self):        pygame.sprite.Sprite.__init__(self)        self.image = pygame.image.load("images\ship.png")        self.rect = self.image.get_rect()        self.rect.center = (WIDTH/2, 550)    def update(self, keys, *args):        if keys[pygame.K_LEFT] and self.rect.x > vel:            self.rect.x -= vel        if keys[pygame.K_RIGHT] and self.rect.x < 800 - width - vel:            self.rect.x += vel         screen.blit(self.image, self.rect)class Shot(pygame.sprite.Sprite):    def __init__(self,x,y):        pygame.sprite.Sprite.__init__(self)        self.x = x        self.y = y        self.image = pygame.image.load("images\laser.png")        self.rect = self.image.get_rect()        self.vel = 10    def update(self, keys, *args):        for shot in shots:            if shot.x < 500 and shot.x >0:                shot.y -= shot.vel            else:                self.kill()            screen.blit(self.image, self.rect)        if keys[pygame.K_SPACE]:            shots.append(Shot(x, 550))#class EnemyAlien(pygame.sprite.Sprite): #   def __init__(self):如果有人想看一看,让我知道我可能需要改变什么,或者我在这里完全错了。谢谢你。编辑我更新了它,现在我不再收到错误消息并且文件将运行但当我按空格时没有任何反应。我不能开火,而且我的角色有奇怪的滞后,看起来每当它移动时有更多的东西被拖到后面。编辑我也在尝试不同的方法,这没有错误,但是当我按下空格键时,只会在左上角生成射弹,然后几秒钟后它就会消失。
查看完整描述

2 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

有一个基本的误解。Shot源自pygame.sprite.Sprite. 它必须在的唯一容器是pygame.sprite.Groupall_sprites)。
您不需要单独的容器shots

Akso 你不需要初始Shot对象,因为不是 aShot生成 new Shot,而是Player生成一个 new Shot:


class Player(pygame.sprite.Sprite):


    # [...]


    def update(self, keys, *args):

        if keys[pygame.K_LEFT] and self.rect.x > vel:

            self.rect.x -= vel

        if keys[pygame.K_RIGHT] and self.rect.x < 800 - width - vel:

            self.rect.x += vel 


        if keys[pygame.K_SPACE]:

            all_sprites.add(Shot(self.rect.centerx, 550)) # <---- new shot 


all_sprites = pygame.sprite.Group()

player = Player() 

all_sprites.add(player)

类Shot,只需要更新它自己的位置 ( .rect) 和.kill()它自己。


class Shot(pygame.sprite.Sprite):

    def __init__(self,x,y):

        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.image.load("images\laser.png")

        self.rect = self.image.get_rect()

        self.rect.center = (x, y) 

        self.vel = 10

    def update(self, keys, *args):

        if self.rect.x < 500 and self.rect.x > 0:

            self.rect = self.rect.move(0, -self.vel)

        else:

            self.kill()

请注意,您screen.blit(self.image, self.rect)在and的.update方法中不需要任何内容,因为这就是:PlayerShotpygame.sprite.Group.draw()


查看完整回答
反对 回复 2021-12-17
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

此行导致错误: shot = Shot()

__init__方法Shot需要一个xy位置参数,但你没有通过他们。


查看完整回答
反对 回复 2021-12-17
  • 2 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信