package npc import ( "common/proto/ss/grpc_pb" ) // PlayerNode 定义玩家节点结构体 type PlayerNode struct { UID int // 用户ID GatewaySID int64 // 网关服务ID Position [2]float64 // 二维坐标 [x, y] MoveCross int8 // 移动十字,1 上 2 下 4 左 8 右 Action []*grpc_pb.ActionReq // 其他操作 } func NewPlayerNode(gatewaySID int64, uid int) *PlayerNode { return &PlayerNode{ UID: uid, GatewaySID: gatewaySID, Position: [2]float64{0, 0}, MoveCross: 0, Action: make([]*grpc_pb.ActionReq, 0), } } // AddAction 将指令存储到玩家身上 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) ) // LogicMove 逻辑帧-移动 func (p *PlayerNode) LogicMove() bool { 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 { return false } if moveX != 0 && moveY != 0 { const diagonalFactor = 0.7071 moveX *= diagonalFactor moveY *= diagonalFactor } speed := 10.0 p.Position[0] += moveX * speed p.Position[1] += moveY * speed if p.Position[0] < 0 { p.Position[0] = 0 } if p.Position[0] > 400 { p.Position[0] = 400 } if p.Position[1] < 0 { p.Position[1] = 0 } if p.Position[1] > 400 { p.Position[1] = 400 } return true }