コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
            }
        }