コード例 #1
0
        public void Tick()
        {
            _glUtils.RefreshViewport(_settings, _window, _gameState.Viewport, true);
            _glUtils.AdjustResolution(_settings.VirtualResolution.Width, _settings.VirtualResolution.Height);

            activateShader();
            renderAllViewports();
        }
コード例 #2
0
        private void onGameWindowLoaded(TypedParameter settingsParameter, IGameSettings settings)
        {
            TypedParameter gameWindowParameter = new TypedParameter(typeof(IGameWindow), GameWindow);

            Settings = _resolver.Container.Resolve <IRuntimeSettings>(settingsParameter, gameWindowParameter);

            _graphics.ClearColor(0f, 0f, 0f, 1f);

            _graphics.Init();
            _glUtils.GenBuffers();

            Factory = _resolver.Container.Resolve <IGameFactory>();

            IAGSInput input = _resolver.Container.Resolve <IAGSInput>();

            input.Init(settings.VirtualResolution);
            Input = input;
            TypedParameter inputParamater = new TypedParameter(typeof(IInput), Input);
            TypedParameter gameParameter  = new TypedParameter(typeof(IGame), this);

            RenderLoop = _resolver.Container.Resolve <IRendererLoop>(inputParamater, gameParameter, gameWindowParameter);
            updateResolver();
            HitTest       = _resolver.Container.Resolve <IHitTest>();
            AudioSettings = _resolver.Container.Resolve <IAudioSettings>();
            SaveLoad      = _resolver.Container.Resolve <ISaveLoad>();

            _glUtils.AdjustResolution(settings.VirtualResolution.Width, settings.VirtualResolution.Height);

            Events.OnLoad.Invoke();
        }
コード例 #3
0
        private void renderObject(IViewport viewport, IObject obj)
        {
            _matrixUpdater.RefreshMatrix(obj);
            Size resolution = obj.RenderLayer == null || obj.RenderLayer.IndependentResolution == null ?
                              _game.Settings.VirtualResolution :
                              obj.RenderLayer.IndependentResolution.Value;

            _glUtils.AdjustResolution(resolution.Width, resolution.Height);

            IImageRenderer imageRenderer = getImageRenderer(obj);

            var shader = applyObjectShader(obj);

            imageRenderer.Render(obj, viewport);

            removeObjectShader(shader);
        }
コード例 #4
0
ファイル: AGSRendererLoop.cs プロジェクト: ebrucucen/MonoAGS
        private void renderObject(IRoom room, IObject obj)
        {
            Size resolution = obj.RenderLayer == null || obj.RenderLayer.IndependentResolution == null ?
                              _game.Settings.VirtualResolution :
                              obj.RenderLayer.IndependentResolution.Value;

            _glUtils.AdjustResolution(resolution.Width, resolution.Height);

            IImageRenderer imageRenderer = getImageRenderer(obj);

            imageRenderer.Prepare(obj, obj, room.Viewport);

            var shader = applyObjectShader(obj);

            imageRenderer.Render(obj, room.Viewport);

            removeObjectShader(shader);
        }
コード例 #5
0
        private void onGameWindowLoaded(TypedParameter settingsParameter, IGameSettings settings)
        {
            TypedParameter gameWindowParameter = new TypedParameter(typeof(IGameWindow), GameWindow);

            Settings = _resolver.Container.Resolve <IRuntimeSettings>(settingsParameter, gameWindowParameter);

            _graphics.ClearColor(0f, 0f, 0f, 1f);

            _graphics.Init();
            _glUtils.GenBuffers();

            Factory = _resolver.Container.Resolve <IGameFactory>();

            TypedParameter gameParameter = new TypedParameter(typeof(IGame), this);

            Settings.Defaults.MessageBox = _resolver.Container.Resolve <IMessageBoxSettings>(gameParameter);

            var input = _resolver.Container.Resolve <IInput>();

            Input = input;
            TypedParameter inputParamater = new TypedParameter(typeof(IInput), Input);

            _pipeline = _resolver.Container.Resolve <IAGSRenderPipeline>(gameParameter);
            TypedParameter pipelineParameter = new TypedParameter(typeof(IAGSRenderPipeline), _pipeline);

            RenderLoop = _resolver.Container.Resolve <IRendererLoop>(inputParamater, gameParameter,
                                                                     gameWindowParameter, pipelineParameter);
            updateResolver();
            HitTest                 = _resolver.Container.Resolve <IHitTest>();
            Audio                   = _resolver.Container.Resolve <IAudioSystem>();
            SaveLoad                = _resolver.Container.Resolve <ISaveLoad>();
            Coordinates             = _resolver.Container.Resolve <ICoordinates>();
            _roomTransitionWorkflow = _resolver.Container.Resolve <IRoomTransitionWorkflow>();

            _glUtils.AdjustResolution(settings.VirtualResolution.Width, settings.VirtualResolution.Height);

            _updateMessagePump.Post(_ => Events.OnLoad.Invoke(), null);
        }
