我的游戏代码非常长,但是我会粘贴一个重要的部分,这是一个子弹射击部分。游戏本质上是一个真人快打式游戏,但有飞行机器人和子弹。
在游戏循环之前,我首先为子弹和机器人预定义了函数:
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)
现在我的问题是,当我射击子弹时,它会射击,但我只能射击一次,直到它从我的程序屏幕上移开(没关系,我做到了所以它返回到机器人一旦它离开屏幕也是如此)。否则,如果我继续按键进行射击,它只会将子弹坐标返回原来的位置(如我射击,如果我再次射击,我可以看到子弹消失以返回其原始位置)。
没有无数的子弹,我想知道如何修改函数和一些变量(可能)以使其发生。
答案 0 :(得分:1)
您需要在代码中使用缺少的精灵。它也可以在没有精灵的情况下完成,但这将是一项艰巨的任务。
以下是我使用的子弹类的示例。在此,假设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