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

2024-06-16 12:17:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我的游戏有一个很长的代码,但我会粘贴在重要的部分,即子弹射击部分。游戏本质上是一个致命的Kombat风格的游戏,但有飞行机器人和子弹。在

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

                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)   

那么移动对象的众多变量:

^{pr2}$

在那之后,代码运行了很长一段时间(大约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)

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

没有无限多的项目符号,我想知道如何修改函数和一些变量(可能)使之发生。在


Tags: orkeyeventifchangepygameyrxr
1条回答
网友
1楼 · 发布于 2024-06-16 12:17:42

你需要在你的代码中使用精灵。没有精灵也可以做到,但这将是一项艰巨的任务。在

  1. 制作一类项目符号,这样你就可以制作不同的对象了。在
  2. 每次按下“射击”按钮时,只要创建一个bullet对象的实例,并不断更新它。在
  3. 在更新方法中,你将使子弹移动。在
  4. 最后一步是在子弹离开屏幕后销毁它。一种简单的方法是使用if语句来检查是否达到了某个x或y长度,如果达到了,则删除该精灵或对象(在本例中是bullet)。在

下面是我使用的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

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

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

相关问题 更多 >