首页 > 解决方案 > 我如何在pygame中绘制子弹

问题描述

我在尝试绘制子弹时遇到问题,但它根本不起作用,这是
我正在观看本教程 的代码https://youtu.be/FfWpgLFMI7w 我无法在没有出现子弹的任何地方找到答案我试图复制教程, 在 youtube 上搜索我已经让敌人和玩家移动了在此处输入图像描述

....
import pygame
import random

pygame.init()
pygame.display.init()

screen = pygame.display.set_mode((800, 600))
bacground = pygame.image.load("background.png")




playerimg = pygame.image.load("spaceship.png")
playerX_change = 0
playerX = 360
playerY = 480
def player(x, y):
    screen.blit(playerimg, (x, y))

enemyimg = pygame.image.load("enemy.png")
enemyX = random.randint(0,736)
enemyY = random.randint(50,150)
enemyX_change = 4
enemyY_change = 40


def enemy(x, y):
    screen.blit(enemyimg, (x, y))


bulletimg = pygame.image.load("enemy.png")
bulletX = playerX
bulletY = playerY
bulletX_change = 0
bulletY_change = 40
bullet_state = "ready"

def fire_bullet(x, y):
    global bullet_state
    bullet_state = "fire"
    screen.blit(bulletimg, (x + 16, y+10))


# drawing player on screen



# game loop
running = True

while running == True:
    screen.fill((200, 200, 0))
    screen.blit(bacground,(0,0))
    player(playerX, playerY)
    enemy(enemyX, enemyY)
    pygame.display.update()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            player(playerX, playerY)
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT:
            playerX_change = -5
        if event.key == pygame.K_RIGHT:
            playerX_change = 5
        if event.type == pygame.K_SPACE:
            fire_bullet(playerX ,bulletY)
    if event.type == pygame.KEYUP:
        if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
            playerX_change = 0


    playerX += playerX_change
    enemyX += enemyX_change
    if bullet_state == "fire" :
        fire_bullet(bulletX,bulletY)
        bulletY -= bulletY_change
    if enemyX <= 0:
        enemyX_change = 4
        enemyY += enemyY_change
    if enemyX>= 736:
        enemyX_change = -4
        enemyY += enemyY_change
    if playerX <= 0:
        playerX = 0
    if playerX >= 736:
        playerX = 736
...

标签: pythonpygame

解决方案


正如 Rabbid76 已经说过的:您必须在绘制子弹后更新显示。

想一想你的代码是如何运行的:

while running:
    screen.fill((200, 200, 0))
    screen.blit(bacground,(0,0))
    player(playerX, playerY)
    enemy(enemyX, enemyY)
    pygame.display.update()
    ...
    fire_bullet(playerX ,bulletY)
    ...
  • 你填满屏幕
  • 您绘制背景图像
  • 你画玩家
  • 你画出敌人
  • 您更新显示并查看背景、玩家和敌人
  • 你画子弹
  • 你填满屏幕
  • 您绘制背景图像
  • 你画玩家
  • 你画出敌人
  • 您更新显示并查看背景、玩家和敌人
  • 你画子弹
  • 你填满屏幕
  • ...

因此,您会看到,每次绘制子弹时,都会立即填满屏幕并在其上绘制背景图像。

在为框架绘制所有图像pygame.display.update() 调用,而不是介于两者之间。


推荐阅读