Pygame双玩家场景玩家2状态不更新、位置不同步问题求助
问题根因
- 缺失本地玩家移动逻辑:你定义了Player类的vel速度属性,但代码中没有监听方向键修改本地玩家
p的x/y坐标的逻辑,操作键盘时p的坐标不会发生变化,发给服务端的永远是初始坐标,自然无法同步。 - 空格按键逻辑错误:按下空格时你直接重新实例化了
p和p2对象,不仅把本地玩家坐标重置回初始值,还把服务端同步过来的另一个玩家的坐标直接覆盖为(0,0),直接打断了同步逻辑。 - 自定义参数未同步:你修改的
billybob变量仅存在于本地客户端,既没有上传到服务端,也没有同步给另一个客户端,所以另一个玩家看不到高度变化。 - 执行顺序错误:当前主循环先同步对方玩家位置,再处理本地输入更新自身位置,发给服务端的永远是上一帧的位置,会导致同步延迟。
修复方案
1. 调整主循环执行顺序,补全移动逻辑
将输入处理放在同步逻辑之前,添加方向键控制本地玩家移动的代码:
def main(screen, billybob): run = True n = Network() startPos = read_pos(n.getPos()) # 修正玩家宽度,不要超过窗口尺寸 p = Player(startPos[0], startPos[1],50,50,(BLUE)) p2 = Player(0,0,50,50,(RED)) while run: # 先处理事件和输入 for event in pygame.event.get(): if event.type == pygame.QUIT: run = False pygame.quit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: billybob = billybob - 10 # 不要重新实例化,直接修改属性即可 p.height = billybob p.update() # 补全方向键移动逻辑 keys = pygame.key.get_pressed() if keys[pygame.K_LEFT] and p.x > 0: p.x -= p.vel if keys[pygame.K_RIGHT] and p.x < width - p.width: p.x += p.vel if keys[pygame.K_UP] and p.y > 0: p.y -= p.vel if keys[pygame.K_DOWN] and p.y < height - p.height: p.y += p.vel p.update() # 再同步对方玩家位置 p2Pos = read_pos(n.send(make_pos((p.x, p.y)))) p2.x = p2Pos[0] p2.y = p2Pos[1] p2.update() redrawWindow(screen, p, p2)
2. 扩展同步协议(需要同步高度等自定义参数时修改)
如果需要同步billybob这类自定义参数,修改打包/解包函数,把高度参数和x/y坐标一起传输:
# 客户端修改 def read_data(str): arr = str.split(",") return int(arr[0]), int(arr[1]), int(arr[2]) def make_data(tup): return f"{tup[0]},{tup[1]},{tup[2]}"
服务端同步修改存储结构和对应的打包/解包逻辑即可。
内容的提问来源于stack exchange,提问作者Thomas Mcgown
相关产品推荐
相关产品推荐

