From 5bc2edf166a1bf8f28f5b1d22b3d3a296631fc46 Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Sat, 3 Jun 2023 13:57:27 +0800 Subject: [PATCH] =?UTF-8?q?2d=E7=A7=BB=E5=8A=A8=E5=8A=9F=E8=83=BD=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/builtin/moving2d.go | 66 ++++++++++++++++++++++++++ game/moving2d.go | 6 +++ game/moving2d_entity.go | 10 ++++ game/{position_2d.go => position2d.go} | 0 game/position2d_set.go | 6 +++ game/{position_3d.go => position3d.go} | 0 6 files changed, 88 insertions(+) create mode 100644 game/builtin/moving2d.go create mode 100644 game/moving2d.go create mode 100644 game/moving2d_entity.go rename game/{position_2d.go => position2d.go} (100%) create mode 100644 game/position2d_set.go rename game/{position_3d.go => position3d.go} (100%) diff --git a/game/builtin/moving2d.go b/game/builtin/moving2d.go new file mode 100644 index 0000000..e43700f --- /dev/null +++ b/game/builtin/moving2d.go @@ -0,0 +1,66 @@ +package builtin + +import ( + "github.com/kercylan98/minotaur/game" + "github.com/kercylan98/minotaur/utils/g2d" + "sync" + "time" +) + +func NewMoving2D() *Moving2D { + moving2D := &Moving2D{ + entities: map[int64]*moving2DTarget{}, + } + go moving2D.handle() + return moving2D +} + +type moving2DTarget struct { + game.Moving2DEntity + x, y float64 + lastMoveTime int64 +} + +func (slf *Moving2D) MoveTo(entity game.Moving2DEntity, x float64, y float64) { + slf.rw.Lock() + slf.entities[entity.GetGuid()] = &moving2DTarget{ + Moving2DEntity: entity, + x: x, + y: y, + lastMoveTime: time.Now().UnixMilli(), + } + slf.rw.Unlock() +} + +type Moving2D struct { + rw sync.RWMutex + entities map[int64]*moving2DTarget +} + +func (slf *Moving2D) handle() { + for { + slf.rw.Lock() + for guid, entity := range slf.entities { + x, y := entity.GetPosition() + angle := g2d.CalcAngle(x, y, entity.x, entity.y) + moveTime := time.Now().UnixMilli() + interval := float64(moveTime - entity.lastMoveTime) + distance := interval * entity.GetSpeed() + nx, ny := g2d.CalculateNewCoordinate(x, y, angle, distance) + if g2d.CalcDistance(nx, ny, entity.x, entity.y) <= distance { + entity.SetPosition(entity.x, entity.y) + delete(slf.entities, guid) + return + } + entity.SetPosition(nx, ny) + entity.lastMoveTime = moveTime + } + + if len(slf.entities) == 0 { + slf.rw.Unlock() + time.Sleep(100 * time.Millisecond) + } else { + slf.rw.Unlock() + } + } +} diff --git a/game/moving2d.go b/game/moving2d.go new file mode 100644 index 0000000..b7da67a --- /dev/null +++ b/game/moving2d.go @@ -0,0 +1,6 @@ +package game + +// Moving2D 2D移动功能接口定义 +type Moving2D interface { + MoveTo(entity Moving2DEntity, x float64, y float64) +} diff --git a/game/moving2d_entity.go b/game/moving2d_entity.go new file mode 100644 index 0000000..d3b33e6 --- /dev/null +++ b/game/moving2d_entity.go @@ -0,0 +1,10 @@ +package game + +type Moving2DEntity interface { + Actor + Position2D + Position2DSet + + // GetSpeed 获取移动速度 + GetSpeed() float64 +} diff --git a/game/position_2d.go b/game/position2d.go similarity index 100% rename from game/position_2d.go rename to game/position2d.go diff --git a/game/position2d_set.go b/game/position2d_set.go new file mode 100644 index 0000000..5767a52 --- /dev/null +++ b/game/position2d_set.go @@ -0,0 +1,6 @@ +package game + +// Position2DSet 2D位置设置接口定义 +type Position2DSet interface { + SetPosition(x, y float64) +} diff --git a/game/position_3d.go b/game/position3d.go similarity index 100% rename from game/position_3d.go rename to game/position3d.go