PyGame开发问题:为什么我的rock对象无法实现自动移动?
问题原因
- 你在循环中修改的
rock_x变量没有同步更新到rock_move这个Rect对象上,Python中int是不可变类型,初始化Rect时传入的是rock_x的初始值,后续修改rock_x不会自动同步到Rect的x属性 draw_window函数中绘制rock时直接写死了坐标为(400, 250),完全没有用到传入的rock_move参数的坐标值,所以不管你怎么改坐标变量,绘制位置永远不变- 另外你要实现向左移动的需求,应该是x坐标减少,你写的
rock_x +=3是向右移动,需要调整符号
修复方案
- 直接修改
rock_move.x属性即可,不需要额外维护独立的rock_x变量 - 修改
draw_window函数中绘制rock的代码,使用rock_move的x、y属性作为绘制坐标 - 把移动数值改为负数实现左移
修复后完整代码
import pygame p = pygame.display.set_mode((900, 600)) pygame.display.set_caption("First game") FPS = 60 WHITE = 255, 255, 255 RED = 255, 0, 0 GREEN = 0, 255, 0 BLUE = 0, 0, 255 DBLUE = 57, 64, 90 board1 = pygame.image.load("board.png") board2 = pygame.image.load("board.png") rock = pygame.image.load("rock.png") def draw_window(board1_move, board2_move, rock_move): p.fill(DBLUE) board1_scaled = pygame.transform.rotate(pygame.transform.scale(board1, (55, 40)), 40) board2_scaled = pygame.transform.rotate(pygame.transform.scale(board2, (55, 40)), 40) rock_scaled = pygame.transform.rotate(pygame.transform.scale(rock, (55, 40)), 0) p.blit(board1_scaled, (board1_move.x, board1_move.y)) p.blit(board2_scaled, (board2_move.x, board2_move.y)) # 使用rock_move的动态坐标绘制 p.blit(rock_scaled, (rock_move.x, rock_move.y)) pygame.display.update() keypress = pygame.key.get_pressed() def board1_move_func(keypress, board1_move): if keypress[pygame.K_w] and board1_move.y > 0: board1_move.y -= 3 if keypress[pygame.K_s] and board1_move.y < 530: board1_move.y += 3 def board2_move_func(keypress, board2_move): if keypress[pygame.K_UP] and board2_move.y > 0: board2_move.y -= 3 if keypress[pygame.K_DOWN] and board2_move.y < 530: board2_move.y += 3 def main(): board1_move = pygame.Rect(20, 250, 55, 40) board2_move = pygame.Rect(805, 250, 55, 40) # 直接用Rect存储rock的坐标属性 rock_move = pygame.Rect(450, 250, 55, 40) clock = pygame.time.Clock() run = True while run == True: clock.tick(FPS) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False keypress = pygame.key.get_pressed() # 左移对应x坐标减3 rock_move.x -= 3 board1_move_func(keypress, board1_move) board2_move_func(keypress, board2_move) draw_window(board1_move, board2_move, rock_move) pygame.quit() if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者Leeyo-27
相关产品推荐
相关产品推荐

