From 42fcc8a1f00f17a10bdc3f877f3a91a2a7cd2458 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20V=C3=B6gele?= Date: Thu, 15 May 2014 13:40:29 +0200 Subject: [PATCH] Observer-modell --- src/Backend.cs | 27 ++++++++++++++------------- src/Entity.cs | 2 +- src/Parser.cs | 2 +- src/Player.cs | 13 +++++++++++++ 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/Backend.cs b/src/Backend.cs index b523ea0..c0618de 100644 --- a/src/Backend.cs +++ b/src/Backend.cs @@ -19,6 +19,7 @@ namespace WorldOfPeacecraft private int SelfId; private AutoResetEvent InitializedEvent = new AutoResetEvent(false); private bool initialized = false; + private Pathwalker Pathwalker = new Pathwalker(); public Backend (IGui gui) { @@ -40,6 +41,7 @@ namespace WorldOfPeacecraft public void SetSelfId (int id) { this.SelfId = id; + Players[SelfId].LocationChanged += OnPlayerMoved; } public IEnumerable GetDragons () @@ -151,22 +153,21 @@ namespace WorldOfPeacecraft public void MoveTo (int x, int y) { - if (Map.GetTiles () [x, y].IsWalkable ()) { - Thread thread = new Thread (() => WalkTo (x, y)); - thread.IsBackground = true; - thread.Start (); - } + // Hier müsste man locken + Pathwalker.Stop(); + LinkedList path = Pathfinder.FindPath (Players [SelfId].Coord, new Coordinate (x, y), Map); + Pathwalker.SetCoords (path); } - private void WalkTo (int x, int y) + public void MoveStep () { - LinkedList path = Pathfinder.FindPath (Players [SelfId].Coord, new Coordinate (x, y), Map); - Pathwalker walker = new Pathwalker (); - walker.SetCoords (path); - while (walker.HasMoreSteps()) { - SenderBuffer.AddLine("ask:" + walker.NextStep()); - Thread.Sleep(250); - } + if (Pathwalker.HasMoreSteps()) + SenderBuffer.AddLine("ask:" + Pathwalker.NextStep()); + } + + public void OnPlayerMoved (int x, int y) + { + MoveStep(); } public void RefreshGui () diff --git a/src/Entity.cs b/src/Entity.cs index ee8b675..61c6ecd 100644 --- a/src/Entity.cs +++ b/src/Entity.cs @@ -41,7 +41,7 @@ namespace WorldOfPeacecraft return Coord.X; } - public void SetPos (int x, int y) + public virtual void SetPos (int x, int y) { SetX (x); SetY (y); diff --git a/src/Parser.cs b/src/Parser.cs index ceb433d..be27981 100644 --- a/src/Parser.cs +++ b/src/Parser.cs @@ -292,8 +292,8 @@ namespace WorldOfPeacecraft { Player self = MapPlayer (playerBlock); lock (Backend) { - Backend.SetSelfId(self.GetId()); Backend.SetPlayer(self); + Backend.SetSelfId(self.GetId()); } Backend.RefreshGui (); } diff --git a/src/Player.cs b/src/Player.cs index 49e65ab..1b7164f 100644 --- a/src/Player.cs +++ b/src/Player.cs @@ -4,6 +4,9 @@ namespace WorldOfPeacecraft { private int Score; + public delegate void LocationChangedEventHandler (int x, int y); + public event LocationChangedEventHandler LocationChanged; + public Player (int id, int posX, int posY, string desc, bool busy, int score) : base(id, posX, posY, desc, busy) { this.SetScore(score); @@ -24,6 +27,16 @@ namespace WorldOfPeacecraft return Desc; } + public override void SetPos (int x, int y) + { + bool positionChanged = false; + if (x != GetX() || y != GetY ()) + positionChanged = true; + base.SetPos (x, y); + if (LocationChanged != null) + LocationChanged(x, y); + } + public override string ToString() { return "Player: " + Id + " " + Coord.X + " " + Coord.Y + " " + Desc + " " + Busy + " " + Score;