예제 #1
0
        private void EventsOnBodiesBeginCollide(RigidBody body1, RigidBody body2)
        {
            if (body1.Tag != null && body2.Tag != null)
            {
                var node1 = _hierarchy.Lookup(body1.Tag);
                var node2 = _hierarchy.Lookup(body2.Tag);

                if (node1 == null)
                {
                    _consoleHandle.LogWarning("Unable to find hierarchy node for physics rigid body: " + body1.Tag);
                }

                if (node2 == null)
                {
                    _consoleHandle.LogWarning("Unable to find hierarchy node for physics rigid body: " + body2.Tag);
                }

                if (node1 != null && node2 != null)
                {
                    // TODO: This is pretty silly.  It should just be the nodes, not their parents.
                    var parent1 = node1.Parent ?? node1;
                    var parent2 = node2.Parent ?? node2;

                    var owner1 = parent1.UntypedValue;
                    var owner2 = parent2.UntypedValue;

                    var @event = new PhysicsCollisionBeginEvent(_gameContext, _serverContext, _updateContext, body1,
                                                                body2, owner1, owner2);

                    _physicsEventEngine.Fire(_physicsEventContext, @event);
                }
            }
        }
        public void Update(IGameContext gameContext, IUpdateContext updateContext)
        {
            Event e;

            while (_queuedEvents.TryDequeue(out e))
            {
                _eventEngine.Fire(gameContext, e);
            }
        }
예제 #3
0
        public void Update(IGameContext gameContext, IUpdateContext updateContext)
        {
            if (Dispatcher == null)
            {
                return;
            }

            Dispatcher.Update();

            while (_messagesRecieved.Count > 0)
            {
                var @event = _messagesRecieved.Dequeue();

                _networkEventEngine.Fire(
                    new DefaultNetworkEventContext(),
                    new NetworkMessageReceivedEvent
                {
                    Client        = @event.Client,
                    Dispatcher    = Dispatcher,
                    GameContext   = gameContext,
                    ServerContext = null,
                    UpdateContext = updateContext,
                    Payload       = @event.Payload,
                    ProtocolID    = @event.ProtocolID
                });
            }

            while (_clientsConnected.Count > 0)
            {
                var @event = _clientsConnected.Dequeue();

                _networkEventEngine.Fire(
                    new DefaultNetworkEventContext(),
                    new NetworkClientConnectedEvent
                {
                    Client        = @event.Client,
                    Dispatcher    = Dispatcher,
                    GameContext   = gameContext,
                    ServerContext = null,
                    UpdateContext = updateContext
                });
            }

            while (_clientsDisconnected.Count > 0)
            {
                var @event = _clientsDisconnected.Dequeue();

                _networkEventEngine.Fire(
                    new DefaultNetworkEventContext(),
                    new NetworkClientDisconnectedEvent
                {
                    Client        = @event.Client,
                    Dispatcher    = Dispatcher,
                    GameContext   = gameContext,
                    ServerContext = null,
                    UpdateContext = updateContext
                });
            }
        }
예제 #4
0
        /// <summary>
        /// Updates and fires input events for a single game pad.  This method is used by <see cref="UpdateGamepad"/>.
        /// </summary>
        /// <param name="gameContext">
        /// The game context.
        /// </param>
        /// <param name="index">
        /// The player index.
        /// </param>
        /// <param name="gamepadState">
        /// The game pad state.
        /// </param>
        private void UpdateGamepadSingle(IGameContext gameContext, int index, GamePadState gamepadState)
        {
            var lastGamepadState = new GamePadState();

            if (_lastGamePadStates.ContainsKey(index))
            {
                lastGamepadState = _lastGamePadStates[index];
            }

            if (gamepadState.ThumbSticks.Left.X != 0 || gamepadState.ThumbSticks.Right.X != 0 || gamepadState.ThumbSticks.Left.Y != 0 || gamepadState.ThumbSticks.Right.Y != 0)
            {
                _eventEngine.Fire(
                    gameContext,
                    new GamePadThumbstickActiveEvent
                {
                    GamePadState = gamepadState
                });
            }

            foreach (Buttons button in Enum.GetValues(typeof(Buttons)))
            {
                if (gamepadState.IsButtonDown(button))
                {
                    if (lastGamepadState.IsButtonUp(button))
                    {
                        _eventEngine.Fire(
                            gameContext,
                            new GamePadButtonPressEvent
                        {
                            Button       = button,
                            GamePadState = gamepadState,
                            GamePadIndex = index
                        });
                    }
                    else
                    {
                        _eventEngine.Fire(
                            gameContext,
                            new GamePadButtonHeldEvent
                        {
                            Button       = button,
                            GamePadState = gamepadState,
                            GamePadIndex = index
                        });
                    }
                }
                else
                {
                    if (lastGamepadState.IsButtonDown(button))
                    {
                        _eventEngine.Fire(
                            gameContext,
                            new GamePadButtonReleaseEvent
                        {
                            Button       = button,
                            GamePadState = gamepadState,
                            GamePadIndex = index
                        });
                    }
                }
            }

            _lastGamePadStates[index] = gamepadState;
        }
        public void Update(IGameContext gameContext, IUpdateContext updateContext)
        {
            var toRemove = new List <WeakReference <IPerPixelCollisionComponent> >();

            _waitForChanges = true;

            foreach (var aWR in _components)
            {
                IPerPixelCollisionComponent a;
                if (!aWR.TryGetTarget(out a))
                {
                    toRemove.Add(aWR);
                    continue;
                }

                if (!(a.Texture?.IsReady ?? false))
                {
                    continue;
                }

                var aParent = _hierarchy.Lookup(a)?.Parent?.UntypedValue as IHasTransform;

                var aRectangle = CalculateBoundingBox(aParent, a);

                foreach (var bWR in _components)
                {
                    IPerPixelCollisionComponent b;
                    if (!bWR.TryGetTarget(out b))
                    {
                        toRemove.Add(bWR);
                        continue;
                    }

                    if (ReferenceEquals(a, b))
                    {
                        continue;
                    }

                    if (!(b.Texture?.IsReady ?? false))
                    {
                        continue;
                    }

                    var bParent = _hierarchy.Lookup(b)?.Parent?.UntypedValue as IHasTransform;

                    var bRectangle = CalculateBoundingBox(bParent, b);

                    if (aRectangle.Intersects(bRectangle))
                    {
                        if (aParent != null && bParent != null)
                        {
                            if (IntersectPixels(aParent, a, bParent, b))
                            {
                                _perPixelCollisionEventEngine.Fire(
                                    new DefaultPerPixelCollisionEventContext(),
                                    new PerPixelCollisionEvent(
                                        gameContext,
                                        null,
                                        updateContext,
                                        aParent,
                                        bParent));
                            }
                        }
                    }
                }
            }

            foreach (var tr in toRemove.Distinct())
            {
                _components.Remove(tr);
            }

            if (_pendingChanges.Count > 0)
            {
                foreach (var v in _pendingChanges)
                {
                    v();
                }
                _pendingChanges.Clear();
            }

            _waitForChanges = false;
        }