pygame Sprite 精灵类移动出现模糊,留下移动痕迹问题解决方法

1、问题描述

当定义精灵类时,移动精灵,移动后会出现模糊,留下移动痕迹

正常定义的是一个小方块

 移动后出现痕迹,模糊现象

 代码

import pygame
from pygame.locals import *


class Player(pygame.sprite.Sprite):  # 继承pygame.sprite.Sprite精灵对象
    def __init__(self):
        super().__init__()
        self.surf = pygame.Surface((75, 25))  # 创建Surface平面对象
        self.surf.fill('orange')  # 填充橙色
        self.rect = self.surf.get_rect()  # 获取X,Y坐标和大小
        print(f'rect:{self.rect}')  # 不设置默认是0,0
        self.rect.x = 300  # 重新设置X轴坐标
        self.rect.y = 300  # 重新设置Y轴坐标

    def update(self, pressed_keys):
        # print(f'pressed_keys:{pressed_keys}')
        if pressed_keys[K_UP]:  # 如果按下的是方向上键
            print('up')
            self.rect.move_ip(0, -5)  # 更新rect的X,Y
            print(self.rect)
        if pressed_keys[K_DOWN]:  # 如果按下的是方向下键
            print('down')
            self.rect.move_ip(0, 5)  # 更新rect的X,Y
            print(self.rect)
        if pressed_keys[K_LEFT]:  # 如果按下的是方向左键
            print('left')
            self.rect.move_ip(-5, 0)  # 更新rect的X,Y
            print(self.rect)
        if pressed_keys[K_RIGHT]:  # 如果按下的是方向右键
            print('right')
            self.rect.move_ip(5, 0)  # 更新rect的X,Y
            print(self.rect)


pygame.init()  # 初始化pygame
screen = pygame.display.set_mode((800, 600))  # 创建窗口
screen.fill(color='white')  # 为窗口填充白色
player = Player()  # 创建Player对象
running = True
clock = pygame.time.Clock()
while running:
    for event in pygame.event.get():  # 获取所有事件
        if event.type == KEYDOWN:  # 获取按钮按下事件
            if event.key == K_ESCAPE:  # 如果是按下了ESC键
                running = False
        if event.type == QUIT:  # 如果是QUIT事件,如点击关闭窗口按钮
            running = False
    clock.tick(100)
    pressed_key = pygame.key.get_pressed()
    player.update(pressed_key)
    # screen.fill(color='white')  # 为窗口填充白色
    screen.blit(player.surf, player.rect)  # 放置player对象
    pygame.display.flip()  # 刷新整个平面

2、解决办法

在while循环中,填充背景颜色或者填充背景图片

只添加了红色字体 screen.fill(color='white') # 为窗口填充白色

import pygame
from pygame.locals import *


class Player(pygame.sprite.Sprite):  # 继承pygame.sprite.Sprite精灵对象
    def __init__(self):
        super().__init__()
        self.surf = pygame.Surface((75, 25))  # 创建Surface平面对象
        self.surf.fill('orange')  # 填充橙色
        self.rect = self.surf.get_rect()  # 获取X,Y坐标和大小
        print(f'rect:{self.rect}')  # 不设置默认是0,0
        self.rect.x = 300  # 重新设置X轴坐标
        self.rect.y = 300  # 重新设置Y轴坐标

    def update(self, pressed_keys):
        # print(f'pressed_keys:{pressed_keys}')
        if pressed_keys[K_UP]:  # 如果按下的是方向上键
            print('up')
            self.rect.move_ip(0, -5)  # 更新rect的X,Y
            print(self.rect)
        if pressed_keys[K_DOWN]:  # 如果按下的是方向下键
            print('down')
            self.rect.move_ip(0, 5)  # 更新rect的X,Y
            print(self.rect)
        if pressed_keys[K_LEFT]:  # 如果按下的是方向左键
            print('left')
            self.rect.move_ip(-5, 0)  # 更新rect的X,Y
            print(self.rect)
        if pressed_keys[K_RIGHT]:  # 如果按下的是方向右键
            print('right')
            self.rect.move_ip(5, 0)  # 更新rect的X,Y
            print(self.rect)


pygame.init()  # 初始化pygame
screen = pygame.display.set_mode((800, 600))  # 创建窗口
screen.fill(color='white')  # 为窗口填充白色
player = Player()  # 创建Player对象
running = True
clock = pygame.time.Clock()
while running:
    for event in pygame.event.get():  # 获取所有事件
        if event.type == KEYDOWN:  # 获取按钮按下事件
            if event.key == K_ESCAPE:  # 如果是按下了ESC键
                running = False
        if event.type == QUIT:  # 如果是QUIT事件,如点击关闭窗口按钮
            running = False
    clock.tick(100)
    pressed_key = pygame.key.get_pressed()
    player.update(pressed_key)
    screen.fill(color='white')  # 为窗口填充白色
    screen.blit(player.surf, player.rect)  # 放置player对象
    pygame.display.flip()  # 刷新整个平面

参考链接 https://fishc.com.cn/thread-169617-1-1.html

posted @ 2021-06-09 15:13  南风丶轻语  阅读(723)  评论(0编辑  收藏  举报