public void update(GameTime gameTime) { if (!_paused || _singleStep) { string levelUid = LevelSystem.currentLevelUid; EventSystem eventSystem = _systemManager.getSystem(SystemType.Event) as EventSystem; List <int> circuitEntities = _entityManager.getEntitiesPosessing(levelUid, ComponentType.Circuit); for (int i = 0; i < circuitEntities.Count; i++) { CircuitComponent circuitComponent = _entityManager.getComponent(levelUid, circuitEntities[i], ComponentType.Circuit) as CircuitComponent; foreach (Gate gate in circuitComponent.circuit.gates) { if (gate.type == "output") { OutputGate outputGate = gate as OutputGate; if (outputGate.postEvent) { GateOutputComponent outputComponent = _entityManager.getComponent(levelUid, outputGate.entityId, ComponentType.GateOutput) as GateOutputComponent; GameEventType eventType = outputGate.state ? outputComponent.onEnabledEvent : outputComponent.onDisabledEvent; eventSystem.postEvent(new GameEvent(eventType, outputGate.entityId)); } outputGate.postEvent = false; } } } } _singleStep = false; }
public void PreSolve(Contact contact, ref Manifold manifold) { EventSystem eventSystem = (EventSystem)_systemManager.getSystem(SystemType.Event); Fixture fixtureA = contact.FixtureA; Fixture fixtureB = contact.FixtureB; int playerId = PlayerSystem.PLAYER_ID; int entityA = (int)fixtureA.Body.UserData; int entityB = (int)fixtureB.Body.UserData; string levelUid = LevelSystem.currentLevelUid; // Check for custom collision filters bool fixtureAIgnoresEntityB = fixtureA.IsIgnoredEntity(entityB); bool fixtureBIgnoresEntityA = fixtureB.IsIgnoredEntity(entityA); if (fixtureAIgnoresEntityB) { contact.Enabled = false; } else if (fixtureBIgnoresEntityA) { contact.Enabled = false; } // Check for item pickup if (contact.IsTouching() && (entityA == playerId || entityB == playerId)) { int itemEntityId = entityA == playerId ? entityB : entityA; Fixture fixture = entityA == playerId ? fixtureB : fixtureA; ItemComponent itemComponent = _entityManager.getComponent(levelUid, itemEntityId, ComponentType.Item) as ItemComponent; if (itemComponent != null) { contact.Enabled = false; if (itemComponent.state.inWorld) { InventoryComponent playerInventory = _entityManager.getComponent(levelUid, playerId, ComponentType.Inventory) as InventoryComponent; EquipmentSystem equipmentSystem = _systemManager.getSystem(SystemType.Equipment) as EquipmentSystem; equipmentSystem.addInventoryItem(playerInventory, itemComponent); itemComponent.state.inWorld = false; _bodiesToRemove.Add(fixture.Body); _entityManager.killEntity(levelUid, itemEntityId); eventSystem.postEvent(new GameEvent(GameEventType.OnItemPickedUp, itemEntityId)); } } } }
public void update(GameTime gameTime) { if (_singleStep || !_paused) { LevelSystem levelSystem = _systemManager.getSystem(SystemType.Level) as LevelSystem; if (levelSystem.finalized) { string levelUid = LevelSystem.currentLevelUid; EventSystem eventSystem = _systemManager.getSystem(SystemType.Event) as EventSystem; List <CharacterMovementComponent> movementComponents = _entityManager.getComponents <CharacterMovementComponent>(levelUid, ComponentType.CharacterMovement); List <int> ropeGrabEntities = _entityManager.getEntitiesPosessing(levelUid, ComponentType.RopeGrab); List <int> prismaticEntities = _entityManager.getEntitiesPosessing(levelUid, ComponentType.Prismatic); List <int> physicsEntities; for (int i = 0; i < _bodiesToRemove.Count; i++) { getWorld(levelUid).RemoveBody(_bodiesToRemove[i]); } _bodiesToRemove.Clear(); for (int i = 0; i < movementComponents.Count; i++) { CharacterMovementComponent movementComponent = movementComponents[i]; movementComponent.collisionNormals.Clear(); } for (int i = 0; i < prismaticEntities.Count; i++) { PrismaticJointComponent prismaticJointComponent = _entityManager.getComponent(levelUid, prismaticEntities[i], ComponentType.Prismatic) as PrismaticJointComponent; LimitState limitState = prismaticJointComponent.prismaticJoint.LimitState; if (prismaticJointComponent.previousLimitState != limitState) { if (limitState == LimitState.AtLower) { eventSystem.postEvent(new GameEvent(GameEventType.OnLowerLimitReached, prismaticEntities[i])); } else if (limitState == LimitState.AtUpper) { //eventSystem.postEvent(new GameEvent(GameEventType.OnUpperLimitReached, prismaticEntities[i])); } } prismaticJointComponent.previousLimitState = limitState; } getWorld(levelUid).Step(_dt); // Handle physic entities physicsEntities = _entityManager.getEntitiesPosessing(levelUid, ComponentType.Physics); for (int i = 0; i < physicsEntities.Count; i++) { PhysicsComponent physicsComponent = _entityManager.getComponent(levelUid, physicsEntities[i], ComponentType.Physics) as PhysicsComponent; WorldPositionComponent worldPositionComponent = _entityManager.getComponent(levelUid, physicsEntities[i], ComponentType.WorldPosition) as WorldPositionComponent; FollowMetamerComponent followMetamerComponent = _entityManager.getComponent(levelUid, physicsEntities[i], ComponentType.FollowMetamer) as FollowMetamerComponent; // Set body position to the metamer being followed if (followMetamerComponent != null) { physicsComponent.body.Position = followMetamerComponent.metamer.position; physicsComponent.body.Rotation = followMetamerComponent.metamer.currentAngle + StasisMathHelper.halfPi; } // Update world position component worldPositionComponent.position = physicsComponent.body.Position; } } } _singleStep = false; }