Pygame,如何在移动时移除玩家的踪迹,我试过填充屏幕但仍然对我不起作用

Pygame, how to remove trail from a player when moving, I tried filling screen but still didnt work for me

所以我试图在播放器移动时删除它的踪迹。我尝试做 screen.fill,但是当我这样做时,整个地图都消失了。我想实现一个简单的移动ascii字母。 - tiles(map1) 应该绘制地图,但是如果我把 screen.fill 放在它前面,那么地图就会消失,我不知道为什么。

import pygame
from pygame import key
from pygame.draw import rect
from pygame.locals import *

pygame.init()
fpsClock = pygame.time.Clock()

resmulti=3
spritesize=16*resmulti
resolution=(256*resmulti,224*resmulti)
screen = pygame.display.set_mode((resolution[0], resolution[1]))

pygame.display.set_caption("test")

player_character = "@"
player_color = (255, 0, 0)
player_size = 20
current_position = [0, 1]

player = pygame.font.Font(None, player_size).render(player_character,False, player_color)
tile = pygame.draw.rect(screen, (255,255,255), [0,0,10,10])


map1 = """

wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
w                                w
w      wwwww      w   ww         w
w                     w          w
w        w                       w
w                www      www    w
w            w    w       w      w
w      w          w       w      w
w      w      wwwww      www     w
w                                w
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
"""
map1 = map1.splitlines()

gameRunning = True

background = pygame.image.load("bg.png")

def tiles(map1):
    global tile
    for y,line in enumerate(map1):
        for x,c in enumerate(line):
            if c == "w":
                screen.blit(screen,(x*16,y*16),tile)


p_x = 20
p_y = 90
while gameRunning:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            gameRunning = False
            break
        
    keys = pygame.key.get_pressed()

    if keys[K_DOWN]:
        p_y += 2
    elif keys[K_UP]:
        p_y = p_y - 2
    elif keys[K_LEFT]:
        p_x = p_x - 2
    elif keys[K_RIGHT]:
        p_x += 2


    tiles(map1)

    screen.blit(player,(p_x,p_y))

    fpsClock.tick(60)
    pygame.display.update()
tile = pygame.draw.rect(screen, (255,255,255), [0,0,10,10])

那个returns一个pygame.Rect对象,所以tile是一个rect。

那你在blit函数中使用tile。

screen.blit(screen,(x*16,y*16),tile)

但是从 pygame 的文档来看,blit 需要 pygame.Surface 而不是矩形。

解决问题。

制作瓷砖 a pygame.Surface.

#tile = pygame.draw.rect(screen, (255,255,255), [0,0,10,10])
tile = pygame.Surface((10, 10)).convert()
tile.fill((255, 255, 255))

按如下方式绘制方块。

if c == "w":
     screen.blit(tile,(x*16,y*16))

然后清屏,画方块,画玩家。

screen.fill((0, 0, 0))
tiles(map1)
screen.blit(player,(p_x,p_y))

最简单的就是直接替换

screen.blit(screen, (x * 16, y * 16), tile)

pygame.draw.rect(screen, (255, 255, 255), (x * 16, y * 16, 10, 10))

您遇到的问题是您 blit 正在 screen 的一个区域,与您之前涂成白色的区域 (tile = pygame.draw.rect(screen, (255,255,255), [0,0,10,10])) 相同。问题是,例如,如果您使用 fill 来填充 screen 一些颜色,它也会填充您绘制的正方形,并且它不再是白色而是填充颜色,并且由于您然后将以相同的颜色创建图块,它们将与整个 screen 的颜色相同。所以你可以创建一个新的表面(或使用图像)或者只使用 draw 函数,正如我所展示的那样。

这允许在 while 循环开始时使用 blitfill 来用背景色填充屏幕。