コード例 #6
0
        public bool Tick()
        {
            _glUtils.RefreshViewport(_game.Settings, _gameWindow, _gameState.Viewport);
            _glUtils.AdjustResolution(_game.Settings.VirtualResolution.Width, _game.Settings.VirtualResolution.Height);

            var transitionState = _roomTransitions.State;

            if (_gameState.Room == null)
            {
                transitionState = RoomTransitionState.NotInTransition;                          //If there's no room, then room transition state is meaningless -> we'll interpret as not in transition, which will render the viewports, without a room (so GUIs will still be rendered).
            }
            switch (transitionState)
            {
            case RoomTransitionState.NotInTransition:
                activateShader();
                renderAllViewports();
                break;

            case RoomTransitionState.BeforeLeavingRoom:
                if (_roomTransitions.Transition == null)
                {
                    _roomTransitions.State = RoomTransitionState.NotInTransition;
                    return(false);
                }
                else if (_gameState.Cutscene.IsSkipping)
                {
                    _roomTransitions.State = RoomTransitionState.PreparingTransition;
                    return(false);
                }
                else if (!_roomTransitions.Transition.RenderBeforeLeavingRoom(
                             _displayList.GetDisplayList(_gameState.Viewport)))
                {
                    if (_fromTransitionBuffer == null)
                    {
                        _fromTransitionBuffer = renderToBuffer();
                    }
                    _roomTransitions.State = RoomTransitionState.PreparingTransition;
                    return(false);
                }
                break;

            case RoomTransitionState.PreparingNewRoomRendering:
            case RoomTransitionState.PreparingTransition:
                return(false);

            case RoomTransitionState.InTransition:
                if (_gameState.Cutscene.IsSkipping)
                {
                    _fromTransitionBuffer  = null;
                    _toTransitionBuffer    = null;
                    _roomTransitions.State = RoomTransitionState.AfterEnteringRoom;
                    return(false);
                }
                if (_toTransitionBuffer == null)
                {
                    _toTransitionBuffer = renderToBuffer();
                }
                _glUtils.RefreshViewport(_noAspectRatioSettings, _gameWindow, _gameState.Viewport);
                if (!_roomTransitions.Transition.RenderTransition(_fromTransitionBuffer, _toTransitionBuffer))
                {
                    _fromTransitionBuffer  = null;
                    _toTransitionBuffer    = null;
                    _roomTransitions.State = RoomTransitionState.AfterEnteringRoom;
                    return(false);
                }
                break;

            case RoomTransitionState.AfterEnteringRoom:
                if (_gameState.Cutscene.IsSkipping || !_roomTransitions.Transition.RenderAfterEnteringRoom(
                        _displayList.GetDisplayList(_gameState.Viewport)))
                {
                    _roomTransitions.SetOneTimeNextTransition(null);
                    _roomTransitions.State = RoomTransitionState.NotInTransition;
                    return(false);
                }
                break;

            default:
                throw new NotSupportedException(_roomTransitions.State.ToString());
            }
            return(true);
        }
