python - 我如何在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
...
解决方案
正如 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()
后调用,而不是介于两者之间。
推荐阅读
- three.js - 从多个元素在three.js中生成形状
- django - 使用 Concat 进行注释的查询集给出错误
- android - 如何从 firebase 数据库中检索子值并将它们显示在布局列表中?
- mysql - SQL:获取组第一行的正确方法
- python - 根据 ScatterPolar 的颜色条更改填充颜色
- loops - 字典赋值被循环中的静态值覆盖
- html - 如何将带有圆底角的边框顶部添加到
- 元素?
- android - Android Socket Io
- git - 如何维护具有截断历史的轻量级 Git 存储库
- java - Java 枚举是否在 Android 运行时分配堆内存?