77 lines
1.5 KiB
Go
77 lines
1.5 KiB
Go
package npc
|
||
|
||
import (
|
||
"common/proto/gen/grpc_pb"
|
||
)
|
||
|
||
// NPCNode 定义NPC节点
|
||
type NPCNode struct {
|
||
UID int // 用户ID
|
||
GatewaySID int64 // 网关服务ID
|
||
|
||
Position [2]float64 // 二维坐标 [x, y]
|
||
MoveCross int8 // 移动十字,1 上 2 下 4 左 8 右
|
||
Action []*grpc_pb.ActionReq // 其他操作
|
||
}
|
||
|
||
func NewNPCNode(gatewaySID int64, uid int) *NPCNode {
|
||
return &NPCNode{
|
||
UID: uid,
|
||
GatewaySID: gatewaySID,
|
||
Position: [2]float64{0, 0},
|
||
MoveCross: 0,
|
||
Action: make([]*grpc_pb.ActionReq, 0),
|
||
}
|
||
}
|
||
|
||
// 逻辑帧-移动
|
||
func (p *NPCNode) 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
|
||
}
|