我正在尝试开发一个游戏,该游戏涉及一个由箭头键控制的小的红色玩家(矩形)。在黑色背景上有一个白色网格,两个不同颜色的物镜(矩形),以及几个随机的红色框(矩形)。
我需要帮助的部分是移动小型红色播放器。我可以移动它,但是它似乎可以将自己绘制在新位置,但是先前绘制的矩形的版本会保留在那里,形成一条线。我希望整个矩形都移动,而不希望留下任何痕迹/以前的版本。
根据其他帖子,我听说做到这一点的唯一方法是用背景色(在本例中为黑色)填充屏幕并在其顶部重新绘制玩家。但是,这对于我来说确实很难,因为我随机放置了红色框和目标,因此,每次我再次绘制它们时,它们都将绘制一个新的随机位置,而不是原来的位置。我希望红色框和目标保持在同一位置,但让播放器矩形移动(基本上是删除自己的旧版本)。
这是我当前拥有的代码(我已经排除了基本知识,例如定义颜色,导入和设置屏幕高度/宽度):
p1_velocity_x = 0
p1_velocity_y = 0
p2_velocity_x = 0
p2_velocity_y = 0
def grid():
for col in range(0, screen_width - 100, 10):
for row in range(0, screen_height, 10):
screen.set_at((row, col), white)
def red_boxes():
for i in range(100):
pygame.draw.rect(screen, red, (randrange(1, 1200), randrange(1, 470), 25, 25))
def blue_score_box():
pygame.draw.rect(screen, blue, (randrange(1, 1200), randrange(1, 470), 25, 25))
def yellow_score_box():
pygame.draw.rect(screen, yellow, (randrange(1, 1200), randrange(1, 470), 25, 25))
class Player:
color = (0, 0, 0)
def __init__(self, color):
self.x = 0
self.y = 0
self.color = color
p1 = Player(red)
p1.x = randrange(1, 1200, 10)
p1.y = randrange(1, 470, 10)
p2 = Player(yellow)
p2.x = randrange(1, 1200, 10)
p2.y = randrange(1, 470, 10)
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
p1.x += 10
screen.fill(black)
grid()
red_boxes()
yellow_score_box()
blue_score_box()
pygame.draw.rect(screen, p1.color, (p1.x, p1.y, 10, 10))
pygame.draw.rect(screen, p2.color, (p2.x, p2.y, 10, 10))
pygame.display.update()
以上代码的结果是我可以根据需要移动红色矩形,但是由于我在while循环中调用了red_boxes(),yellow_score_box()和blue_score_box()方法,因此它们会继续调用无限期地,几乎每秒都在屏幕上绘制随机的红色,蓝色和黄色矩形。我希望他们留在一个地方,同时具有像现在一样移动播放器的功能。
答案 0 :(得分:0)
创建一个尺寸与红色播放器矩形相同的pygame.Surface
:
bkP1 = pygame.Surface((10, 10))
在绘制播放器之前备份背景(pygame.Surface.blit
)并存储播放器的位置:
prevPos = (p1.x, p1.y)
bkP1.blit(screen, (0, 0), (*prevPos, 10, 10))
当必须删除播放器时,在播放器顶部绘制背景:
screen.blit(bkP1, prevPos)
该过程可能如下工作:
prevPos = None
bkP1 = pygame.Surface((10, 10))
while True:
# [...]
if prevPos:
screen.blit(bkP1, prevPos)
prevPos = (p1.x, p1.y)
bkP1.blit(screen, (0, 0), (*prevPos, 10, 10))
pygame.draw.rect(screen, p1.color, (p1.x, p1.y, 10, 10))
当然可以将机制添加到类Player
中:
class Player:
def __init__(self, color):
self.x = 0
self.y = 0
self.color = color
self. prevPos = None
self.bk = pygame.Surface((10, 10))
def draw(self, screen):
if self.prevPos:
screen.blit(self.bk, self.prevPos)
self.prevPos = (self.x, self.y)
self.bk.blit(screen, (0, 0), (*self.prevPos, 10, 10))
pygame.draw.rect(screen, self.color, (self.x, self.y, 10, 10))
while True:
# [...]
p1.draw(screen)