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); } }
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 }); } }
/// <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; }