public void Work() { DX.DrawBox(0, 0, 800, 800, DX.GetColor(0, 200, 200), 1); // 1キーでやり直せる if (Input.GetKeyState(DX.KEY_INPUT_1).IsDown) { GameMain.ChangeScene(new Promotion(cntr)); } // クライアントは地面あり if (cntr.Type == StartType.Client) { charas.ForEach(x => { if (x.Y > 600 - x.Size.Y) { x.Y = 600 - x.Size.Y; //x.Speed.Y = 0.4 * -x.Speed.Y; x.Speed.Y = 0; if (x.Speed.X > 0.5f) { x.Speed.X -= 0.5f; } else if (x.Speed.X < -0.5f) { x.Speed.X += 0.5f; } else { x.Speed.X = 0; } } }); // なにもいなかったら追加 if (!charas.Any(x => !x.Killing)) { for (int i = 0; i < 800; i += 40) { charas.Add(new Chara(i, 300, DXResources.Images["Vista"])); } } // クリックされたら if (Input.MouseState.IsUp) { /*charas.Where(x => x.IsHit(Input.MousePoint) && !x.Hold) * .ForEach(x => { x.Hold = true; });*/ foreach (Chara x in charas) { if (x.IsHit(Input.MousePoint) && !x.Hold) { //一つしか掴めない x.Hold = true; break; } } } // 離されたら else if (Input.MouseState.IsDown) { charas.Where(x => x.Hold) .ForEach(x => { x.Hold = false; x.Move(Input.MousePoint - Input.PreviousMousePoint); }); } // 移動 charas.Where(x => x.Hold) .ForEach(x => { x.Center = Input.MousePoint; x.Speed.X = 0; x.Speed.Y = 0; }); } // サーバーにはボスが出現 // XPさん if (cntr.Type == StartType.Server && !boss.Killed) { boss.Draw(); boss.SetSize(400, 300); charas.Where(x => boss.IsHitToBoss(x.X, x.Y)) .Where(x => !x.Killing) .ToArray() .ForEach(x => { x.Kill(DXResources.Effects["Bomb"]); bossHp--; }); charas.ForEach(x => { x.SetSize(40, 40); }); if (bossHp < 0) { boss.Kill(DXResources.Effects["Explode"]); } } // 範囲外は送信 charas.Where(x => cntr.Type == StartType.Server ? x.Y >= 600 : x.Y <= 0) .ToArray() .ForEach(x => { charas.Remove(x); if (x.Y <= 0) { x.Y = 600 - x.Size.Y; } else { x.Y = 0; } cntr.Write(x.Serialize()); }); // 消滅済みは削除 charas.RemoveAll(charas.Where(x => x.Killed).Contains); // 受信してみてエラーじゃなかったら追加 var read = new Error <Chara>(() => Chara.Deserialize(cntr.Read())); if (!read.IsError) { charas.Add(read.Value); } // 描画と動作 charas.ForEach(x => { x.Move(); x.Draw(); }); }
public void Work() { DX.DrawBox(0, 0, 800, 800, DX.GetColor(0, 200, 200), 1); ParseInput(); ShowMenu(); // メニュー選択 if (z.IsDown && (cntr == null || !cntr.IsWaiting)) { switch (selectIndex) { case 0: // キャストをErrorモナドに包む var error = new Monads.Error <int>(() => int.Parse(Interaction.InputBox("Input port.", "Server create", 10800.ToString(), -1, -1))); // エラーでないなら開始 if (!error.IsError) { cntr = new NetConnector(StartType.Server, error.Value); cntr.Start(); } break; case 1: var input = Interaction.InputBox("Input hostname:port", "Connect", "localhost:10800", -1, -1); // キャストとSplitをErrorモナドに包む var error2 = new Monads.Error <Tuple <int, string> >(() => Tuple.Create(int.Parse(input.Split(':')[1]), input.Split(':')[0])); // エラーでないなら開始 if (!error2.IsError) { cntr = new NetConnector(StartType.Client, error2.Value.Item1, error2.Value.Item2); cntr.Start(); } break; case 2: // キャストとIOとSplitをErrorモナドに包む var error3 = new Monads.Error <Tuple <int, string> >(() => { using (var reader = new StreamReader(File.Open("IPAddress.txt", FileMode.OpenOrCreate))) { var input2 = reader.ReadLine(); return(Tuple.Create(int.Parse(input2.Split(':')[1]), input2.Split(':')[0])); } }); // エラーでないなら開始 if (!error3.IsError) { cntr = new NetConnector(StartType.Client, error3.Value.Item1, error3.Value.Item2); cntr.Start(); } break; } } // 接続待ち中にキャンセル if (x.IsHold && cntr != null && cntr.IsWaiting) { cntr.Dispose(); cntr = null; } // 接続されたら本編に移動 if (cntr != null && cntr.IsConnected) { GameMain.ChangeScene(new Promotion(cntr)); } }