我用pygame写超级马里奥时,图片加载错误,而python不报错

我用pygame写超级马里奥时,图片加载错误,而python不报错

问题代码

img

from .. components import info,player
import pygame
from .. import constants as C
from .. import setup,tools
import pygame
class Level1:
    def __init__(self):
        self.finished = False
        self.next = None
        self.info = info.Info('level1')
        self.setup_background()
        self.setup_player()
    def setup_background(self):
        self.background = setup.GRAPHICS['level_1']
        rect = self.background.get_rect()
        self.background_rect = rect
        self.background = pygame.transform.scale(self.background,(int(self.background_rect.width*C.BG_MULTI),
                                                                 int(self.background_rect.height*C.BG_MULTI)))
        self.game_window = setup.SCREEN.get_rect()
        self.game_ground = pygame.Surface((self.background_rect.width,self.background_rect.height))
    def setup_player(self):
        self.player = player.Player('mario')
        self.player.rect.x = 300
        self.player.rect.y = 490
    def update(self,surface,keys):
        self.player.update(keys)
        self.update_player_position()
        self.update_game_window()
        self.draw(surface)
    def update_player_position(self):
        self.player.rect.x += self.player.x_vel
        self.player.rect.y += self.player.y_vel
    def update_game_window(self):
        third = self.game_window.x + self.game_window.width / 3
        if self.player.x_vel > 0 and self.player.rect.centerx > third:
            self.game_window.x += self.player.x_vel
    def draw(self,surface):
        self.game_ground.blit(self.background,self.game_window,self.game_window)
        self.game_ground.blit(self.player.image,self.player.rect)
        surface.blit(self.game_ground, (0, 0), self.game_window)
        self.info.draw(surface)

img

from source import tools
from source.states import main_menu,load_screen,level
def main():
    state_dirc = {
        'main_menu':main_menu.MainMenu(),
        'load_screen':load_screen.LoadScreen(),
        'level1':level.Level1()
    }
    game = tools.Game(state_dirc,'main_menu')
    game.Run()
if __name__ == "__main__":
    main()

运行结果

img

我想要达到的结果*

img

检查图像绘制的顺序是否正确,后绘制的图像会遮盖先绘制的。

补充一下 这是tools.py

img

python
import pygame
import sys
import os
class Game:
    def __init__(self,state_dirc,start_state):
        self.screen = pygame.display.get_surface()
        self.clock = pygame.time.Clock()
        self.keys = pygame.key.get_pressed()
        self.state_dirc = state_dirc
        self.state = self.state_dirc[start_state]
    def update(self):
        if self.state.finished:
            next_state = self.state.next
            self.state.finished = False
            self.state = self.state_dirc[next_state]
        self.state.update(self.screen,self.keys)
    def Run(self):
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()
                elif event.type == pygame.KEYDOWN:
                    self.keys = pygame.key.get_pressed()
                elif event.type == pygame.KEYUP:
                    self.keys = pygame.key.get_pressed()
            self.update()
            self.clock.tick(160)
            pygame.display.update()
            
def load_graphics(path,accept = ('.jpg','.png','.bmp','gif')):
    graphics = {}
    for pic in os.listdir(path):
        name,ext = os.path.splitext(pic)
        if ext in accept:
            img = pygame.image.load(os.path.join(path,pic))
            if img.get_alpha():
                img.convert_alpha()
            else:
                img.convert()
        graphics[name] = img
    return graphics
 
def get_image(sheet, x, y, width, height, colorkey, scale):
        image = pygame.Surface([width, height])
        image.blit(sheet, (0, 0), (x, y, width, height))
        image.set_colorkey(colorkey)
        image = pygame.transform.scale(image,(int(width*scale), int(height*scale)))