コード例 #7
0
ファイル: AGSGame.cs プロジェクト: ebrucucen/MonoAGS
        public void Start(IGameSettings settings)
        {
            GameLoop = _resolver.Container.Resolve <IGameLoop>(new TypedParameter(typeof(AGS.API.Size), settings.VirtualResolution));
            TypedParameter settingsParameter = new TypedParameter(typeof(IGameSettings), settings);

            try { GameWindow = Resolver.Container.Resolve <IGameWindow>(settingsParameter); }
            catch (Exception ese)
            {
                Debug.WriteLine(ese.ToString());
                throw;
            }

            //using (GameWindow)
            {
                try
                {
                    TypedParameter gameWindowParameter = new TypedParameter(typeof(IGameWindow), GameWindow);
                    GameWindow.Load += (sender, e) =>
                    {
                        Settings = Resolver.Container.Resolve <IRuntimeSettings>(settingsParameter, gameWindowParameter);

                        _graphics.ClearColor(0f, 0f, 0f, 1f);

                        _graphics.Init();
                        _glUtils.GenBuffers();

                        Factory = Resolver.Container.Resolve <IGameFactory>();

                        TypedParameter sizeParameter = new TypedParameter(typeof(AGS.API.Size), Settings.VirtualResolution);
                        Input = _resolver.Container.Resolve <IInput>(gameWindowParameter, sizeParameter);
                        TypedParameter inputParamater = new TypedParameter(typeof(IInput), Input);
                        TypedParameter gameParameter  = new TypedParameter(typeof(IGame), this);
                        _renderLoop = _resolver.Container.Resolve <IRendererLoop>(inputParamater, gameParameter);
                        updateResolver();
                        AudioSettings = _resolver.Container.Resolve <IAudioSettings>();
                        SaveLoad      = _resolver.Container.Resolve <ISaveLoad>();

                        _glUtils.AdjustResolution(settings.VirtualResolution.Width, settings.VirtualResolution.Height);

                        Events.OnLoad.Invoke(sender, new AGSEventArgs());
                    };

                    GameWindow.Resize += async(sender, e) =>
                    {
                        await Task.Delay(10); //todo: For some reason on the Mac, the GL Viewport assignment is overridden without this delay (so aspect ratio is not preserved), a bug in OpenTK?

                        resize();
                        Events.OnScreenResize.Invoke(sender, new AGSEventArgs());
                    };

                    GameWindow.UpdateFrame += async(sender, e) =>
                    {
                        try
                        {
                            _messagePump.PumpMessages();
                            if (State.Paused)
                            {
                                return;
                            }
                            adjustSpeed();
                            await GameLoop.UpdateAsync().ConfigureAwait(false);

                            AGSEventArgs args = new AGSEventArgs();

                            //Invoking repeatedly execute asynchronously, as if one subscriber is waiting on another subscriber the event will
                            //never get to it (for example: calling ChangeRoom from within RepeatedlyExecute calls StopWalking which
                            //waits for the walk to stop, only the walk also happens on RepeatedlyExecute and we'll hang.
                            //Since we're running asynchronously, the next UpdateFrame will call RepeatedlyExecute for the walk cycle to stop itself and we're good.
                            ///The downside of this approach is that we need to look out for re-entrancy issues.
                            await Events.OnRepeatedlyExecute.InvokeAsync(sender, args);
                        }
                        catch (Exception ex)
                        {
                            Debug.WriteLine(ex.ToString());
                            throw ex;
                        }
                    };

                    GameWindow.RenderFrame += (sender, e) =>
                    {
                        if (_renderLoop == null)
                        {
                            return;
                        }
                        try
                        {
                            // render graphics
                            _graphics.ClearScreen();
                            Events.OnBeforeRender.Invoke(sender, _renderEventArgs);

                            if (_renderLoop.Tick())
                            {
                                GameWindow.SwapBuffers();
                            }
                            if (Repeat.OnceOnly("SetFirstRestart"))
                            {
                                SaveLoad.SetRestartPoint();
                            }
                        }
                        catch (Exception ex)
                        {
                            Debug.WriteLine("Exception when rendering:");
                            Debug.WriteLine(ex.ToString());
                            throw;
                        }
                    };

                    // Run the game at 60 updates per second
                    GameWindow.Run(UPDATE_RATE);
                } catch (Exception exx)
                {
                    Debug.WriteLine(exx.ToString());
                    throw;
                }
            }
        }