我试图建立一个游戏,包括一个红色的小玩家(矩形)被箭头键控制。黑色背景上有一个白色网格,两个不同颜色的目标(矩形)和几个随机的红色框(矩形)。
我需要帮助的部分是移动红色小播放器。我可以移动它,但是它似乎在新位置绘制自己,但是之前绘制的矩形版本留在那里,形成一条线。我希望整个矩形移动,不要留下任何痕迹/以前的版本。
根据其他一些帖子,我听说唯一的方法是用背景色(在本例中为黑色)填充屏幕,并在屏幕上方重新绘制玩家;然而,在我的例子中,这真的很难,因为我随机放置了红色框和目标,所以每次我再次绘制它们时,它们都会在一个新的随机位置绘制,而不是在原来的位置。我希望红色框和目标保持在相同的位置,但让玩家矩形移动(同时基本上删除它们的旧版本)。
以下是我目前拥有的代码(我已经排除了一些基本内容,如定义颜色、导入和设置屏幕高度/宽度):
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()
上面代码的结果是,我可以随心所欲地移动红色矩形,但是因为我在同时循环中调用red_boxes()、yellow_score_box()和blue_score_box()方法,它们会无限期地调用,绘制随机的红色、蓝色和黄色矩形几乎每秒钟都在屏幕上。我希望他们呆在一个地方,同时像我现在这样拥有移动玩家的功能。
创建一个pyplay。与红色播放器矩形大小相同的Surface:
bkP1 = pygame.Surface((10, 10))
备份后台(pyplay.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)
假设我有一个Hashmap对象myMap,它包含一组键和值, 假设我总共有30把钥匙。 现在我得到了一个键列表:
问题内容: 当我尝试对具有足够大数字的范围进行绘图时,我得到了所有刻度线都相对移动的轴。例如: 我在横坐标轴上得到了这些刻度: 问题是如何删除并获取: 问题答案: 这将抓取,获取x轴axis对象,然后获取主对象,并将设置为false(doc)。 在matplotlib的较新版本(1.4+)中,可以通过 更改默认行为。
问题内容: 我正在使用Google GSON将Java对象转换为JSON。 目前,我具有以下结构: 当前,对象在对象内部。我想跳过对象并将对象移动到对象,如下所示: 如何使用GSON做到这一点? 编辑:我试图使用TypeAdapter来修改Step.class,但是在写入方法中,我无法将我的工时对象添加到JsonWriter中。 问题答案: 您可以通过编写代码,然后为注册一个自定义的序列化器,并确
我有以下型号: 当我运行下面的查询时,用户模型也被删除 有没有办法在不删除用户的情况下删除问题? 我试着重复这些问题但没有用 我认为查询集是懒惰的,所以也许我需要在删除之前评估它,所以我打印了它,但这不起作用。 我知道,将ForeignKey设置为null将为我提供诸如clear和remove之类的方法,但我不想这样做,因为我不希望出现任何孤立的用户问题。 我更新了ForeignKey,如下所示
问题内容: 我想添加子视图并一键删除。这是我的代码: / 添加子视图 / / 删除子视图 / 但是删除它不起作用有人可以帮助我吗?谢谢! 问题答案: 感谢帮助。这是解决方案:我创建了子视图,并添加了一个手势来删除它 更新: 迅捷3+
我试图理解“有效现代C”中关于特殊成员函数生成的第17项,所以我尝试了一些示例,并试图对一些行为进行推理。书中说: ..当我提到移动操作move构造或移动分配一个数据成员或基类时,不能保证实际会发生移动。“Memberwise移动”实际上更像Memberwise移动请求,因为未启用移动的类型(即,对移动操作不提供特殊支持的类型,例如大多数C 98遗留类)将通过其复制操作“移动”。。。此外,不会为任