Example #1
0
        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(); });
        }
Example #2
0
        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));
            }
        }