/// <summary> /// Update method called every game frame. /// </summary> /// <param name="gameTime">Snapshot of timing values.</param> public void Update(GameTime gameTime) { tileMap.Update(gameTime); foreach (SceneNode node in sceneNodeDictionary.Values) { if (node is Entity) { Entity entity = node as Entity; prevEntityPositions[entity.Name] = entity.Position; } node.Update(gameTime); handleNodeCollisions(node); // Check if the collision cell should be changed if (!node.IsStatic) { CollisionCell newCell = collisionGrid.GetCellAtPosition(node.Position); if (newCell != node.CollisionCell) { // Remove scene node from old cell and add to new node.CollisionCell.SceneNodeList.Remove(node); newCell.SceneNodeList.Add(node); node.CollisionCell = newCell; node.CollisionCellsToCheck = getCellsToCheck(node); } // Clamp position to scene bounds node.ClampToSceneBounds(nodeMaxBounds); } } // Update scene position position = -sceneNodeDictionary["Player"].Position; position += positionOffset; position.X = MathHelper.Clamp(position.X, positionMinBounds.X, positionMaxBounds.X); position.Y = MathHelper.Clamp(position.Y, positionMinBounds.Y, positionMaxBounds.Y); }
/// <summary> /// Creates a collision grid for the scene. /// </summary> /// <param name="gridDimensions">Dimensions (in cells) of the collision grid.</param> public void CreateCollisionGrid(Dimensions2 gridDimensions) { Dimensions2 sceneDimensions = tileMap.Dimensions * tileMap.TileDimensions; collisionGrid = new CollisionGrid(sceneDimensions, gridDimensions); // Add tiles to the proper collision grid cell foreach (Tile tile in tileMap.TileArray) { collisionGrid.GetCellAtPosition(tile.Position).TileList.Add(tile); } // Add scene nodes to the proper collision grid cell foreach (SceneNode node in sceneNodeDictionary.Values) { CollisionCell cell = collisionGrid.GetCellAtPosition(node.Position); cell.SceneNodeList.Add(node); node.CollisionCell = cell; node.CollisionCellsToCheck = getCellsToCheck(node); } }