コード例 #1
0
ファイル: Program.cs プロジェクト: DDevil97/GameRay
        public void StartSFMLProgram()
        {
            #region Initialization
            Map Map = new Map(_m.GetLength(0), _m.GetLength(1));

            for (int y = 0; y < _m.GetLength(1); y++)
            {
                for (int x = 0; x < _m.GetLength(0); x++)
                {
                    switch (_m[y, x])
                    {
                    case 1:
                        Map[x, y] = new Tile
                        {
                            Solid      = true,
                            DownAtlas  = new Vector2i(1, 0),
                            UpAtlas    = new Vector2i(1, 0),
                            LeftAtlas  = new Vector2i(1, 0),
                            RightAtlas = new Vector2i(1, 0)
                        };
                        break;

                    case 2:
                        Map[x, y] = new CircleTile
                        {
                            Solid      = true,
                            DownAtlas  = new Vector2i(1, 0),
                            UpAtlas    = new Vector2i(1, 0),
                            LeftAtlas  = new Vector2i(1, 0),
                            RightAtlas = new Vector2i(1, 0),
                            CeilAtlas  = new Vector2i(0, 0),
                            FloorAtlas = new Vector2i(2, 0),
                            //IsCeilMap = true
                        };
                        break;

                    case 5:
                        Map[x, y] = new Tile
                        {
                            Solid      = false,
                            DownAtlas  = new Vector2i(0, 0),
                            UpAtlas    = new Vector2i(0, 0),
                            LeftAtlas  = new Vector2i(1, 0),
                            RightAtlas = new Vector2i(1, 0),
                            CeilAtlas  = new Vector2i(0, 0),
                            FloorAtlas = new Vector2i(5, 0)
                        };
                        break;

                    case 0:
                        Map[x, y] = new Tile
                        {
                            Solid      = false,
                            DownAtlas  = new Vector2i(0, 0),
                            UpAtlas    = new Vector2i(0, 0),
                            LeftAtlas  = new Vector2i(1, 0),
                            RightAtlas = new Vector2i(1, 0),
                            CeilAtlas  = new Vector2i(0, 0),
                            FloorAtlas = new Vector2i(5, 0)
                        };
                        break;

                    case 6:
                        Map[x, y] = new Tile
                        {
                            Solid      = false,
                            DownAtlas  = new Vector2i(0, 0),
                            UpAtlas    = new Vector2i(0, 0),
                            LeftAtlas  = new Vector2i(1, 0),
                            RightAtlas = new Vector2i(1, 0),
                            CeilAtlas  = new Vector2i(0, 0),
                            FloorAtlas = new Vector2i(5, 0),
                            IsCeilMap  = true
                        };
                        break;
                    }
                }
            }


            window = new RenderWindow(new VideoMode(800, 600), "SFML window", Styles.Default);
            window.SetVisible(true);
            window.Closed     += new EventHandler(OnClosed);
            window.KeyPressed += new EventHandler <KeyEventArgs>(OnKeyPressed);
            window.MouseMoved += Window_MouseMoved;

            //Vector2f screen = new Vector2f(200, 100);

            Vector2f screen = new Vector2f(window.Size.X, window.Size.Y);
            screen *= 0.3f;
            rs      = new RenderTexture((uint)screen.X, (uint)screen.Y);

            caster = new RayCaster(Map, 32);

            Renderer ren = new Renderer(caster, window, rs, Map, fov, new Color(16, 16, 16));
            ren.Textures.Add(new Texture("Texture.png"));
            ren.MapAtlasInUse = 0;
            #endregion

            Vector2f player = new Vector2f(caster.CellSize * 6 + 8, caster.CellSize * 5 + 8);
            Vector2f sp1    = player + new Vector2f(70, 15);
            Vector2f sp2    = player + new Vector2f(50, 70);

            Vector2f sp3  = new Vector2f(caster.CellSize * 6 + 8, caster.CellSize * 5 + 8) + new Vector2f(30, -30);
            Vector2f scen = sp1 + new Vector2f(60, 60);

            Vector2f M;

            font = new Font("Perfect DOS VGA 437 Win.ttf");
            Text t          = new Text("Fps: ", font, 16);
            int  fps        = 0;
            int  fpsCounter = 0;
            int  ticks      = Environment.TickCount;
            int  ticksFps   = Environment.TickCount;


            int timeDelta = 0;

            var lamps = new List <Light>();
            //{
            //    new Light (
            //        new Vector2f(sp1.X,sp1.Y),
            //        new Color(255,255,255)
            //    ),
            //    new Light (
            //        new Vector2f(sp2.X,sp2.Y),
            //        new Color(128,128,0)
            //    )
            //};



            List <Sprite> sprites = new List <Sprite>();
            Random        r       = new Random();

            for (int i = 0; i < 5; i++)
            {
                sprites.Add(new Sprite
                            (
                                new Vector2f((float)r.NextDouble() * caster.CellSize * Map.Tiles.GetLength(0), (float)r.NextDouble() * caster.CellSize * Map.Tiles.GetLength(1)),
                                new Vector2i(3, 0)
                            ));
            }
            Random rand = new Random();
            lamps = sprites.Select(s => new Light(s.Position, new Color((byte)(rand.NextDouble() * 80), 0, (byte)(rand.NextDouble() * 80)))).ToList();


            ren.GenerateLightMap(lamps, 0.5f);
            //sprites.Add(new Sprite
            //(
            //    sp2,
            //    new Vector2i(3, 0)
            //));

            //Sprite p = new Sprite
            //(
            //    sp1,
            //    new Vector2i(3, 0)
            //);
            //sprites.Add(p);

            AudioSystem audio        = new AudioSystem(32, Map, caster);
            Sprite      playerSprite = new Sprite(player, new Vector2i(0, 0));
            audio.Listener = playerSprite;
            int a = audio.LoadSound("ts.wav");
            audio.PlaySound(a, true, sp1);

            float look   = rs.Size.Y / 2;
            float height = caster.CellSize / 2;
            ren.SkyPosition = new Vector2f(5, 5);
            ren.SkyAtlas    = new Vector2i(6, 0);

            window.MouseWheelScrolled += (o, e) =>
            {
                height += e.Delta / 1;
                if (height > caster.CellSize)
                {
                    height = caster.CellSize;
                }

                if (height < 0)
                {
                    height = 0;
                }
            };

            while (window.IsOpen)
            {
                if (Environment.TickCount - ticksFps >= timeDelta)
                {
                    ticksFps = Environment.TickCount;
                    if (Environment.TickCount - ticks >= 1000)
                    {
                        fps        = fpsCounter;
                        fpsCounter = 0;
                        ticks      = Environment.TickCount;
                    }

                    angle -= (window.Size.X / 2 - Mouse.GetPosition(window).X) / 4f;
                    look  += (window.Size.Y / 2 - Mouse.GetPosition(window).Y) / 3f;

                    if (look < 0)
                    {
                        look = 0;
                    }
                    if (look > rs.Size.Y)
                    {
                        look = rs.Size.Y;
                    }

                    ren.SkyPosition += new Vector2f(0.01f, 0.05f);


                    if (Keyboard.IsKeyPressed(Keyboard.Key.P))
                    {
                        lamps.Add(
                            new Light(player, new Color(255, 255, 255)));
                    }

                    angle -= Keyboard.IsKeyPressed(Keyboard.Key.Left) ? 2 : 0;
                    angle += Keyboard.IsKeyPressed(Keyboard.Key.Right) ? 2 : 0;

                    M = new Vector2f(0, 0);

                    if (Keyboard.IsKeyPressed(Keyboard.Key.W))
                    {
                        M += new Vector2f(CosD(angle) * 2, SinD(angle) * 2);
                    }

                    if (Keyboard.IsKeyPressed(Keyboard.Key.S))
                    {
                        M -= new Vector2f(CosD(angle) * 2, SinD(angle) * 2);
                    }

                    if (Keyboard.IsKeyPressed(Keyboard.Key.D))
                    {
                        M += new Vector2f(CosD(angle + 90) * 2, SinD(angle + 90) * 2);
                    }

                    if (Keyboard.IsKeyPressed(Keyboard.Key.A))
                    {
                        M += new Vector2f(CosD(angle - 90) * 2, SinD(angle - 90) * 2);
                    }


                    RayResult R = caster.RayCast(player, 0);
                    if (R.Magnitude < Math.Abs(M.X) + 10 && Math.Sign(M.X) == 1)
                    {
                        M.X = 0;
                    }

                    R = caster.RayCast(player, 180);
                    if (R.Magnitude < Math.Abs(M.X) + 10 && Math.Sign(M.X) == -1)
                    {
                        M.X = 0;
                    }

                    R = caster.RayCast(player, 90);
                    if (R.Magnitude < Math.Abs(M.Y) + 10 && Math.Sign(M.Y) == 1)
                    {
                        M.Y = 0;
                    }

                    R = caster.RayCast(player, 270);
                    if (R.Magnitude < Math.Abs(M.Y) + 10 && Math.Sign(M.Y) == -1)
                    {
                        M.Y = 0;
                    }

                    player += M;



                    Mouse.SetPosition(new Vector2i((int)window.Size.X / 2, (int)window.Size.Y / 2), window);

                    window.DispatchEvents();
                    rs.Clear(Color.Black);



                    playerSprite.Position = player;
                    playerSprite.Angle    = angle;
                    audio.UpdateAudio();
                    ren.Render(player, angle, height, look, sprites, lamps);
                    t.DisplayedString = $"Fps: {fps} - Lights: {lamps.Count}";
                    rs.Draw(t);
                    ren.ShowBuffer();
                    Thread.Sleep(0);

                    fpsCounter++;
                }
            }
        }