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