public SpriteSpriteCollisionManager(Game game, ISpriteBatchService spriteBatch, int binWidth, int binHeight) : base(game) { this.registeredObject = new List<ISpriteCollideable>(); this.objectBinsToCheck = new List<CollisionObjectBin>(); this.objBinLookupTable = new Dictionary<int, List<Point>>(); this.refSpriteBatch = spriteBatch.GetSpriteBatch("Camera Sensitive"); this.binWidth = binWidth; this.binHeight = binHeight; this.gridWidth = 0; this.gridHeight = 0; offsetVector = new Vector2(); // Set this to add more bins out side of camera size bufferBins = 10; }
/// <summary> /// Load a world from an XML file. /// </summary> /// <param name="parentScreen">The screen this world will be updated in.</param> /// <param name="fileName">The name of the XML file that contains this World's information.</param> public World(Screen parentScreen, string fileName) : base(parentScreen) { this.worldObjects = new List<WorldObject>(); this.interactiveLayers = new Dictionary<int, TileMapLayer>(); this.parallaxLayers = new Dictionary<int, TileMapLayer>(); batchService = (ISpriteBatchService)this.Game.Services.GetService(typeof(ISpriteBatchService)); otherMaps = new List<TileMap>(); // Set up our collision systems: spriteCollisionManager = new SpriteSpriteCollisionManager(this.Game, batchService, 40, 40); ParentScreen.Components.Add(spriteCollisionManager); //Set up Sound systems audioEngine = new AudioEngine("Content\\System\\Sounds\\SoundFX.xgs"); soundBank = new SoundBank(audioEngine, "Content\\System\\Sounds\\GameSoundBank.xsb"); waveBank = new WaveBank(audioEngine, "Content\\System\\Sounds\\GameWavs.xwb"); bgm = this.Game.Content.Load<Song>("System\\Music\\DesertBGM"); MediaPlayer.IsRepeating = true; MediaPlayer.Play(bgm); // The spritebatch to be used when creating all of our worldObjects: spriteBatch = batchService.GetSpriteBatch(Character.SpriteBatchName); LoadCtorInfos(); // Load the contents of the world from the specified XML file: LoadWorldXmlFile(fileName); }
/// <summary> /// Allows the game to perform any initialization it needs to before starting to run. /// This is where it can query for any required services and load any non-graphic /// related content. Calling base.Initialize will enumerate through any components /// and initialize them as well. /// </summary> public override void Initialize() { if (!this.IsInitialized) { tileEngine = new TileEngine(); fullScreenSettings = new ResolutionSettings(640, 480, 640, 480, true); ScreenManager.Instance.ResolutionService.CurrentResolutionSettings = windowedSettings; batchService = (ISpriteBatchService)this.Game.Services.GetService(typeof(ISpriteBatchService)); // Create a new, empty world: world = new World(this, WORLD_FILENAME); // We need to disable the SpriteSpriteCollisionManager because it makes some assumptions about // the gameScreen... world.SpriteCollisionManager.Enabled = false; // Create an empty, maximally-sized tilemap to center // the loaded map onto: TileMap bigMap = new TileMap(MAX_TILEMAP_WIDTH, MAX_TILEMAP_HEIGHT, DEFAULT_TILE_WIDTH, DEFAULT_TILE_HEIGHT, LAYER_COUNT, SUB_LAYER_COUNT); bigMap.FileName = world.Map.FileName; // Backup the original map: TileMap map = world.Map; // Compute the point where we want to blit it onto the empty map: this.offsetX = (bigMap.Width / 2) - (map.Width / 2); this.offsetY = (bigMap.Height / 2) - (map.Height / 2); bigMap.BlitTileMap(map, offsetX, offsetY); world.Map = bigMap; foreach (TileMapLayer tml in world.interactiveLayers.Values) { Components.Remove(tml); } world.interactiveLayers.Clear(); world.ShiftWorldObjects(new Vector2(world.Map.TileWidth * offsetX, world.Map.TileWidth * offsetY)); for (int i = 0; i < world.Map.LayerCount; ++i) { TileMapLayer tml = new TileMapLayer(this, batchService.GetSpriteBatch(TileMapLayer.SpriteBatchName), world.Map, i); if (i == 0) { tml.DrawOrder = World.PLAYER_DRAW_ORDER - DEFAULT_LAYER_SPACING; } else { if (i == world.Map.LayerCount - 1) { tml.DrawBlanksEnabled = true; tml.DrawEdgesEnabled = true; tml.DrawDestructablesEnabled = true; } tml.DrawOrder = World.PLAYER_DRAW_ORDER + i * DEFAULT_LAYER_SPACING; } world.interactiveLayers[tml.DrawOrder] = tml; Components.Add(world.interactiveLayers[tml.DrawOrder]); } world.Initialize(); world.Camera.Position = world.Player.Position;// -new Vector2(world.Camera.VisibleArea.Width / 2, world.Camera.VisibleArea.Height / 2); world.Paused = true; Components.Add(world); // Set up editor controls: inputMonitor = InputMonitor.Instance; inputMonitor.AssignPressable("EditorLeft", new PressableKey(Keys.A)); inputMonitor.AssignPressable("EditorRight", new PressableKey(Keys.D)); inputMonitor.AssignPressable("EditorUp", new PressableKey(Keys.W)); inputMonitor.AssignPressable("EditorDown", new PressableKey(Keys.S)); inputMonitor.AssignPressable("EditorAppend", new PressableKey(Keys.LeftShift)); inputMonitor.AssignPressable("ToggleFullScreen", new PressableKey(Keys.F)); inputMonitor.AssignPressable("EditorCycleMode", new PressableKey(Keys.Tab)); Components.Add(inputMonitor); CreateUIComponents(); Mode = EditMode.SpriteEdit; CycleMode(); // Initialize all components base.Initialize(); } }