/// <summary> /// Loads a new level from the given data path. /// </summary> /// <param name="sourceDirectory">The data path.</param> public async Task LoadLevelAsync(string sourceDirectory) { // Load the level m_currentLevel = await LevelData.FromDirectoryAsync(sourceDirectory); // Load graphics for this level if(m_gameScreenManager != null) { await m_gameScreenManager.ClearAsync(m_scene); } m_gameScreenManager = new GameScreenManagerLogic(); // Build the first screen await m_gameScreenManager.BuildFirstScreenAsync(m_currentLevel, m_scene); m_camera.Position = new Vector3(0, 12f, 0f); m_camera.Target = new Vector3(0f, 0f, 0.1f); m_camera.UpdateCamera(); m_scene.Messenger.BeginPublish(new LevelLoadedMessage(m_currentLevel)); }
/// <summary> /// Initializes a new instance of the <see cref="BackgroundMusicLogic"/> class. /// </summary> public BackgroundMusicLogic(LevelData currentLevel) { m_currentLevel = currentLevel; m_lastMusicIndex = -1; }
public EndGameLogic(LevelData levelData) { levelData.EnsureNotNull("levelData"); m_levelData = levelData; }
/// <summary> /// Loads the level from the given directory. /// </summary> /// <param name="directoryName">Name of the directory.</param> public static async Task<LevelData> FromDirectoryAsync(string directoryName) { LevelData result = null; await Task.Factory.StartNew(() => result = new LevelData(directoryName)); return result; }
/// <summary> /// Builds all game objects for the given level. /// </summary> /// <param name="currentLevel">The current level.</param> /// <param name="scene">The scene to which to add all objects.</param> internal async Task BuildFirstScreenAsync(LevelData currentLevel, Scene scene) { m_scene = scene; m_currentLevel = currentLevel; int tilesX = currentLevel.Tilemap.TilesX; int tilesY = currentLevel.Tilemap.TilesY; float tileDistX = Constants.TILE_DISTANCE_X; float tileDistY = -Constants.TILE_DISTANCE_Y; Vector3 midPoint = new Vector3((tilesX - 1) * tileDistX / 2f, 0f, ((tilesY - 1) * tileDistY / 2f)); m_cardMapOnScreen = new Card[tilesX, tilesY]; m_cardPairsOnScreen = new List<CardPairLogic>(); ScreenData currentScreen = currentLevel.Screens[0]; m_actScreenIndex = 0; await scene.ManipulateSceneAsync((manipulator) => { // Build background and define level-wide resources manipulator.BuildBackground(currentLevel.MainTextures.BackgroundTextureLink); m_resBackgroundMaterial1 = manipulator.AddSimpleColoredMaterial( currentLevel.MainTextures.Tile1TextureLink); m_resBackgroundMaterial2 = manipulator.AddSimpleColoredMaterial( currentLevel.MainTextures.Tile2TextureLink); // Build the current screen BuildScreen(manipulator, currentScreen); // Add all logic components to the scene manipulator.Add(new PairUncoverLogic()); manipulator.Add(new VideoPlayLogic()); manipulator.Add(new BackgroundMusicLogic(currentLevel)); manipulator.Add(new EndGameLogic(currentLevel)); manipulator.Add(this); }); Messenger.BeginPublish<MainMemoryScreenEnteredMessage>(); }
/// <summary> /// Searches the next free slot in the card map. /// </summary> /// <param name="currentLevel">The current leveldata.</param> /// <param name="cardMap">The card map.</param> private static Tuple<int, int> SearchFreeCardSlot(LevelData currentLevel, Card[,] cardMap) { Tuple<int, int> result = null; while (result == null) { int xPos = ThreadSafeRandom.Next(0, cardMap.GetLength(0)); int yPos = ThreadSafeRandom.Next(0, cardMap.GetLength(1)); // Check whether the tile position is allowed if (!currentLevel.Tilemap[xPos, yPos]) { continue; } // Check whether the tile position is used already if (cardMap[xPos, yPos] != null) { continue; } result = Tuple.Create(xPos, yPos); } return result; }
public LevelLoadedMessage(LevelData loadedLevel) { this.LoadedLevel = loadedLevel; }