如何在用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)
现在我的问题是,当我射击子弹时,它会射击,但我只能射击一次,直到它离开我的程序屏幕为止(没关系,我做了,所以一旦它离开屏幕,它也会回到机器人那里)。否则,如果我继续按键射击,它只会将子弹坐标返回到它原来应该在的位置(就像我射击一样,如果我再次射击,我可以看到子弹消失,返回到它原来的位置)
没有无限多的项目符号,我想知道如何修改函数和一些变量(可能)以实现这一点。您需要在代码中使用缺少的精灵。它也可以在没有精灵的情况下完成,但这将是一项艰巨的任务
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中吗?