|
|
@@ -49,8 +49,11 @@ namespace Client |
|
|
isPlaybackMode = false; |
|
|
isPlaybackMode = false; |
|
|
drawPicLock = new(); |
|
|
drawPicLock = new(); |
|
|
listOfProp = new List<MessageOfProp>(); |
|
|
listOfProp = new List<MessageOfProp>(); |
|
|
listOfHuman = new List<MessageOfHuman>(); |
|
|
|
|
|
listOfButcher = new List<MessageOfButcher>(); |
|
|
|
|
|
|
|
|
listOfHuman = new List<MessageOfStudent>(); |
|
|
|
|
|
listOfButcher = new List<MessageOfTricker>(); |
|
|
|
|
|
listOfBullet=new List<MessageOfBullet>(); |
|
|
|
|
|
listOfBombedBullet = new List<MessageOfBombedBullet>(); |
|
|
|
|
|
listOfAll=new List<MessageOfAll>(); |
|
|
WindowStartupLocation = WindowStartupLocation.CenterScreen; |
|
|
WindowStartupLocation = WindowStartupLocation.CenterScreen; |
|
|
comInfo[0] = "183.172.208.156"; |
|
|
comInfo[0] = "183.172.208.156"; |
|
|
comInfo[1] = "8888"; |
|
|
comInfo[1] = "8888"; |
|
|
@@ -62,12 +65,15 @@ namespace Client |
|
|
//OnReceive(); |
|
|
//OnReceive(); |
|
|
DrawMap(); |
|
|
DrawMap(); |
|
|
ZoomMap(); |
|
|
ZoomMap(); |
|
|
MessageOfHuman kurei = new MessageOfHuman(); |
|
|
|
|
|
|
|
|
MessageOfStudent kurei = new MessageOfStudent(); |
|
|
kurei.X = 10000; |
|
|
kurei.X = 10000; |
|
|
kurei.Y = 20000; |
|
|
kurei.Y = 20000; |
|
|
kurei.Speed = 1000; |
|
|
kurei.Speed = 1000; |
|
|
kurei.PlayerId = 0; |
|
|
kurei.PlayerId = 0; |
|
|
listOfHuman.Add(kurei); |
|
|
listOfHuman.Add(kurei); |
|
|
|
|
|
MessageOfAll all= new MessageOfAll(); |
|
|
|
|
|
all.HiddenGateRefreshed = false; |
|
|
|
|
|
listOfAll.Add(all); |
|
|
// ReactToCommandline(); |
|
|
// ReactToCommandline(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@@ -82,7 +88,7 @@ namespace Client |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 连接Server,comInfo[]的格式:0-ip 1- port 2-playerID 3-playerType 4-human/butcherType |
|
|
|
|
|
|
|
|
// 连接Server,comInfo[]的格式:0-ip 1- port 2-playerID 3-playerType 4-human/TrickerType |
|
|
private void ConnectToServer(string[] comInfo) |
|
|
private void ConnectToServer(string[] comInfo) |
|
|
{ |
|
|
{ |
|
|
if (!isPlaybackMode) |
|
|
if (!isPlaybackMode) |
|
|
@@ -103,8 +109,8 @@ namespace Client |
|
|
playerType = Convert.ToInt64(comInfo[3]) switch |
|
|
playerType = Convert.ToInt64(comInfo[3]) switch |
|
|
{ |
|
|
{ |
|
|
0 => PlayerType.NullPlayerType, |
|
|
0 => PlayerType.NullPlayerType, |
|
|
1 => PlayerType.HumanPlayer, |
|
|
|
|
|
2 => PlayerType.ButcherPlayer, |
|
|
|
|
|
|
|
|
1 => PlayerType.StudentPlayer, |
|
|
|
|
|
2 => PlayerType.TrickerPlayer, |
|
|
}; |
|
|
}; |
|
|
if (Convert.ToInt64(comInfo[3]) == 1) |
|
|
if (Convert.ToInt64(comInfo[3]) == 1) |
|
|
{ |
|
|
{ |
|
|
@@ -115,47 +121,47 @@ namespace Client |
|
|
humanOrButcher = false; |
|
|
humanOrButcher = false; |
|
|
} |
|
|
} |
|
|
playerMsg.PlayerType = playerType; |
|
|
playerMsg.PlayerType = playerType; |
|
|
if (playerType == PlayerType.HumanPlayer) |
|
|
|
|
|
|
|
|
if (playerType == PlayerType.StudentPlayer) |
|
|
{ |
|
|
{ |
|
|
switch (Convert.ToInt64(comInfo[4])) |
|
|
switch (Convert.ToInt64(comInfo[4])) |
|
|
{ |
|
|
{ |
|
|
case 0: |
|
|
case 0: |
|
|
playerMsg.HumanType = HumanType.NullHumanType; |
|
|
|
|
|
|
|
|
playerMsg.StudentType = StudentType.NullStudentType; |
|
|
break; |
|
|
break; |
|
|
case 1: |
|
|
case 1: |
|
|
playerMsg.HumanType = HumanType._1; |
|
|
|
|
|
|
|
|
playerMsg.StudentType = StudentType._1; |
|
|
break; |
|
|
break; |
|
|
case 2: |
|
|
case 2: |
|
|
playerMsg.HumanType = HumanType._2; |
|
|
|
|
|
|
|
|
playerMsg.StudentType = StudentType._2; |
|
|
break; |
|
|
break; |
|
|
case 3: |
|
|
case 3: |
|
|
playerMsg.HumanType = HumanType._3; |
|
|
|
|
|
|
|
|
playerMsg.StudentType = StudentType._3; |
|
|
break; |
|
|
break; |
|
|
case 4: |
|
|
case 4: |
|
|
playerMsg.HumanType = HumanType._4; |
|
|
|
|
|
|
|
|
playerMsg.StudentType = StudentType._4; |
|
|
break; |
|
|
break; |
|
|
default: |
|
|
default: |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
else if (playerType == PlayerType.ButcherPlayer) |
|
|
|
|
|
|
|
|
else if (playerType == PlayerType.TrickerPlayer) |
|
|
{ |
|
|
{ |
|
|
switch (Convert.ToInt64(comInfo[4])) |
|
|
switch (Convert.ToInt64(comInfo[4])) |
|
|
{ |
|
|
{ |
|
|
case 0: |
|
|
case 0: |
|
|
playerMsg.ButcherType = ButcherType.NullButcherType; |
|
|
|
|
|
|
|
|
playerMsg.TrickerType = TrickerType.NullTrickerType; |
|
|
break; |
|
|
break; |
|
|
case 1: |
|
|
case 1: |
|
|
playerMsg.ButcherType = ButcherType._1; |
|
|
|
|
|
|
|
|
playerMsg.TrickerType = TrickerType._1; |
|
|
break; |
|
|
break; |
|
|
case 2: |
|
|
case 2: |
|
|
playerMsg.ButcherType = ButcherType._2; |
|
|
|
|
|
|
|
|
playerMsg.TrickerType = TrickerType._2; |
|
|
break; |
|
|
break; |
|
|
case 3: |
|
|
case 3: |
|
|
playerMsg.ButcherType = ButcherType._3; |
|
|
|
|
|
|
|
|
playerMsg.TrickerType = TrickerType._3; |
|
|
break; |
|
|
break; |
|
|
case 4: |
|
|
case 4: |
|
|
playerMsg.ButcherType = ButcherType._4; |
|
|
|
|
|
|
|
|
playerMsg.TrickerType = TrickerType._4; |
|
|
break; |
|
|
break; |
|
|
default: |
|
|
default: |
|
|
break; |
|
|
break; |
|
|
@@ -188,7 +194,7 @@ namespace Client |
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 获得地图信息 |
|
|
|
|
|
|
|
|
// 获得地图信息,未更新数值 |
|
|
private void GetMap(MessageOfMap obj) |
|
|
private void GetMap(MessageOfMap obj) |
|
|
{ |
|
|
{ |
|
|
int[,] map = new int[50, 50]; |
|
|
int[,] map = new int[50, 50]; |
|
|
@@ -264,8 +270,14 @@ namespace Client |
|
|
mapPatches[i, j].Stroke = Brushes.LightSkyBlue; |
|
|
mapPatches[i, j].Stroke = Brushes.LightSkyBlue; |
|
|
break;//door |
|
|
break;//door |
|
|
case 10: |
|
|
case 10: |
|
|
mapPatches[i, j].Fill = Brushes.LightSalmon; |
|
|
|
|
|
mapPatches[i, j].Stroke = Brushes.LightSalmon; |
|
|
|
|
|
|
|
|
foreach (var obj in listOfAll) |
|
|
|
|
|
{ |
|
|
|
|
|
if(obj.HiddenGateRefreshed) |
|
|
|
|
|
{ |
|
|
|
|
|
mapPatches[i, j].Fill = Brushes.LightSalmon; |
|
|
|
|
|
mapPatches[i, j].Stroke = Brushes.LightSalmon; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
break;//emergency |
|
|
break;//emergency |
|
|
default: |
|
|
default: |
|
|
break; |
|
|
break; |
|
|
@@ -305,7 +317,8 @@ namespace Client |
|
|
laserIcon.Points = laserEndPoints; |
|
|
laserIcon.Points = laserEndPoints; |
|
|
UpperLayerOfMap.Children.Add(laserIcon); |
|
|
UpperLayerOfMap.Children.Add(laserIcon); |
|
|
} |
|
|
} |
|
|
private async void OnReceive() // log未更新,switch1,2更新log |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private async void OnReceive() // 已按照3.5版proto更新信息,但是左侧信息栏还未填充。log未更新,switch1,2,3更新log |
|
|
{ |
|
|
{ |
|
|
try |
|
|
try |
|
|
{ |
|
|
{ |
|
|
@@ -316,88 +329,90 @@ namespace Client |
|
|
listOfHuman.Clear(); |
|
|
listOfHuman.Clear(); |
|
|
listOfButcher.Clear(); |
|
|
listOfButcher.Clear(); |
|
|
listOfProp.Clear(); |
|
|
listOfProp.Clear(); |
|
|
|
|
|
listOfBombedBullet.Clear(); |
|
|
|
|
|
listOfBullet.Clear(); |
|
|
|
|
|
listOfAll.Clear(); |
|
|
MessageToClient content = responseStream.ResponseStream.Current; |
|
|
MessageToClient content = responseStream.ResponseStream.Current; |
|
|
switch (content.GameState) |
|
|
switch (content.GameState) |
|
|
{ |
|
|
{ |
|
|
case GameState.GameStart: |
|
|
case GameState.GameStart: |
|
|
foreach (var obj in content.HumanMessage) |
|
|
|
|
|
{ |
|
|
|
|
|
if (humanOrButcher && obj.PlayerId == playerID) |
|
|
|
|
|
{ |
|
|
|
|
|
human = obj; |
|
|
|
|
|
} |
|
|
|
|
|
listOfHuman.Add(obj); |
|
|
|
|
|
} |
|
|
|
|
|
foreach (var obj in content.ButcherMessage) |
|
|
|
|
|
|
|
|
case GameState.GameRunning: |
|
|
|
|
|
foreach (var obj in content.ObjMessage) |
|
|
{ |
|
|
{ |
|
|
if (!humanOrButcher && obj.PlayerId == playerID) |
|
|
|
|
|
|
|
|
switch (obj.MessageOfObjCase) |
|
|
{ |
|
|
{ |
|
|
butcher = obj; |
|
|
|
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.StudentMessage: |
|
|
|
|
|
if (humanOrButcher && obj.StudentMessage.PlayerId == playerID) |
|
|
|
|
|
{ |
|
|
|
|
|
human = obj.StudentMessage; |
|
|
|
|
|
} |
|
|
|
|
|
listOfHuman.Add(obj.StudentMessage); |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.TrickerMessage: |
|
|
|
|
|
if (!humanOrButcher && obj.TrickerMessage.PlayerId == playerID) |
|
|
|
|
|
{ |
|
|
|
|
|
butcher = obj.TrickerMessage; |
|
|
|
|
|
} |
|
|
|
|
|
listOfButcher.Add(obj.TrickerMessage); |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.PropMessage: |
|
|
|
|
|
listOfProp.Add(obj.PropMessage); |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.BombedBulletMessage: |
|
|
|
|
|
listOfBombedBullet.Add(obj.BombedBulletMessage); |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.BulletMessage: |
|
|
|
|
|
listOfBullet.Add(obj.BulletMessage); |
|
|
|
|
|
break; |
|
|
} |
|
|
} |
|
|
listOfButcher.Add(obj); |
|
|
|
|
|
} |
|
|
|
|
|
foreach (var obj in content.PropMessage) |
|
|
|
|
|
{ |
|
|
|
|
|
listOfProp.Add(obj); |
|
|
|
|
|
} |
|
|
} |
|
|
GetMap(content.MapMessage); |
|
|
GetMap(content.MapMessage); |
|
|
|
|
|
listOfAll.Add(content.AllMessage); |
|
|
break; |
|
|
break; |
|
|
case GameState.GameRunning: |
|
|
|
|
|
foreach (var obj in content.HumanMessage) |
|
|
|
|
|
{ |
|
|
|
|
|
if (humanOrButcher && obj.PlayerId == playerID) |
|
|
|
|
|
{ |
|
|
|
|
|
human = obj; |
|
|
|
|
|
} |
|
|
|
|
|
listOfHuman.Add(obj); |
|
|
|
|
|
} |
|
|
|
|
|
foreach (var obj in content.ButcherMessage) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case GameState.GameEnd: |
|
|
|
|
|
foreach (var obj in content.ObjMessage) |
|
|
{ |
|
|
{ |
|
|
if (!humanOrButcher && obj.PlayerId == playerID) |
|
|
|
|
|
|
|
|
switch (obj.MessageOfObjCase) |
|
|
{ |
|
|
{ |
|
|
butcher = obj; |
|
|
|
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.StudentMessage: |
|
|
|
|
|
listOfHuman.Add(obj.StudentMessage); |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.TrickerMessage: |
|
|
|
|
|
listOfButcher.Add(obj.TrickerMessage); |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.PropMessage: |
|
|
|
|
|
listOfProp.Add(obj.PropMessage); |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.BombedBulletMessage: |
|
|
|
|
|
listOfBombedBullet.Add(obj.BombedBulletMessage); |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.BulletMessage: |
|
|
|
|
|
listOfBullet.Add(obj.BulletMessage); |
|
|
|
|
|
break; |
|
|
} |
|
|
} |
|
|
listOfButcher.Add(obj); |
|
|
|
|
|
} |
|
|
|
|
|
foreach (var obj in content.PropMessage) |
|
|
|
|
|
{ |
|
|
|
|
|
listOfProp.Add(obj); |
|
|
|
|
|
} |
|
|
|
|
|
if (!mapFlag) |
|
|
|
|
|
GetMap(content.MapMessage); |
|
|
|
|
|
break; |
|
|
|
|
|
case GameState.GameEnd: |
|
|
|
|
|
foreach (var obj in content.HumanMessage) |
|
|
|
|
|
{ |
|
|
|
|
|
listOfHuman.Add(obj); |
|
|
|
|
|
} |
|
|
|
|
|
foreach (var obj in content.ButcherMessage) |
|
|
|
|
|
{ |
|
|
|
|
|
listOfButcher.Add(obj); |
|
|
|
|
|
} |
|
|
|
|
|
foreach (var obj in content.PropMessage) |
|
|
|
|
|
{ |
|
|
|
|
|
listOfProp.Add(obj); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
listOfAll.Add(content.AllMessage); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
if (responseStream == null) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new Exception("Unconnected"); |
|
|
|
|
|
|
|
|
if (responseStream == null) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new Exception("Unconnected"); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
catch (Exception ex) |
|
|
catch (Exception ex) |
|
|
{ |
|
|
{ |
|
|
ErrorDisplayer error = new("Error: "+ex.ToString()); |
|
|
|
|
|
|
|
|
ErrorDisplayer error = new("Error: " + ex.ToString()); |
|
|
error.Show(); |
|
|
error.Show(); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private bool CanSee(MessageOfHuman msg) |
|
|
|
|
|
|
|
|
//待修改 |
|
|
|
|
|
private bool CanSee(MessageOfStudent msg) |
|
|
{ |
|
|
{ |
|
|
if (msg.State == HumanState.Dead) |
|
|
|
|
|
|
|
|
if (msg.State == StudentState.Quit) |
|
|
return false; |
|
|
return false; |
|
|
//if (playerID >= 2022 || teamID >= 2022) |
|
|
//if (playerID >= 2022 || teamID >= 2022) |
|
|
// return true; |
|
|
// return true; |
|
|
@@ -408,7 +423,7 @@ namespace Client |
|
|
} |
|
|
} |
|
|
if (msg.Place == PlaceType.Grass || msg.Place == PlaceType.Gate || msg.Place == PlaceType.HiddenGate) |
|
|
if (msg.Place == PlaceType.Grass || msg.Place == PlaceType.Gate || msg.Place == PlaceType.HiddenGate) |
|
|
return false; |
|
|
return false; |
|
|
if (msg.Place == PlaceType.Land || msg.Place == PlaceType.Machine) |
|
|
|
|
|
|
|
|
if (msg.Place == PlaceType.Land || msg.Place == PlaceType.Classroom) |
|
|
return true; |
|
|
return true; |
|
|
if (humanOrButcher && human != null) |
|
|
if (humanOrButcher && human != null) |
|
|
{ |
|
|
{ |
|
|
@@ -423,7 +438,7 @@ namespace Client |
|
|
return true; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private bool CanSee(MessageOfButcher msg) |
|
|
|
|
|
|
|
|
private bool CanSee(MessageOfTricker msg) |
|
|
{ |
|
|
{ |
|
|
// if (playerID >= 2022 || teamID >= 2022) |
|
|
// if (playerID >= 2022 || teamID >= 2022) |
|
|
// return true; |
|
|
// return true; |
|
|
@@ -434,7 +449,7 @@ namespace Client |
|
|
} |
|
|
} |
|
|
if (msg.Place == PlaceType.Grass || msg.Place == PlaceType.Gate || msg.Place == PlaceType.HiddenGate) |
|
|
if (msg.Place == PlaceType.Grass || msg.Place == PlaceType.Gate || msg.Place == PlaceType.HiddenGate) |
|
|
return false; |
|
|
return false; |
|
|
if (msg.Place == PlaceType.Land || msg.Place == PlaceType.Machine) |
|
|
|
|
|
|
|
|
if (msg.Place == PlaceType.Land || msg.Place == PlaceType.Classroom) |
|
|
return true; |
|
|
return true; |
|
|
if (humanOrButcher && human != null) |
|
|
if (humanOrButcher && human != null) |
|
|
{ |
|
|
{ |
|
|
@@ -466,7 +481,24 @@ namespace Client |
|
|
return true; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private void Refresh(object? sender, EventArgs e) |
|
|
|
|
|
|
|
|
private bool CanSee(MessageOfBullet msg) |
|
|
|
|
|
{ |
|
|
|
|
|
if (msg.Place == PlaceType.Land) |
|
|
|
|
|
return true; |
|
|
|
|
|
if (humanOrButcher && human != null) |
|
|
|
|
|
{ |
|
|
|
|
|
if (msg.Place != human.Place) |
|
|
|
|
|
return false; |
|
|
|
|
|
} |
|
|
|
|
|
else if (!humanOrButcher && butcher != null) |
|
|
|
|
|
{ |
|
|
|
|
|
if (msg.Place != butcher.Place) |
|
|
|
|
|
return false; |
|
|
|
|
|
} |
|
|
|
|
|
return true; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void Refresh(object? sender, EventArgs e) // 已按照3.5版proto更新信息,circumstance栏未更新 log未更新 |
|
|
{ |
|
|
{ |
|
|
// Bonus(); |
|
|
// Bonus(); |
|
|
if (WindowState == WindowState.Maximized) |
|
|
if (WindowState == WindowState.Maximized) |
|
|
@@ -483,6 +515,7 @@ namespace Client |
|
|
if (StatusBarsOfCircumstance != null) |
|
|
if (StatusBarsOfCircumstance != null) |
|
|
StatusBarsOfCircumstance.SetFontSize(12 * UpperLayerOfMap.ActualHeight / 650); |
|
|
StatusBarsOfCircumstance.SetFontSize(12 * UpperLayerOfMap.ActualHeight / 650); |
|
|
// 完成窗口信息更新 |
|
|
// 完成窗口信息更新 |
|
|
|
|
|
|
|
|
if (!isClientStocked) |
|
|
if (!isClientStocked) |
|
|
{ |
|
|
{ |
|
|
unit = Math.Sqrt(UpperLayerOfMap.ActualHeight * UpperLayerOfMap.ActualWidth) / 50; |
|
|
unit = Math.Sqrt(UpperLayerOfMap.ActualHeight * UpperLayerOfMap.ActualWidth) / 50; |
|
|
@@ -509,6 +542,10 @@ namespace Client |
|
|
//{ |
|
|
//{ |
|
|
lock (drawPicLock) // 加锁是必要的,画图操作和接收信息操作不能同时进行 |
|
|
lock (drawPicLock) // 加锁是必要的,画图操作和接收信息操作不能同时进行 |
|
|
{ |
|
|
{ |
|
|
|
|
|
foreach (var data in listOfAll) |
|
|
|
|
|
{ |
|
|
|
|
|
StatusBarsOfCircumstance.SetValue(data); |
|
|
|
|
|
} |
|
|
if (!hasDrawed && mapFlag) |
|
|
if (!hasDrawed && mapFlag) |
|
|
DrawMap(); |
|
|
DrawMap(); |
|
|
foreach (var data in listOfHuman) |
|
|
foreach (var data in listOfHuman) |
|
|
@@ -530,12 +567,13 @@ namespace Client |
|
|
} |
|
|
} |
|
|
foreach (var data in listOfButcher) |
|
|
foreach (var data in listOfButcher) |
|
|
{ |
|
|
{ |
|
|
|
|
|
StatusBarsOfHunter.SetValue(data); |
|
|
if (CanSee(data)) |
|
|
if (CanSee(data)) |
|
|
{ |
|
|
{ |
|
|
Ellipse icon = new() |
|
|
Ellipse icon = new() |
|
|
{ |
|
|
{ |
|
|
Width = 10, |
|
|
|
|
|
Height = 10, |
|
|
|
|
|
|
|
|
Width = unitWidth, |
|
|
|
|
|
Height = unitHeight, |
|
|
HorizontalAlignment = HorizontalAlignment.Left, |
|
|
HorizontalAlignment = HorizontalAlignment.Left, |
|
|
VerticalAlignment = VerticalAlignment.Top, |
|
|
VerticalAlignment = VerticalAlignment.Top, |
|
|
Margin = new Thickness(data.Y * unitWidth / 1000.0 - unitWidth / 2, data.X * unitHeight / 1000.0 - unitHeight / 2, 0, 0), |
|
|
Margin = new Thickness(data.Y * unitWidth / 1000.0 - unitWidth / 2, data.X * unitHeight / 1000.0 - unitHeight / 2, 0, 0), |
|
|
@@ -568,7 +606,75 @@ namespace Client |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
foreach (var data in listOfBullet) |
|
|
|
|
|
{ |
|
|
|
|
|
if (CanSee(data)) |
|
|
|
|
|
{ |
|
|
|
|
|
Ellipse icon = new() |
|
|
|
|
|
{ |
|
|
|
|
|
Width = 10, |
|
|
|
|
|
Height = 10, |
|
|
|
|
|
HorizontalAlignment = HorizontalAlignment.Left, |
|
|
|
|
|
VerticalAlignment = VerticalAlignment.Top, |
|
|
|
|
|
Margin = new Thickness(data.Y * unitWidth / 1000.0 - unitWidth / 2, data.X * unitHeight / 1000.0 - unitHeight / 2, 0, 0), |
|
|
|
|
|
Fill = Brushes.Red |
|
|
|
|
|
}; |
|
|
|
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
foreach (var data in listOfBombedBullet) |
|
|
|
|
|
{ |
|
|
|
|
|
switch (data.Type) |
|
|
|
|
|
{ |
|
|
|
|
|
case BulletType.FastBullet: |
|
|
|
|
|
{ |
|
|
|
|
|
Ellipse icon = new(); |
|
|
|
|
|
double bombRange = data.BombRange / 1000; |
|
|
|
|
|
icon.Width = bombRange * unitWidth; |
|
|
|
|
|
icon.Height = bombRange * unitHeight; |
|
|
|
|
|
icon.HorizontalAlignment = HorizontalAlignment.Left; |
|
|
|
|
|
icon.VerticalAlignment = VerticalAlignment.Top; |
|
|
|
|
|
icon.Margin = new Thickness(data.Y * unitWidth / 1000.0 - bombRange * unitWidth / 2, data.X * unitHeight / 1000.0 - bombRange * unitHeight / 2, 0, 0); |
|
|
|
|
|
icon.Fill = Brushes.Red; |
|
|
|
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
case BulletType.AtomBomb: |
|
|
|
|
|
{ |
|
|
|
|
|
Ellipse icon = new Ellipse(); |
|
|
|
|
|
double bombRange = data.BombRange / 1000; |
|
|
|
|
|
icon.Width = bombRange * unitWidth; |
|
|
|
|
|
icon.Height = bombRange * unitHeight; |
|
|
|
|
|
icon.HorizontalAlignment = HorizontalAlignment.Left; |
|
|
|
|
|
icon.VerticalAlignment = VerticalAlignment.Top; |
|
|
|
|
|
icon.Margin = new Thickness(data.Y * unitWidth / 1000.0 - bombRange * unitWidth / 2, data.X * unitHeight / 1000.0 - bombRange * unitHeight / 2, 0, 0); |
|
|
|
|
|
icon.Fill = Brushes.Red; |
|
|
|
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
case BulletType.OrdinaryBullet: |
|
|
|
|
|
{ |
|
|
|
|
|
Ellipse icon = new Ellipse(); |
|
|
|
|
|
double bombRange = data.BombRange / 1000; |
|
|
|
|
|
icon.Width = bombRange * unitWidth; |
|
|
|
|
|
icon.Height = bombRange * unitHeight; |
|
|
|
|
|
icon.HorizontalAlignment = HorizontalAlignment.Left; |
|
|
|
|
|
icon.VerticalAlignment = VerticalAlignment.Top; |
|
|
|
|
|
icon.Margin = new Thickness(data.Y * unitWidth / 1000.0 - bombRange * unitWidth / 2, data.X * unitHeight / 1000.0 - bombRange * unitHeight / 2, 0, 0); |
|
|
|
|
|
icon.Fill = Brushes.Red; |
|
|
|
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
case BulletType.LineBullet: |
|
|
|
|
|
{ |
|
|
|
|
|
double bombRange = data.BombRange / 1000; |
|
|
|
|
|
DrawLaser(new Point(data.Y * unitWidth / 1000.0, data.X * unitHeight / 1000.0), -data.FacingDirection + Math.PI / 2, bombRange * unitHeight, 0.5 * unitWidth); |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
default: |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
//} |
|
|
//} |
|
|
ZoomMap(); |
|
|
ZoomMap(); |
|
|
} |
|
|
} |
|
|
@@ -584,7 +690,7 @@ namespace Client |
|
|
counter++; |
|
|
counter++; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 键盘控制 |
|
|
|
|
|
|
|
|
// 键盘控制,未完善 |
|
|
private void KeyBoardControl(object sender, KeyEventArgs e) |
|
|
private void KeyBoardControl(object sender, KeyEventArgs e) |
|
|
{ |
|
|
{ |
|
|
if (!isPlaybackMode) |
|
|
if (!isPlaybackMode) |
|
|
@@ -640,21 +746,21 @@ namespace Client |
|
|
client.Attack(msgJ); |
|
|
client.Attack(msgJ); |
|
|
break; |
|
|
break; |
|
|
case Key.F: |
|
|
case Key.F: |
|
|
PickMsg msgF = new() |
|
|
|
|
|
|
|
|
PropMsg msgF = new() |
|
|
{ |
|
|
{ |
|
|
PlayerId = playerID, |
|
|
PlayerId = playerID, |
|
|
}; |
|
|
}; |
|
|
client.PickProp(msgF); |
|
|
client.PickProp(msgF); |
|
|
break; |
|
|
break; |
|
|
case Key.E: |
|
|
case Key.E: |
|
|
IDMsg msgE = new() |
|
|
|
|
|
|
|
|
PropMsg msgE = new() |
|
|
{ |
|
|
{ |
|
|
PlayerId = playerID, |
|
|
PlayerId = playerID, |
|
|
}; |
|
|
}; |
|
|
client.UseProp(msgE); |
|
|
client.UseProp(msgE); |
|
|
break; |
|
|
break; |
|
|
case Key.Q: |
|
|
case Key.Q: |
|
|
IDMsg msgQ = new() |
|
|
|
|
|
|
|
|
SkillMsg msgQ = new() |
|
|
{ |
|
|
{ |
|
|
PlayerId = playerID, |
|
|
PlayerId = playerID, |
|
|
}; |
|
|
}; |
|
|
@@ -825,11 +931,14 @@ namespace Client |
|
|
private readonly Rectangle[,] mapPatches = new Rectangle[50, 50]; |
|
|
private readonly Rectangle[,] mapPatches = new Rectangle[50, 50]; |
|
|
|
|
|
|
|
|
private List<MessageOfProp> listOfProp; |
|
|
private List<MessageOfProp> listOfProp; |
|
|
private List<MessageOfHuman> listOfHuman; |
|
|
|
|
|
private List<MessageOfButcher> listOfButcher; |
|
|
|
|
|
|
|
|
private List<MessageOfStudent> listOfHuman; |
|
|
|
|
|
private List<MessageOfTricker> listOfButcher; |
|
|
|
|
|
private List<MessageOfBullet> listOfBullet; |
|
|
|
|
|
private List<MessageOfBombedBullet> listOfBombedBullet; |
|
|
|
|
|
private List<MessageOfAll> listOfAll; |
|
|
private object drawPicLock = new object(); |
|
|
private object drawPicLock = new object(); |
|
|
private MessageOfHuman? human = null; |
|
|
|
|
|
private MessageOfButcher? butcher = null; |
|
|
|
|
|
|
|
|
private MessageOfStudent? human = null; |
|
|
|
|
|
private MessageOfTricker? butcher = null; |
|
|
private bool humanOrButcher;//true for human |
|
|
private bool humanOrButcher;//true for human |
|
|
|
|
|
|
|
|
private bool bonusflag; |
|
|
private bool bonusflag; |
|
|
|