コード例 #1
0
ファイル: Program.cs プロジェクト: a10r/GameboyEmulator
        private static void DoEmulation(LaunchDialogResult launchOptions)
        {
            var emulator = new EmulationEngine(launchOptions.BootromFile, launchOptions.RomFile)
            {
                Running = true
            };

            Task.Run(() => emulator.Run());

            var emuWindow = new OpenGLEmulationWindow();

            emulator.FrameSource.NewFrame += (s, a) => emuWindow.SetNextFrame(a.Frame);

            emuWindow.KeyUp += (s, a) =>
            {
                switch (a.Key)
                {
                case Key.Up: emulator.Buttons.Up = false; break;

                case Key.Down: emulator.Buttons.Down = false; break;

                case Key.Left: emulator.Buttons.Left = false; break;

                case Key.Right: emulator.Buttons.Right = false; break;

                case Key.X: emulator.Buttons.A = false; break;

                case Key.C: emulator.Buttons.B = false; break;

                case Key.V: emulator.Buttons.Start = false; break;

                case Key.B: emulator.Buttons.Select = false; break;
                }
            };

            emuWindow.KeyDown += (s, a) =>
            {
                switch (a.Key)
                {
                case Key.Up: emulator.Buttons.Up = true; break;

                case Key.Down: emulator.Buttons.Down = true; break;

                case Key.Left: emulator.Buttons.Left = true; break;

                case Key.Right: emulator.Buttons.Right = true; break;

                case Key.X: emulator.Buttons.A = true; break;

                case Key.C: emulator.Buttons.B = true; break;

                case Key.V: emulator.Buttons.Start = true; break;

                case Key.B: emulator.Buttons.Select = true; break;

                // Window scaling
                case Key.Number1: emuWindow.WindowScaleFactor = 1; break;

                case Key.Number2: emuWindow.WindowScaleFactor = 2; break;

                case Key.Number3: emuWindow.WindowScaleFactor = 3; break;

                case Key.Number4: emuWindow.WindowScaleFactor = 4; break;

                case Key.Number5: emuWindow.WindowScaleFactor = 5; break;
                }
            };

            var debugViewModel = new DebugWindowViewModel(emulator.State, emulator);
            var debugWindow    = new DebugWindow(debugViewModel);

            debugWindow.Show();

            var frameCount = 0;

            emulator.FrameSource.NewFrame += (s, a) => frameCount++;
            Task.Run(async() =>
            {
                long last = emulator.ElapsedCycles;
                while (!emuWindow.IsExiting)
                {
                    await Task.Delay(1000);
                    var elapsed = emulator.ElapsedCycles - last;
                    if (emulator.Running)
                    {
                        var newTitle = $"Debugger ({(float)elapsed / 1000000} MHz, {frameCount} fps)";
                        Application.Instance.AsyncInvoke(() =>
                        {
                            debugWindow.Title = newTitle;
                        });
                    }
                    last       = emulator.ElapsedCycles;
                    frameCount = 0;
                }
            });

            using (emuWindow)
            {
                emuWindow.Run(60);
            }
        }
コード例 #2
0
        public EmulationWindow(LaunchDialogResult launchOptions)
        {
            var emulator = new EmulationEngine(launchOptions.BootromFile, launchOptions.RomFile)
            {
                Running = true
            };

            Task.Run(() => emulator.Run());

            // Debug window
            var debugViewModel = new DebugWindowViewModel(emulator.State, emulator);
            var debugWindow    = new DebugWindow(debugViewModel);

            debugWindow.Show();

            // Very basic key input handling
            KeyDown += (s, e) =>
            {
                switch (e.Key)
                {
                case Keys.Up: emulator.Buttons.Up = true; break;

                case Keys.Down: emulator.Buttons.Down = true; break;

                case Keys.Left: emulator.Buttons.Left = true; break;

                case Keys.Right: emulator.Buttons.Right = true; break;

                case Keys.X: emulator.Buttons.A = true; break;

                case Keys.C: emulator.Buttons.B = true; break;

                case Keys.V: emulator.Buttons.Start = true; break;

                case Keys.B: emulator.Buttons.Select = true; break;
                }
            };

            KeyUp += (s, e) =>
            {
                switch (e.Key)
                {
                case Keys.Up: emulator.Buttons.Up = false; break;

                case Keys.Down: emulator.Buttons.Down = false; break;

                case Keys.Left: emulator.Buttons.Left = false; break;

                case Keys.Right: emulator.Buttons.Right = false; break;

                case Keys.X: emulator.Buttons.A = false; break;

                case Keys.C: emulator.Buttons.B = false; break;

                case Keys.V: emulator.Buttons.Start = false; break;

                case Keys.B: emulator.Buttons.Select = false; break;
                }
            };

            var frameCount = 0;

            Task.Run(async() =>
            {
                long last = emulator.ElapsedCycles;
                while (true)
                {
                    await Task.Delay(1000);
                    var elapsed = emulator.ElapsedCycles - last;
                    if (emulator.Running)
                    {
                        var newTitle = $"Debugger ({(float)elapsed / 1000000} MHz, {frameCount} fps)";
                        Application.Instance.AsyncInvoke(() =>
                        {
                            debugWindow.Title = newTitle;
                        });
                    }
                    last       = emulator.ElapsedCycles;
                    frameCount = 0;
                }
            });

            var imageView = new ImageView();

            emulator.FrameSource.NewFrame += (sender, args) =>
            {
                frameCount++;
                Application.Instance.AsyncInvoke(() =>
                {
                    imageView.Image = args.Frame.ToEtoBitmap();

                    debugViewModel.Refresh();
                });
            };

            Content = new Panel
            {
                Content = imageView,
                Size    = new Size(160, 144)
            };

            Resizable = false;
        }