Pygame实现方块右移时出现多余下移方块的渲染异常问题
Pygame方块渲染与移动异常修复
问题现象
使用Pygame开发时预期实现生成3个方块并控制其向右移动的功能,核心逻辑可正常运行,但存在两处异常:
- 代码仅编写了3个方块的生成逻辑,实际运行时额外渲染出2个方块
- 2个额外方块未编写向下移动控制逻辑,运行时会自动向下移动,与预期效果不符
问题复现代码如下:
import pygame import random import time enemyCoordList = [] pygame.init() rand = random.Random() screen = pygame.display.set_mode((1000, 600)) px = 30 py = 30 def enemy(x, y, sizex=30, sizey=30, health=0, speed=6,): enemyCoordList.append(x) enemyCoordList.append(y) def drawEnemy(): for l in range(len(enemyCoordList)-1): pygame.draw.rect(screen, (0, 255, 0), pygame.Rect(enemyCoordList[l], enemyCoordList[l+1], 50, 50)) enemy(30, 30) enemy(50, 50) enemy(100,100) print(enemyCoordList) run = True while run: time.sleep(0.05) screen.fill((9, 68, 43)) drawEnemy() for i in range(len(enemyCoordList)): if i % 2 != 0: continue enemyCoordList[i] += 1 pygame.display.update() for event in pygame.event.get(): if event.type == pygame.QUIT: run = False pygame.quit()
根因分析
两处异常本质是同一个逻辑错误引发的连锁问题:
- 多渲染方块的原因:
drawEnemy函数的坐标配对逻辑错误。当前逻辑遍历坐标列表时,会将所有相邻的两个值都配对为方块的(x,y)坐标。3个方块的坐标存入扁平列表后总长度为6,range(len(enemyCoordList)-1)会生成0-4共5个索引值,最终绘制5个方块,比预期多2个。 - 额外方块自动下移的原因:移动逻辑仅对列表中索引为偶数的x坐标做每帧+1的右移操作,错误配对生成的方块,会把前一个方块持续增长的x坐标当成自身的y坐标,视觉上就呈现出自动向下移动的效果。
修复方法
修正drawEnemy函数的遍历逻辑,按步长2遍历坐标列表,每两个连续值为一组读取对应方块的x、y坐标即可。优化后的drawEnemy代码如下:
def drawEnemy(): # 步长设为2,每两个坐标为一组,对应一个方块的x、y for l in range(0, len(enemyCoordList), 2): pygame.draw.rect(screen, (0, 255, 0), pygame.Rect(enemyCoordList[l], enemyCoordList[l+1], 50, 50))
优化建议:后续开发中尽量不要用扁平列表交错存储x、y坐标,可以将每个敌人的属性存储为元组/字典/对象,例如enemyList.append({"x":x, "y":y}),从根源上避免索引配对错误。
内容的提问来源于stack exchange,提问作者ImBadAtMath
相关产品推荐
相关产品推荐

