Skip to content

Commit f35c897

Browse files
committed
添加状态机的消息处理 - 妻子煮肉
1 parent 8e43b3d commit f35c897

File tree

14 files changed

+97
-55
lines changed

14 files changed

+97
-55
lines changed

StateMachineLearn/WestWord/BaseGameEntity.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ public interface IBaseGameEntity
1616
/// 实例名字
1717
/// </summary>
1818
public EntityName Name { get; }
19-
19+
2020
/// <summary>
2121
/// 处理信息
2222
/// </summary>
2323
/// <param name="msg"></param>
24-
public void HandleMessage(Telegram msg);
24+
public void HandleMessage(in Telegram msg);
2525
}
2626

2727
/// <summary>
@@ -53,7 +53,7 @@ protected BaseGameEntity(EntityName name)
5353
/// 处理信息
5454
/// </summary>
5555
/// <param name="msg"></param>
56-
public virtual void HandleMessage(Telegram msg)
56+
public virtual void HandleMessage(in Telegram msg)
5757
{
5858
}
5959

StateMachineLearn/WestWord/MessageDispatcher.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public bool DispatchMessage(int sendInsId, int receiverInsId, ConstDefine.Messag
7373
.Build();
7474

7575
// 4. 发送消息
76-
receiver!.HandleMessage(message);
76+
receiver!.HandleMessage(in message);
7777

7878
return true;
7979
}
@@ -110,7 +110,7 @@ public bool DispatchMessage(EntityName receiverName,
110110
}
111111

112112
// 5. 发送消息
113-
receiver.HandleMessage(message);
113+
receiver.HandleMessage(in message);
114114

115115
return true;
116116
}
@@ -243,7 +243,7 @@ private void DispatchMessage(Telegram message)
243243
var receiver = EntityManger.TryGetEntity(message.ReceiverInsId);
244244

245245
// 2. 派发消息
246-
receiver!.HandleMessage(message);
246+
receiver!.HandleMessage(in message);
247247
}
248248

249249
#endregion

StateMachineLearn/WestWord/Miner.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,15 @@ public Miner(IState<Miner> initState, IState<Miner> preState, EntityName name) :
8181

8282
#region 覆写
8383

84+
/// <summary>
85+
/// 处理信息
86+
/// </summary>
87+
/// <param name="msg"></param>
88+
public override void HandleMessage(in Telegram msg)
89+
{
90+
FSM.HandleMessage(in msg);
91+
}
92+
8493
/// <summary>
8594
/// 刷新条目当前的状态 - 每帧(每次循环)调用
8695
/// </summary>

StateMachineLearn/WestWord/MinerOwnedState.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System.Diagnostics;
2-
using System.Globalization;
32

43
namespace StateMachineLearn;
54
using Behavior = ConstDefine.MinerBehavior;
@@ -303,8 +302,12 @@ public override void Enter(Miner owner)
303302
return;
304303
}
305304
owner.CurrentLocation = Location.LocationType.Home;
305+
306+
// 2. 通知妻子自己回家了
307+
MessageDispatcher.Instance.DispatchMessage(EntityName.EntityElsa, owner.Name,
308+
ConstDefine.MessageType.HiHoneyImHome, 0, null);
306309

307-
WriteExt.WriteBgWhiteAndFgYellow($"MinerId:{owner.InsId}, GoHomeAndSleepTilRestedState,回到家里");
310+
WriteExt.WriteBgWhiteAndFgYellow($"MinerId:{owner.InsId}, GoHomeAndSleepTilRestedState,回到家里,并告知妻子自己回来了");
308311
}
309312

