Pygame中rect.inflate_ip函数无效原因及工作原理说明
pygame.Rect.inflate_ip 工作原理 - 这是Rect对象的原地缩放方法,区别于返回新Rect对象的
inflate()方法,它不会创建新实例,直接修改当前Rect的属性,调用后返回值为None。 - 方法接收两个参数:分别是水平方向总增量、垂直方向总增量,单位是像素,不是缩放倍数。例如原Rect宽高为10*10,调用
inflate_ip(4,6)后,宽度变为10+4=14,高度变为10+6=16。如果传入负值,对应方向的尺寸会缩小,最小不会低于0。 - 缩放全程保持Rect的中心点坐标不变,新增/缩减的尺寸会平均分配到矩形的左右、上下两侧。以上面的参数为例,宽度加4会让矩形左边界左移2像素、右边界右移2像素;高度加6会让上边界上移3像素、下边界下移3像素。
代码不生效的核心原因
- 调用顺序完全错误
pygame.draw.rect()在执行的瞬间,就已经按照你传入的10*10尺寸把色块绘制到了屏幕Surface上,后续修改函数返回的Rect对象,不会对已经绘制完成的像素产生任何影响。相当于你照着模子画完方块之后再改模子的大小,纸上已经画好的方块不会自动变形。 - 参数传值逻辑大概率错误
如果你传入的zoom是缩放倍数(比如想放大2倍就传2),完全不符合方法的参数要求。inflate_ip要的是尺寸增量不是倍数,传2只会让1010的矩形变成1212,不会变成20*20。如果zoom值为0,调用方法本身就不会产生任何尺寸变化。
正确实现方式
先完成Rect的尺寸调整,再调用绘制方法,参考代码如下:
# 先创建初始矩形 rect = pygame.Rect(block.x + scx, block.y + scy, 10, 10) # 如果是固定像素膨胀,直接传入增量即可 rect.inflate_ip(zoom, zoom) # 如果是按zoom倍比例缩放,要先计算总增量再传入 # delta = 10 * (zoom - 1) # rect.inflate_ip(delta, delta) # 尺寸调整完成后再绘制到屏幕 pygame.draw.rect(screen, block.color, rect)
内容的提问来源于stack exchange,提问作者ChinDaMay
相关产品推荐
相关产品推荐

