微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

提到了pygame代码,并且需要根据需要进行一些修改:

如何解决提到了pygame代码,并且需要根据需要进行一些修改:

这是我的 space-arcade pygame 的源代码。这是一种非常简单的方法,它也可以发射子弹,但目前这些子弹不会影响屏幕上的障碍物。

问题:如何在发射第一枚子弹后立即发射多枚子弹,否则不等第一枚子弹通过y

请帮助我解决此问题,并在可能的情况下重新编写此代码

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,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,y))

running = True
while running:
    screen.fill( (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()

这也是上述代码中使用的源图片

解决方法

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

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,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) )  
    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,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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。