310313
/// <summary>
@@ -363,7 +366,7 @@ public override void Exit(Miner owner)
363366
/// <param name="message"></param>
364367
/// <param name="owner"></param>
365368
/// <returns></returns>
366-
public override bool OnMessage(Telegram message, Miner owner)
369+
public override bool OnMessage(in Telegram message, Miner owner)
367370
{
368371
switch (message.MessageType)
369372
{
@@ -564,7 +567,7 @@ public override void Exit(Miner owner)
564567
/// <param name="message"></param>
565568
/// <param name="owner"></param>
566569
/// <returns></returns>
567-
public override bool OnMessage(Telegram message, Miner owner)
570+
public override bool OnMessage(in Telegram message, Miner owner)
568571
{
569572
throw new NotImplementedException();
570573
}

StateMachineLearn/WestWord/State.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public interface IState<in TOwner> where TOwner : class
2626
/// <param name="message"></param>
2727
/// <param name="owner"></param>
2828
/// <returns></returns>
29-
public bool OnMessage(Telegram message, Miner owner);
29+
public bool OnMessage(in Telegram message, TOwner owner);
3030
}
3131

3232
/// <summary>
@@ -66,9 +66,9 @@ public virtual void Exit(TOwner owner)
6666
/// <param name="message"></param>
6767
/// <param name="owner"></param>
6868
/// <returns></returns>
69-
public virtual bool OnMessage(Telegram message, Miner owner)
69+
public virtual bool OnMessage(in Telegram message, TOwner owner)
7070
{
71-
return true;
71+
return false;
7272
}
7373

7474
#endregion

StateMachineLearn/WestWord/StateMachine.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,5 +91,22 @@ public bool IsInState(IState<TOwner> state)
9191
{
9292
return ReferenceEquals(CurrentState, state);
9393
}
94+
95+
/// <summary>
96+
/// 处理消息
97+
/// </summary>
98+
/// <param name="msg"></param>
99+
/// <returns></returns>
100+
public bool HandleMessage(in Telegram msg)
101+
{
102+
// 1. 查看当前状态是否有效并且可以处理消息
103+
if(CurrentState.OnMessage(in msg, Owner))
104+
{
105+
return true;
106+
}
107+
108+
// 2. 全局状态是否可以处理消息
109+
return GlobalState?.OnMessage(in msg, Owner) ?? false;
110+
}
94111

95112
}

StateMachineLearn/WestWord/Wife.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ public interface IWife : IBaseGameEntity
2323
/// </summary>
2424
public StateMachine<Wife> FSM { get; set; }
2525

26+
/// <summary>
27+
/// 是否在烹饪
28+
/// </summary>
29+
bool IsInCooking { get; set; }
30+
2631
#endregion
2732

2833
#region 方法成员
@@ -54,9 +59,9 @@ public Wife(IState<Wife> initState, IState<Wife> preState, EntityName name) : ba
5459
/// 处理信息
5560
/// </summary>
5661
/// <param name="msg"></param>
57-
public override void HandleMessage(Telegram msg)
62+
public override void HandleMessage(in Telegram msg)
5863
{
59-
FSM.
64+
FSM.HandleMessage(in msg);
6065
}
6166

6267
#endregion
@@ -90,6 +95,11 @@ public override void Update()
9095
/// </summary>
9196
public StateMachine<Wife> FSM { get; set; }
9297

98+
/// <summary>
99+
/// 是否在烹饪
100+
/// </summary>
101+
public bool IsInCooking { get; set; }
102+
93103
/// <summary>
94104
/// 是否需要去洗手间
95105
/// </summary>

StateMachineLearn/WestWord/WifeOwnedState.cs

Lines changed: 43 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -227,21 +227,6 @@ public override void Enter(Wife owner)
227227
return;
228228
}
229229

230-
// 1. 将妻子放置到洗手间
231-
if (owner.CurrentLocation != Location.BathRoom)
232-
{
233-
234-
owner.CurrentLocation= Location.BathRoom;
235-
}
236-
237-
// 2. 1/2 的概率来进入煮肉状态
238-
var random = new Random();
239-
int result = random.Next(0, 10);
240-
if (result % 2 == 0)
241-
{
242-
owner.FSM.ChangState(CookStew.Instance);
243-
}
244-
245230
WriteExt.WriteBgWhiteAndFgYellow($"wifeId:{entity.InsId}, 全局状态");
246231
}
247232

