如何用Python编码的游戏拍摄无限子弹?

时间:2015-06-11 03:10:27

标签: python sprite game-physics infinite

我的游戏代码非常长,但是我会粘贴一个重要的部分,这是一个子弹射击部分。游戏本质上是一个真人快打式游戏,但有飞行机器人和子弹。

在游戏循环之前,我首先为子弹和机器人预定义了函数:

                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)

现在我的问题是,当我射击子弹时,它会射击,但我只能射击一次,直到它从我的程序屏幕上移开(没关系,我做到了所以它返回到机器人一旦它离开屏幕也是如此)。否则,如果我继续按键进行射击,它只会将子弹坐标返回原来的位置(如我射击,如果我再次射击,我可以看到子弹消失以返回其原始位置)。

没有无数的子弹,我想知道如何修改函数和一些变量(可能)以使其发生。

1 个答案:

答案 0 :(得分:1)

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

  1. 制作一类子弹,以便制作不同的物品。
  2. 每次按下拍摄按钮后,只需在子弹对象上创建一个实例,然后不断更新。
  3. 在更新方法中,您将进行子弹移动。
  4. 最后一步是将子弹对象从屏幕上摧毁。一个简单的方法是使用if语句检查是否达到了某个x或y长度,如果是,则删除该sprite或object(在这种情况下为bullet)。
  5. 以下是我使用的子弹类的示例。在此,假设char位于屏幕的底部并向上射出子弹,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
    

    如果您仍然需要查看完整图片,可以在此处查看我的代码:https://github.com/deepaksandhu/SpaceTurds/blob/master/game.py

    这里还有制作子弹的优秀教程: http://programarcadegames.com/python_examples/show_file.php?file=bullets.py