You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pygame开发疑问:背景正常显示但Knight角色无法渲染

问题解决:导入战斗系统后Knight角色不显示

核心问题及修复步骤

1. 未调用角色绘制方法

原菜单代码的play()函数中,Battle_system.knight.draw仅引用了方法对象,并未执行绘制操作,导致角色不会被渲染到窗口上。

修复后的菜单play函数代码:

def play():
    while True:
        PLAY_MOUSE_POS: object = pygame.mouse.get_pos()

        #draw background
        PLAY_TEXT = get_font(45).render("This is the PLAY screen.", True, "White")
        PLAY_RECT = PLAY_TEXT.get_rect(center=(640, 260))
        SCREEN.blit(SURFACE, PLAY_RECT)
        Battle_system.draw_bg(SCREEN)
        Battle_system.draw_panel(SCREEN) 
        

        #draw characters
        Battle_system.knight.draw(SCREEN)  # 添加括号执行方法,并传入主窗口对象
        

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        pygame.display.update()

2. 重复创建显示窗口导致绘制错位

战斗系统代码中重复执行pygame.display.set_mode((1280, 720)),会创建一个独立的隐藏窗口,所有战斗系统的绘制操作都指向这个窗口,而非菜单的主窗口,这也是背景能显示(实际是菜单调用的绘制函数意外复用了图像资源,但逻辑上存在窗口分离问题)、角色却不显示的深层原因。

修复后的Battle_system模块代码:

import pygame,sys,random

# 移除重复的pygame.init()和窗口创建代码,复用菜单的主窗口
clock = pygame.time.Clock()
fps = 60

#load images
GBG = pygame.image.load(r'C:\Users\olive\Desktop\Programming project\rpg\setting\Background.png')
PNL = pygame.image.load(r'C:\Users\olive\Desktop\Programming project\rpg\setting\panel.png')

# 修改绘制函数,接收外部传入的窗口对象
def draw_bg(screen):
    screen.blit(GBG, (0, 0))

def draw_panel(screen):
    screen.blit(PNL, (0, 500))

# 修改Fighter类的draw方法,接收外部窗口对象
class Fighter():
    def __init__(self, x, y, name, max_hp, strength, potions):
        self.name = name
        self.max_hp = max_hp
        self.hp = max_hp
        self.strength = strength
        self.start_potions = potions
        self.potions = potions
        self.alive = True
        img = pygame.image.load(f'rpg/{self.name}/idle/0.png')
        self.image = pygame.transform.scale(img, (img.get_width() * 3, img.get_height() * 3))
        self.rect = self.image.get_rect()
        self.rect.center = (x, y)

    def draw(self, screen):
        screen.blit(self.image, self.rect)

knight = Fighter(200, 260, 'Lothric', 30, 10, 3)
slime1 = Fighter(550, 270, 'Slime', 20, 6, 1)
slime2 = Fighter(700, 270, 'Slime', 20, 6, 1)

slime_list = []
slime_list.append(slime1)
slime_list.append(slime2)

修复说明

  • 确保所有需要执行的绘制方法都加上括号,触发实际的渲染逻辑。
  • 让战斗系统复用菜单的主显示窗口,避免创建独立窗口导致的绘制错位问题。

内容的提问来源于stack exchange,提问作者i need help

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 12:24:54