首页 > 解决方案 > 提到了 pygame 代码,需要按规定进行一些修改:

问题描述

这是我的space-arcade pygame的源代码。这是一个非常简单的子弹,也可以发射子弹,但现在这些子弹不会影响屏幕中出现的障碍物。

问题:如何在发射第一颗子弹后发射多颗子弹,否则不等待第一颗子弹通过 y <= 0 再发射另一颗子弹?

请帮助我解决这个问题,如果可能的话,重新编写这段代码并进行一些调整

import random

pygame.init()

screen = pygame.display.set_mode((800, 600))  

pygame.display.set_caption("Space Invader")    
icon = pygame.image.load("space-invaders.png")  
pygame.display.set_icon(icon)  

background = pygame.image.load("background.png") 

player_image = pygame.image.load("space-invaders.png")    
playerX = 370  
playerY = 480  
playerX_change = 0
playerY_change = 0

def player(x, y):
    screen.blit(player_image, (x, y))  

obs_image = pygame.image.load("cave-painting (1).png")    
obsX = random.randint(0, 800)       
obsY = random.randint(0, 100)        
obsX_change = 2      
obsY_change = 0.3      

def obstacle(x, y):
    screen.blit(obs_image, (x, y))  

bullet_image = pygame.image.load("bullet.png")
bulletX = 0  
bulletY = 0 
bulletX_change = 0
bulletY_change = 10  
bullet_state = "ready" 


def fire_bullet(x, y):
    global bullet_state  # Globaling it, inorder to access it inside this func.
    bullet_state = "fire"
    screen.blit(bullet_image, (x,y))

running = True
while running:
    screen.fill( (0, 0,0) )  
    screen.blit(background, (0, 0))  

    for event in pygame.event.get():  
        if event.type == pygame.QUIT:  
            running = False  
        
        if event.type == pygame.KEYDOWN: 
            if event.key == pygame.K_LEFT:  
                playerX_change = -4  
            if event.key == pygame.K_RIGHT:  
                playerX_change = 4 
            if event.key == pygame.K_UP:  
                playerY_change = -4
            if event.key == pygame.K_DOWN:  
                playerY_change = 4
            if event.key == pygame.K_SPACE:  
                if bullet_state is "ready":
                    bulletX = playerX
                    bulletY = playerY
                    fire_bullet(bulletX, bulletY)

        if event.type == pygame.KEYUP:  
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                playerX_change = 0  
            if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                playerY_change = 0

    playerX += playerX_change  
    playerY += playerY_change 

    # Stopping our player beyond screen:
    if playerX <= 0:
        playerX = 0
    elif playerX >= 765:  
        playerX = 765
    elif playerY <= 200:
        playerY = 200
    elif playerY >= 480:
        playerY = 480

    obsX += obsX_change
    obsY += obsY_change

    # Movement mechanics for obstacles:
    if obsX <= 0:
        obsX_change = 3
        obsY += obsY_change
    elif obsX >= 736:
        obsX_change = -3
        obsY += obsY_change
    
    if bulletY <= 0:
        bulletY = 480
        bullet_state = "ready"

    if bullet_state is "fire":
        fire_bullet(bulletX, bulletY)
        bulletY -= bulletY_change
  
    player(playerX, playerY)  
    obstacle(obsX, obsY)  

    pygame.display.update()

另外这里是上述代码中使用的源图片:

标签: pythonpygame

解决方案


您必须添加一个项目符号列表:

bullet_list = []

当一个新的子弹产生时,将一个新的位置添加到子弹列表的头部:

if event.key == pygame.K_SPACE:  
    bullet_list.insert(0, [playerX, playerY])

循环移动并绘制子弹。从列表中删除窗口外的项目符号:

while running:
    # [...]

    for i in range(len(bullet_list)):
        bullet_list[i][1] -= bulletY_change
        if bullet_list[i][1] < 0:
            del bullet_list[i:]
            break

    # [...]

    for bullet in bullet_list:
        screen.blit(bullet_image, bullet)

完整示例:

import pygame
import random

pygame.init()

screen = pygame.display.set_mode((800, 600))  
clock = pygame.time.Clock()

pygame.display.set_caption("Space Invader")    
icon = pygame.image.load("space-invaders.png")  
pygame.display.set_icon(icon)  

background = pygame.image.load("background.png") 

player_image = pygame.image.load("space-invaders.png")    
playerX = 370  
playerY = 480  
playerX_change = 0
playerY_change = 0

def player(x, y):
    screen.blit(player_image, (x, y))  

obs_image = pygame.image.load("cave-painting (1).png")   
obsX = random.randint(0, 800)       
obsY = random.randint(0, 100)        
obsX_change = 2      
obsY_change = 0.3      

def obstacle(x, y):
    screen.blit(obs_image, (x, y))  

bullet_image = pygame.image.load("bullet.png")
bulletX_change = 0
bulletY_change = 10  
bullet_list = []

def draw_bullets(bullets):
    for bullet in bullets:
        screen.blit(bullet_image, bullet)

running = True
while running:
    clock.tick(60)
    screen.fill( (0, 0,0) )  
    screen.blit(background, (0, 0))  

    for event in pygame.event.get():  
        if event.type == pygame.QUIT:  
            running = False  

        if event.type == pygame.KEYDOWN: 
            if event.key == pygame.K_LEFT:  
                playerX_change = -4  
            if event.key == pygame.K_RIGHT:  
                playerX_change = 4 
            if event.key == pygame.K_UP:  
                playerY_change = -4
            if event.key == pygame.K_DOWN:  
                playerY_change = 4
            if event.key == pygame.K_SPACE:  
                bullet_list.insert(0, [playerX, playerY])

        if event.type == pygame.KEYUP:  
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                playerX_change = 0  
            if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                playerY_change = 0

    playerX += playerX_change  
    playerY += playerY_change

    # Stopping our player beyond screen:
    if playerX <= 0:
        playerX = 0
    elif playerX >= 765:  
        playerX = 765
    elif playerY <= 200:
        playerY = 200
    elif playerY >= 480:
        playerY = 480

    obsX += obsX_change
    obsY += obsY_change

    # Movement mechanics for obstacles:
    if obsX <= 0:
        obsX_change = 3
        obsY += obsY_change
    elif obsX >= 736:
        obsX_change = -3
        obsY += obsY_change

    for i in range(len(bullet_list)):
        bullet_list[i][1] -= bulletY_change
        if bullet_list[i][1] < 0:
            del bullet_list[i:]
            break
  
    player(playerX, playerY)  
    obstacle(obsX, obsY)  
    draw_bullets(bullet_list)

    pygame.display.update()

推荐阅读