如何在用Python编写的游戏中射击无限子弹?

如何在用Python编写的游戏中射击无限子弹?,python,sprite,game-physics,infinite,Python,Sprite,Game Physics,Infinite,我的游戏有一个很长的代码,但是我会把最重要的部分粘贴进去,那就是子弹射击部分。该游戏本质上是一个凡人的康巴特式游戏,但有飞行机器人和子弹 在游戏循环之前,我首先预定义了子弹和机器人的功能: def robotr(xr,yr): gameDisplay.blit(robrimg, (xr,yr)) def robotl(xl,yl): gameDispl

我的游戏有一个很长的代码,但是我会把最重要的部分粘贴进去,那就是子弹射击部分。该游戏本质上是一个凡人的康巴特式游戏,但有飞行机器人和子弹

在游戏循环之前,我首先预定义了子弹和机器人的功能:

                def robotr(xr,yr):
                    gameDisplay.blit(robrimg, (xr,yr))

                def robotl(xl,yl):
                    gameDisplay.blit(roblimg, (xl,yl))

                def bulletsr(xbr,ybr):
                    pygame.draw.circle(gameDisplay, THECOLORS['orange'],(xbr,ybr), 10)

                def bulletsl(xbl,ybl):
                    pygame.draw.circle(gameDisplay, THECOLORS['orange'],(xbl,ybl), 10)   
然后,移动对象的众多变量:

                xr = 929
                yr = 250
                xl = 250
                yl = 250
                ####
                xbr=950
                ybr=300
                xbl=380
                ybl=300
                #####
                xbr_change = 0
                ybr_change = 0
                ybl_change = 0
                xbl_change = 0 
                ####
                xr_change = 0
                yr_change = 0
                xl_change = 0
                yl_change = 0
                robotr_speed = 3000
                robotl_speed = 3000   
在那之后,代码运行了很长时间(大约300-400行),但在我射击子弹的时候,我有一个类似这样的事件来表示子弹随着机器人的箭头键移动而“移动”:

                            if event.type == pygame.KEYDOWN:
                            #-------PLAYER 1 MOVEMENT-------
                            #OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
                            if event.key == pygame.K_a:                                    
                                xr_change = -5
                                xbr_change = -5 #I have to change the position of the bullet as well so that it doesn't stay in one place and rather shoots from the robot (duh.)
然后是一个类似的代码来射击子弹:

                                #-------FIRE CANNON MK1-------
                            #OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
                            if event.key == pygame.K_LSHIFT:
                                bulletsfx=pygame.mixer.Sound ('boomchickchickmp3.ogg')
                                bulletsfx.play()  
                                bulletsfx.set_volume(0.2)
                                xbl_change = 5
                                if xbl_change == 5:
                                    bulletsl(xbl,ybl)
                                    xbl=xl
当然,我也为右边的机器人多次定义了这样的代码

在我的程序接近尾声时(这是我的尾声的一个简短形式,因为我有额外的变量,这样事情就不会从屏幕上掉下来,但暂时不考虑这一点),我有一个这样的代码,这样我就可以将更改重新定义回“0”,以便可以重用移动,等等:

                            if event.type == pygame.KEYUP:
                            #Player 1 events
                            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == pygame.K_UP or event.key == pygame.K_DOWN or event.key == pygame.K_RCTRL or event.key == pygame.K_DELETE:  #or event.key == pygame.K_RSHIFT:
                                xr_change = 0
                                yr_change = 0
                                xbr_change= 0
                                ybr_change= 0                                   
                            #Player 2 events
                            if event.key == pygame.K_a or event.key == pygame.K_d or event.key == pygame.K_w or event.key == pygame.K_s or event.key == pygame.K_LCTRL or event.key == pygame.K_f: #or event.key == pygame.K_LSHIFT:
                                xl_change = 0
                                yl_change = 0      
                                xbl_change= 0
                                ybl_change= 0





                    ##
                    xr += xr_change
                    yr += yr_change
                    xl += xl_change
                    yl += yl_change
                    ##
                    xbr += xbr_change
                    ybr += ybr_change
                    xbl += xbl_change
                    ybl += ybl_change                       
                    ##      
                    bulletsr(xbr,ybr)
                    bulletsl(xbl,ybl)                                
                    robotr(xr,yr)
                    robotl(xl,yl)  

                    pygame.display.update()
                    clock.tick(320)
现在我的问题是,当我射击子弹时,它会射击,但我只能射击一次,直到它离开我的程序屏幕为止(没关系,我做了,所以一旦它离开屏幕,它也会回到机器人那里)。否则,如果我继续按键射击,它只会将子弹坐标返回到它原来应该在的位置(就像我射击一样,如果我再次射击,我可以看到子弹消失,返回到它原来的位置)


没有无限多的项目符号,我想知道如何修改函数和一些变量(可能)以实现这一点。

您需要在代码中使用缺少的精灵。它也可以在没有精灵的情况下完成,但这将是一项艰巨的任务

  • 制作一个项目符号类,以便可以制作不同的项目符号对象
  • 在每次按下“射击”按钮并不断更新子弹对象后,只需创建子弹对象的实例
  • 在更新方法中,您将使项目符号移动
  • 最后一步是在子弹物体离开屏幕后销毁它。一种简单的方法是使用if语句检查是否达到了某个x或y长度,如果达到了,则删除该精灵或对象(本例中为项目符号)
  • 下面是我使用的bullet类的一个示例。在这种情况下,假设字符位于屏幕底部,并向上发射y+=-10的子弹

    class Bullet(pygame.sprite.Sprite):
    def __init__(self):
        super(Bullet, self).__init__()
        self.image = pygame.Surface([10,40])
        self.image.fill(RED)
        self.rect = self.image.get_rect()
    
    def update(self):
        self.rect.y -= 10
    
    如果您仍然需要查看完整图片,可以在此处查看我的代码:

    这里还有一个制作子弹的优秀教程:

    这个项目在pygame中吗?