Pygame精灵无法显示求助:加载精灵图像后不显示问题排查
问题分析与解决
你遇到的问题其实是两个很容易忽略的绘制细节,调整后就能正常显示精灵了:
- 绘制顺序搞反了:你先调用
screen.blit(player.image,player.rect)绘制精灵,紧接着又用screen.blit(bg,(0,0))把背景铺满整个屏幕——这相当于把精灵直接画在了背景下面,自然看不到它! - 主循环中没有持续重绘元素:你的初始化代码里只绘制了一次精灵、背景和地板,但主循环里没有重复执行这些绘制操作,即使后续调整了内容,也不会更新到屏幕上(不过当前你的核心问题是绘制顺序)
修正后的代码
这里是调整后的完整代码,我标注了关键修改的地方:
# -*- coding: utf-8 -*- import pygame # Defining Sprite class class Character(pygame.sprite.Sprite): def __init__(self, location): # Call the parent class (Sprite) constructor super().__init__() self.image = pygame.transform.scale(pygame.image.load("mario-sprite.jpg"),(50,30)) self.rect = self.image.get_rect() print(self.rect) self.rect.x = location[0] self.rect.y = location[1] pygame.init() # Set up the drawing window screen = pygame.display.set_mode([1000, 650]) print(screen) bg = pygame.image.load('bk_cloud.jpg') bg = pygame.transform.scale(bg, (1000, 650)) accesor = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' tiles = [] for c in accesor: temp = pygame.image.load('letter_'+c+'.png') tiles.append(pygame.transform.scale(temp, (100, 50))) print(bg) all_sprites_list = pygame.sprite.Group() player = Character([10,570]) all_sprites_list.add(player) # 把精灵加入精灵组,方便批量绘制 def update_floor(i): for j in range(10): screen.blit(tiles[j],((((i+j)%10)*100),600)) pos = 0 clock=pygame.time.Clock() # Run until the user asks to quit running = True while running: # Did the user click the window close button? for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # --- 关键修改:每次循环都按正确顺序重绘所有元素 --- # 1. 先画最底层的背景 screen.blit(bg,(0,0)) # 2. 画中间层的精灵 all_sprites_list.draw(screen) # 3. 画最上层的地板 update_floor(pos) pos = pos + 1 # 取消注释可让地板滚动起来 # Update the display with new content pygame.display.update() clock.tick(60) # 调高帧率让画面更流畅 # Done! Time to quit. pygame.quit()
额外提示
- 绘制顺序永远遵循从后到前的逻辑:先画最底层的背景,再画中间的角色、物体,最后画最上层的UI或特效。
- 尽量使用精灵组(
pygame.sprite.Group)管理精灵,调用group.draw(screen)可以一次性绘制所有精灵,比单独blit更高效便捷。 - 所有绘制操作都要放在主循环里、
pygame.display.update()之前,这样每次循环都会重新渲染完整画面。
内容的提问来源于stack exchange,提问作者Pranav Bharadwaj
相关产品推荐
相关产品推荐

