package instance import ( "common/proto/gen/grpc_pb" ) // PlayerNode 定义玩家节点结构体 type PlayerNode struct { ID int Position [2]float64 // 二维坐标 [x, y] MoveCross int8 // 移动十字,1 上 2 下 4 左 8 右 Action []*grpc_pb.ActionReq // 其他操作 } // 将指令存储到玩家身上 func (p *PlayerNode) addAction(e *grpc_pb.ActionReq) { if e.Action < 16 { p.MoveCross = int8(e.Action) } else { p.Action = append(p.Action, e) } } const ( DirUp int8 = 1 << iota // 1 (00000001) DirDown // 2 (00000010) DirLeft // 4 (00000100) DirRight // 8 (00001000) ) // 逻辑帧-移动 func (p *PlayerNode) logicMove() { if p.MoveCross&DirUp != 0 && p.MoveCross&DirDown != 0 { p.MoveCross &^= DirUp | DirDown } if p.MoveCross&DirLeft != 0 && p.MoveCross&DirRight != 0 { p.MoveCross &^= DirLeft | DirRight } var moveX, moveY float64 if p.MoveCross&DirUp != 0 { moveY += 1 } if p.MoveCross&DirDown != 0 { moveY -= 1 } if p.MoveCross&DirLeft != 0 { moveX -= 1 } if p.MoveCross&DirRight != 0 { moveX += 1 } if moveX != 0 && moveY != 0 { const diagonalFactor = 0.7071 moveX *= diagonalFactor moveY *= diagonalFactor } speed := 100.0 p.Position[0] += moveX * speed p.Position[1] += moveY * speed }