Python 为“制造子弹”;“太空入侵者”;

Python 为“制造子弹”;“太空入侵者”;,python,pygame,Python,Pygame,我想在我的《太空入侵者》中为我的飞船制造投射物。我认为现在唯一不起作用的是显示所有的投射物,因为我不知道如何显示,这就是为什么我尝试使用blit,但它不起作用。另外,我想延迟每个发射之间的时间,但我不知道如何做到这一点。 到目前为止,这是我做过的最先进的屏幕相关程序 import pygame pygame.init() class Player(): def __init__(self): self.originalImage = pygame.image.load(

我想在我的《太空入侵者》中为我的飞船制造投射物。我认为现在唯一不起作用的是显示所有的投射物,因为我不知道如何显示,这就是为什么我尝试使用blit,但它不起作用。另外,我想延迟每个发射之间的时间,但我不知道如何做到这一点。 到目前为止,这是我做过的最先进的屏幕相关程序

import pygame
pygame.init()

class Player():
    def __init__(self):
        self.originalImage = pygame.image.load("ship.png")
        self.image = self.originalImage
        self.xposition = 480
        self.yposition = 450
        self.speed = 1

class Projectile():
    def __init__(self):
        self.originalImage = pygame.image.load("shot.png")
        self.image = self.originalImage
        self.xposition = player.xposition
        self.yposition = player.yposition
        self.speed = 1


size = width, height = 960, 540
screen = pygame.display.set_mode(size)
background = 0, 0, 0
player = Player()
projectile = Projectile()
projectiles = []
keys = pygame.key.get_pressed()

while True:
    screen.fill(background)

    for projectile in projectiles:
        if projectile.yposition < height:
            projectile.yposition -= projectile.speed
        else:
            projectiles.pop(projectiles.index(projectile))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    if (keys[pygame.K_RIGHT] or keys[pygame.K_d]) == True:
        player.xposition += player.speed
    if (keys[pygame.K_LEFT] or keys[pygame.K_a]) == True:
        player.xposition -= player.speed
    if (keys[pygame.K_SPACE] or keys[pygame.K_w] or keys[pygame.K_UP]) == True:
        projectiles.append(projectile)

    for projectile in projectiles:
        screen.blit(projectile.image, (projectile.xposition, projectile.yposition))

    screen.blit(player.image, ((player.xposition, player.yposition)))
    pygame.display.flip()
导入pygame
pygame.init()
类播放器():
定义初始化(自):
self.originalImage=pygame.image.load(“ship.png”)
self.image=self.originalImage
self.xposition=480
self.yposition=450
自身速度=1
类():
定义初始化(自):
self.originalImage=pygame.image.load(“shot.png”)
self.image=self.originalImage
self.xposition=player.xposition
self.yposition=player.yposition
自身速度=1
尺寸=宽度,高度=960540
screen=pygame.display.set_模式(大小)
背景=0,0,0
player=player()
射弹=射弹()
射弹=[]
keys=pygame.key.get_pressed()
尽管如此:
屏幕填充(背景)
对于射弹中的射弹:
如果射弹位置<高度:
射弹位置-=射弹速度
其他:
射弹.pop(射弹.指数(射弹))
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
sys.exit()
如果(键[pygame.K_RIGHT]或键[pygame.K_d])==True:
player.xposition+=player.speed
如果(键[pygame.K_LEFT]或键[pygame.K_a])==True:
player.xposition-=player.speed
如果(键[pygame.K_SPACE]或键[pygame.K_w]或键[pygame.K_UP])==True:
射弹。附加(射弹)
对于射弹中的射弹:
screen.blit(sparket.image,(sparket.xposition,sparket.yposition))
blit(player.image,((player.xposition,player.yposition)))
pygame.display.flip()
我在注释后编辑了代码,但仍然没有任何移动…

问题出在哪里:

  • 没有任何移动,因为
    pygame.key.get_pressed()
    在游戏循环之外,即您只在启动时检查键的状态

  • 每次射击时必须创建一个新的
    投射物
    实例,否则只能射击一次

  • 要使投射物正确显示,必须先闪烁玩家精灵,然后闪烁投射物,否则玩家精灵将覆盖它们

  • 要对射击之间的延迟进行编码,请将射击冷却时间存储在一个变量中(最好是
    player
    属性),您可以在每次射击时将该变量设置为某个正值,并在每次回合中递减

  • 您使用的是
    sys.exit()
    ,但尚未导入
    sys
    ,这会使您的游戏在退出时崩溃。或者,您也可以
    引发SystemExit
    ,它的作用与sys.exit()完全相同,不需要任何导入

以下是更正后的代码:

import pygame
pygame.init()

class Player():
    def __init__(self):
        self.originalImage = pygame.image.load("ship.png")
        self.image = self.originalImage
        self.xposition = 480
        self.yposition = 450
        self.speed = 1
        self.attack_cooldown = 0   # variable to store shooting cooldown

class Projectile():
    def __init__(self):
        self.originalImage = pygame.image.load("shot.png")
        self.image = self.originalImage
        self.xposition = player.xposition
        self.yposition = player.yposition
        self.speed = 1


size = width, height = 960, 540
screen = pygame.display.set_mode(size)
background = 0, 0, 0
player = Player()
projectiles = []

while True:
    screen.fill(background)

    # decrement the current shooting cooldown
    if player.attack_cooldown > 0:
        player.attack_cooldown -= 1

    for projectile in projectiles:
        if projectile.yposition < height:
            projectile.yposition -= projectile.speed
        else:
            projectiles.pop(projectiles.index(projectile))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            raise SystemExit   # does the same thing as sys.exit() but you don't need to import sys

    keys = pygame.key.get_pressed()   # put this in the game loop

    if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
        player.xposition += player.speed
    if keys[pygame.K_LEFT] or keys[pygame.K_a]:
        player.xposition -= player.speed
    if keys[pygame.K_SPACE] or keys[pygame.K_w] or keys[pygame.K_UP]:
        if player.attack_cooldown == 0:   # shoot only when not on cooldown
            projectiles.append(Projectile())   # shoot a new projectile instead of the one you already shot
            player.attack_cooldown = 100   # add shooting cooldown, the number can be any positive integer you want

    # blit the player first
    screen.blit(player.image, ((player.xposition, player.yposition)))
    for projectile in projectiles:
        screen.blit(projectile.image, (projectile.xposition, projectile.yposition))

    pygame.display.flip()
导入pygame
pygame.init()
类播放器():
定义初始化(自):
self.originalImage=pygame.image.load(“ship.png”)
self.image=self.originalImage
self.xposition=480
self.yposition=450
自身速度=1
self.attack_冷却时间=0#存储射击冷却时间的变量
类():
定义初始化(自):
self.originalImage=pygame.image.load(“shot.png”)
self.image=self.originalImage
self.xposition=player.xposition
self.yposition=player.yposition
自身速度=1
尺寸=宽度,高度=960540
screen=pygame.display.set_模式(大小)
背景=0,0,0
player=player()
射弹=[]
尽管如此:
屏幕填充(背景)
#减少当前射击冷却时间
如果player.attack\u冷却时间>0:
player.attack\u冷却时间-=1
对于射弹中的射弹:
如果射弹位置<高度:
射弹位置-=射弹速度
其他:
射弹.pop(射弹.指数(射弹))
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
raise SystemExit#执行与sys.exit()相同的操作,但不需要导入sys
keys=pygame.key.get_pressed()#将其放入游戏循环中
如果键[pygame.K_RIGHT]或键[pygame.K_d]:
player.xposition+=player.speed
如果键[pygame.K_LEFT]或键[pygame.K_a]:
player.xposition-=player.speed
如果键[pygame.K_SPACE]或键[pygame.K_w]或键[pygame.K_UP]:
如果player.attack_冷却时间==0:#仅在未冷却时射击
射弹。附加(射弹())#发射一个新的射弹,而不是你已经发射的射弹
player.attack_冷却时间=100#加上射击冷却时间,数字可以是您想要的任何正整数
#先用闪电击球员
blit(player.image,((player.xposition,player.yposition)))
对于射弹中的射弹:
screen.blit(sparket.image,(sparket.xposition,sparket.yposition))
pygame.display.flip()
我建议使用。从
精灵
派生
投射物
Sprite
应该具有
.image
.rect
属性。添加一个方法,移动
投射物
,并在其超出边界时将其锁定。e、 g:

类投射物(pygame.sprite.sprite):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.originalImage=pygame.image.load(“shot.png”)
self.image=self.originalImage
self.rect=self.image.get_rect(中心=(player.xposition,player.yposition))
自身速度=1
def移动(自我):
自校正y-=自校正速度
如果自校正y<0:
self.kill()
创建一个包含投射物的模型:

projectles=pygame.sprite.G