예제 #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(); });
        }