コード例 #1
0
            public InputFrameState UpdateAndGetInputFrameStates(float dt)
            {
                this.time += dt;
                this.currentIndex++;

                if (this.currentIndex < this.demo.records.Count)
                {
                    var record = this.demo.records[this.currentIndex];
                    var result = record.BuildInputFrameState();
                    LatestFrameState = result;
                    return(result);
                }
                else
                {
                    // Unpress any pressed buttons (this doesn't work because it doesn't work that way, we need to discover pressed keys some other way)
                    var result =
                        new InputFrameState(
                            new KeyboardFrameState(Array.Empty <Keys>(), LatestFrameState.keyboardFrameState.Pressed,
                                                   ModifierKeys.NoModifiers)
                            ,
                            new MouseFrameState(
                                new MouseButtonList(),
                                new MouseButtonList(LatestFrameState.mouseFrameState.ButtonsPressedThisFrame
                                                    .EncodedInt), LatestFrameState.mouseFrameState.RawWindowPosition,
                                Vector2.Zero, 0));
                    LatestFrameState = result;
                    return(result);
                }
            }
コード例 #2
0
 public void PollHumanInput(InputFrameState inputFrameState)
 {
     // InputFrameState is such an inconvenient structure :(
     foreach (var pressedButton in inputFrameState.keyboardFrameState.Pressed)
     {
         if (pressedButton == Keys.Escape)
         {
             SkipToEnd();
         }
     }
 }
コード例 #3
0
            public DemoSerializableEntry(float time, InputFrameState inputState)
            {
                this.time = time;

                this.mouseX = inputState.mouseFrameState.RawWindowPosition.X;
                this.mouseY = inputState.mouseFrameState.RawWindowPosition.Y;
                this.mouseButtonsPressedAsInt  = inputState.mouseFrameState.ButtonsPressedThisFrame.EncodedInt;
                this.mouseButtonsReleasedAsInt = inputState.mouseFrameState.ButtonsReleasedThisFrame.EncodedInt;
                this.scrollDelta            = inputState.mouseFrameState.ScrollDelta;
                this.mouseDeltaX            = inputState.mouseFrameState.PositionDelta.X;
                this.mouseDeltaY            = inputState.mouseFrameState.PositionDelta.Y;
                this.pressedKeys            = inputState.keyboardFrameState.Pressed ?? Array.Empty <Keys>();
                this.releasedKeys           = inputState.keyboardFrameState.Released ?? Array.Empty <Keys>();
                this.keyboardModifiersAsInt = inputState.keyboardFrameState.Modifiers.EncodedInt;
            }
コード例 #4
0
ファイル: SceneLayers.cs プロジェクト: notexplosive/machina
        public void Update(float dt, Matrix mouseTransformMatrix, InputFrameState inputFrameState,
                           bool allowMouseUpdate = true, bool allowKeyboardEvents = true)
        {
#if DEBUG
#else
            try
            {
#endif
            if (!this.hasDoneFirstUpdate)
            {
                DoFirstUpdate();
                this.hasDoneFirstUpdate = true;
            }

            CurrentInputFrameState = inputFrameState;
            var scenes = AllScenes();

            var rawMousePos = Vector2.Transform(inputFrameState.mouseFrameState.RawWindowPosition.ToVector2(),
                                                mouseTransformMatrix);

            foreach (var scene in scenes)
            {
                scene.FlushBuffers();

                if (!scene.IsFrozen)
                {
                    if (allowKeyboardEvents)
                    {
                        if (this.pendingTextInput.HasValue)
                        {
                            scene.OnTextInput(this.pendingTextInput.Value);
                        }

                        foreach (var key in inputFrameState.keyboardFrameState.Released)
                        {
                            scene.OnKey(key, ButtonState.Released, inputFrameState.keyboardFrameState.Modifiers);
                        }

                        foreach (var key in inputFrameState.keyboardFrameState.Pressed)
                        {
                            scene.OnKey(key, ButtonState.Pressed, inputFrameState.keyboardFrameState.Modifiers);
                        }
                    }

                    if (allowMouseUpdate)
                    {
                        if (inputFrameState.mouseFrameState.ScrollDelta != 0)
                        {
                            scene.OnScroll(inputFrameState.mouseFrameState.ScrollDelta);
                        }

                        // Pressed
                        if (inputFrameState.mouseFrameState.ButtonsPressedThisFrame.left)
                        {
                            scene.OnMouseButton(MouseButton.Left, rawMousePos, ButtonState.Pressed);
                        }

                        if (inputFrameState.mouseFrameState.ButtonsPressedThisFrame.middle)
                        {
                            scene.OnMouseButton(MouseButton.Middle, rawMousePos, ButtonState.Pressed);
                        }

                        if (inputFrameState.mouseFrameState.ButtonsPressedThisFrame.right)
                        {
                            scene.OnMouseButton(MouseButton.Right, rawMousePos, ButtonState.Pressed);
                        }

                        // Released
                        if (inputFrameState.mouseFrameState.ButtonsReleasedThisFrame.left)
                        {
                            scene.OnMouseButton(MouseButton.Left, rawMousePos, ButtonState.Released);
                        }

                        if (inputFrameState.mouseFrameState.ButtonsReleasedThisFrame.middle)
                        {
                            scene.OnMouseButton(MouseButton.Middle, rawMousePos, ButtonState.Released);
                        }

                        if (inputFrameState.mouseFrameState.ButtonsReleasedThisFrame.right)
                        {
                            scene.OnMouseButton(MouseButton.Right, rawMousePos, ButtonState.Released);
                        }

                        // At this point the raw and processed deltas are equal, downstream (Scene and below) they will differ
                        scene.OnMouseUpdate(rawMousePos, inputFrameState.mouseFrameState.PositionDelta,
                                            inputFrameState.mouseFrameState.PositionDelta);
                    }
                }
            }

            this.pendingTextInput = null;

            foreach (var scene in scenes)
            {
                if (!scene.frameStep.IsPaused && !scene.IsFrozen)
                {
                    scene.Update(dt);
                }
            }

            HitTestResult.ApproveTopCandidate(scenes);
#if DEBUG
#else
        }

        catch (System.Exception exception)
        {
            MachinaClient.Print("caught exception");
            OnError?.Invoke(exception);
        }
#endif
        }
コード例 #5
0
ファイル: SceneLayers.cs プロジェクト: notexplosive/machina
 public void Update(float dt, InputFrameState input)
 {
     Update(dt, Matrix.Identity, input);
 }
コード例 #6
0
 public void AddEntry(float dt, InputFrameState inputState)
 {
     this.totalTime += dt;
     this.demo.Append(new DemoSerializableEntry(this.totalTime, inputState));
 }