@@ -251,27 +236,6 @@ public override void Enter(Wife owner)
251236
/// <param name="owner"></param>
252237
public override void Execute(Wife owner)
253238
{
254-
// 2. 1/2 的概率来进入煮肉状态
255-
var random = new Random();
256-
int result = random.Next(0, 10);
257-
if (result % 2 == 0)
258-
{
259-
owner.FSM.ChangState(CookStew.Instance);
260-
}
261-
262-
if (!owner.IsNeedToGoBathroom())
263-
{
264-
return;
265-
}
266-
267-
// 1. 情况妻子的疲劳度
268-
owner.CurrentTirednessThreshold = 0;
269-
270-
// 2. 回到进入全局状态前的状态
271-
owner.FSM.RevertToPreviousState();
272-
273-
// 3. 打日志
274-
WriteExt.WriteBgWhiteAndFgBlue($"WifeId:{owner.InsId}, 全局状态解决完毕,切换状态到进入全局状态前的状态");
275239
}
276240

277241
/// <summary>
@@ -308,6 +272,33 @@ public static WifeGlobalState Instance
308272
}
309273
}
310274

275+
#region Overrides of State<Wife>
276+
277+
/// <summary>
278+
/// 处理消息
279+
/// </summary>
280+
/// <param name="message"></param>
281+
/// <param name="owner"></param>
282+
/// <returns></returns>
283+
public override bool OnMessage(in Telegram message, Wife owner)
284+
{
285+
// 1. 不是矿工回家的消息
286+
if (message.MessageType != ConstDefine.MessageType.HiHoneyImHome)
287+
{
288+
return false;
289+
}
290+
291+
WriteExt.WriteBgWhiteAndFgYellow($"WifeId:{owner.InsId}, 收到消息,开始进入全局状态");
292+
293+
// 2. 更改状态到烹饪
294+
owner.FSM.ChangState(CookStew.Instance);
295+
296+
return true;
297+
298+
}
299+
300+
#endregion
301+
311302
#endregion
312303
}
313304

@@ -329,10 +320,20 @@ private CookStew()
329320
/// <param name="owner"></param>
330321
public override void Enter(Wife owner)
331322
{
323+
// 1. 检查当前状态
332324
if(owner.CurrentLocation!= Location.Kitchen)
333325
{
334326
owner.CurrentLocation = Location.Kitchen;
335327
}
328+
329+
// 2. 检查是否处于烹饪状态
330+
if (owner.IsInCooking)
331+
{
332+
return;
333+
}
334+
335+
// 3. 设置当前处于烹饪状态
336+
owner.IsInCooking = true;
336337

337338
WriteExt.WriteBgWhiteAndFgYellow($"wifeId:{owner.InsId}, 进入煮肉的状态");
338339
}
@@ -343,9 +344,9 @@ public override void Enter(Wife owner)
343344
/// <param name="owner"></param>
344345
public override void Execute(Wife owner)
345346
{
346-
// 1. 发送煮肉完成的消息给矿工
347+
// 1. 开始烹饪,并在烹饪好的时候提醒自己
347348
MessageDispatcher.Instance.DispatchMessage(owner.Name, EntityName.EntityElsa,
348-
ConstDefine.MessageType.StewReady, 0.0001, null);
349+
ConstDefine.MessageType.StewReady, 0.01, null);
349350

350351
WriteExt.WriteBgWhiteAndFgBlue($"wifeId:{owner.InsId}, 正在煮肉");
351352
}
@@ -365,16 +366,18 @@ public override void Exit(Wife owner)
365366
/// <param name="message"></param>
366367
/// <param name="owner"></param>
367368
/// <returns></returns>
368-
public override bool OnMessage(Telegram message, Miner owner)
369+
public override bool OnMessage(in Telegram message, Wife owner)
369370
{
370371
switch (message.MessageType)
371372
{
372373
// 1. 煮肉完成通知矿工
373374
case ConstDefine.MessageType.StewReady:
374375
{
375376
WriteExt.WriteBgWhiteAndFgRed($"wifeId:{owner.InsId}, 收到煮肉完成的消息");
376-
MessageDispatcher.Instance.DispatchMessage(owner.Name, EntityName.EntityMinerBob,
377+
MessageDispatcher.Instance.DispatchMessage(EntityName.EntityMinerBob, owner.Name,
377378
ConstDefine.MessageType.StewReady, 0, null);
379+
owner.IsInCooking = false;
380+
owner.FSM.ChangState(DoHouseWork.Instance);
378381
return true;
379382
}
380383
case ConstDefine.MessageType.HiHoneyImHome:
512 Bytes
Binary file not shown.
108 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)