64 lines
1.3 KiB
Go
64 lines
1.3 KiB
Go
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
|
||
}
|