Pygame中clamp_ip()无法将可旋转移动矩形限制在屏幕内问题
问题原因
- 你维护了两套独立的位置数据:单独定义的
x1/y1变量、pygame.Rect实例rect。你仅对rect执行了clamp_ip()边界约束,但最终调用blit绘制时使用的是未做边界校验的x1/y1,边界约束逻辑完全没有生效 - 旋转后更新
rect中心时,你没有把移动产生的偏移同步到rect上,rect的位置和实际绘制的位置完全脱节
修复代码
import pygame import math def main(): pygame.init() screen_width = 1000 screen_height = 500 screen = pygame.display.set_mode((screen_width, screen_height)) screen_rect = screen.get_rect() clock = pygame.time.Clock() white = (255, 255, 255) black = (0, 0, 0) tank_width = 50 tank_height = 100 angle = 0 game = True surface = pygame.Surface((tank_width, tank_height)) surface.set_colorkey(white) surface.fill(white) # 初始化rect,统一用它存位置,不再单独维护x1/y1 rect = surface.get_rect(center=screen_rect.center) pygame.draw.rect(surface, pygame.Color(black), (0, 0, tank_width, tank_height)) while game: for e in pygame.event.get(): if e.type == pygame.QUIT: game = False pressed = pygame.key.get_pressed() if pressed[pygame.K_RIGHT]: angle -= 1 if pressed[pygame.K_LEFT]: angle += 1 # 移动时直接修改rect的中心坐标 if pressed[pygame.K_UP]: rect.centerx -= 5 * math.sin(math.radians(angle)) rect.centery -= 5 * math.cos(math.radians(angle)) if pressed[pygame.K_DOWN]: rect.centerx += 5 * math.sin(math.radians(angle)) rect.centery += 5 * math.cos(math.radians(angle)) rotated = pygame.transform.rotate(surface, angle) # 保持旋转后的rect中心和原有中心一致 rect = rotated.get_rect(center=rect.center) # 边界约束直接作用于实际使用的rect rect.clamp_ip(screen_rect) screen.fill(pygame.Color(white)) # 直接用rect作为绘制位置参数,不需要单独传坐标 screen.blit(rotated, rect) pygame.display.update() clock.tick(60) if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者Vorbeker
相关产品推荐
相关产品推荐

