I';我想用pygame做一个西部狂野游戏,但我能';我无法让拍摄功能正常工作

I';我想用pygame做一个西部狂野游戏,但我能';我无法让拍摄功能正常工作,pygame,2d,Pygame,2d,我一直在尝试在Pygame中制作一个wild west游戏,玩家与NPC决斗,但我无法让射击功能正常工作。我基本上一直试图保持它的简单,我有一系列的功能,使子弹穿过屏幕,但他们没有工作。代码如下: import pygame, time pygame.init() display_width = 800 display_height = 600 win = pygame.display.set_mode((display_width,display_height)) pygame.displ

我一直在尝试在Pygame中制作一个wild west游戏,玩家与NPC决斗,但我无法让射击功能正常工作。我基本上一直试图保持它的简单,我有一系列的功能,使子弹穿过屏幕,但他们没有工作。代码如下:

import pygame, time
pygame.init()

display_width = 800
display_height = 600

win = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption('The Old Wild West')

black = (0,0,0)
white = (255,255,255)

clock = pygame.time.Clock()
dead = False
avatar = pygame.image.load('cowboy.jfif')
avatar2 = pygame.image.load('enemy.jfif')
bullet = pygame.image.load('bullet.png')
bx2 = 330
bx3 = 440
bx4 = 550
bx = 220
by = 220
bspeed = 165
x =  50
ex = 550
ey = 225
y = 200
x_change = 0
speed = 0

def cowboy(x,y):
    win.blit(avatar, (x,y))
def enemy(ex, ey):
    win.blit(avatar2, (ex, ey))
def shootframe1():
    win.blit(bullet, (bx, by))
def antiframe1():
    pygame.draw.rect(win, (255, 255, 255), (bx, by, 50, 150))
def shootframe2():
    win.blit(bullet, (bx2, by))
def antiframe2():
    pygame.draw.rect(win, (255, 255, 255), (bx2, by, 50, 150))
def shootframe3():
    win.blit(bullet, (bx3, by))
def antiframe3():
    pygame.draw.rect(win, (255, 255, 255), (bx3, by, 50, 150))
def shootframe4():
    win.blit(bullet, (bx4, by))
def antiframe4():
    pygame.draw.rect(win, (255, 255, 255), (bx4, by, 50, 150))
  
while not dead:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            dead = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                x_change = -5
            elif event.key == pygame.K_RIGHT:
                x_change = 5
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                x_change = 0
        if event.type == pygame.K_SPACE:
            if event.key == pygame.K_SPACE:
                shootframe1()
                time.sleep(0.5)
                antiframe1()
                shootframe2()
                time.sleep(0.5)
                antiframe2()
                shootframe3()
                time.sleep(0.5)
                antiframe3()
                shootframe4()
                time.sleep(0.5)
                antiframe4()
        
   x += x_change

   win.fill(white)
   cowboy(x,y)
   enemy(ex, ey)

    
   pygame.display.update()
   clock.tick(60)

pygame.quit()
quit()
这里是cowboy.jfif、敌军.jfif和bullet.png:


请帮我解决这一困惑。

我大幅更新了您的代码,我尝试对所有内容都进行了很好的注释,以便清楚发生了什么

首先,你把子弹拉到屏幕上,然后把屏幕填成白色,这样子弹就不会出现了

其次,空格键没有触发,因为您正在检查空格键是否为事件类型。所以我把它移到了
event.type==pygame.KEYDOWN

第三,使用time.sleep(0.5)会使游戏窗口冻结和结巴,所以我会避免这样做

如果您对更改有任何疑问,请随时提问

导入pygame,时间
pygame.init()
显示宽度=800
显示高度=600
win=pygame.display.set_模式((显示宽度、显示高度))
pygame.display.set_标题('TheOldWildWest')
黑色=(0,0,0)
白色=(255255)
clock=pygame.time.clock()
死=假
avatar=pygame.image.load('cowboy.jfif')
avatar2=pygame.image.load('敌方.jfif')
bullet=pygame.image.load('bullet.png')
bx2=330
bx3=440
bx4=550
bx=220
by=220
bspeed=165
x=50
ex=550
ey=225
y=200
x_变化=0
速度=0
def牛仔(x,y):
win.blit(阿凡达,(x,y))
def敌人(ex,ey):
win.blit(阿凡达2,(前,安永))
#一个单发功能,在下面的项目列表中添加一个新项目。
def shoot():
项目符号列表追加(项目符号(bx,by))
#保存单个项目符号信息的项目符号类
类别项目符号:
定义初始化(self,x,y):
#初始化项目符号的变量
self.x=x
self.y=y
self.image=pygame.image.load('bullet.png')
自身子弹头速度=165
#通过在每次绘制后更新x变量()在屏幕上移动项目符号
定义移动项目符号(自身):
self.x+=self.bullet\u速度
def牵引(自):
#获取曲面(窗口)
surface=pygame.display.get_surface()
#把子弹对准屏幕
blit(self.image,(self.x,self.y))
#使用上述功能更新其位置
自我。_移动_子弹()
bullet_list=[]。#由于用户可以发射多个子弹,我们需要跟踪它们
虽然没有死:
win.fill(白色)#将此移到顶部,以便在绘制任何内容之前填充屏幕
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
死=真
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_左:
x_变化=-5
elif event.key==pygame.K_RIGHT:
x_变化=5
如果event.key==pygame.K_SPACE:#将此移到此处
射出子弹
如果event.type==pygame.KEYUP:
如果event.key==pygame.K_左或event.key==pygame.K_右:
x_变化=0
x+=x_变化
牛仔(x,y)
敌人(前,后)
#通过迭代列表,将每个项目符号绘制到屏幕上
对于项目符号列表中的项目符号:
#如果项目符号已退出屏幕,我们将其从列表中删除,以便它们不会保留在内存中
如果bullet.x>显示宽度:
项目符号列表。删除(项目符号)
#绘制项目符号(从类中调用)
bullet.draw()
pygame.display.update()
时钟滴答(60)
pygame.quit()
退出

您可以指定问题的具体内容吗?如果event.type==pygame.K_SPACE,您可以先删除行
。没有“K_SPACE”的事件类型。我想在播放器按空格键时使picture bullet.png穿过屏幕,但它不起作用。这就是问题所在。我尝试删除
if event.type==pygame.K_SPACE
。它仍然不起作用。你不应该移除它。没有
pygame.K_SPACE
的事件类型,但是有一个带有该常量的事件键。如果event.type==pygame.KEYDOWN
,您可能打算执行
操作,然后执行
如果event.key==pygame.K_SPACE