public GameView(DataSource dataSource, Size virtualScreenSize, DeviceType deviceType = DeviceType.Desktop, SizingPolicy sizingPolicy = SizingPolicy.FitRatio, OrientationPolicy orientationPolicy = OrientationPolicy.Support180DegreeRotation) { VirtualScreen = new Rect(0, 0, Math.Min(virtualScreenSize.Width, Global.MAX_VIRTUAL_SCREEN_WIDTH), Math.Min(virtualScreenSize.Height, Global.MAX_VIRTUAL_SCREEN_HEIGHT)); virtualScreenDisplay = new Rect(VirtualScreen); this.sizingPolicy = sizingPolicy; this.orientationPolicy = orientationPolicy; this.deviceType = deviceType; isLandscapeRatio = VirtualScreen.Size.Width > VirtualScreen.Size.Height; context = new Context(VirtualScreen.Size.Width, VirtualScreen.Size.Height); if (dataSource == null || !dataSource.IsLoaded) { throw new ExceptionFreeserf(ErrorSystemType.Data, "Given data source is not useable."); } DataSource = dataSource; // factories spriteFactory = new SpriteFactory(VirtualScreen); triangleFactory = new TriangleFactory(VirtualScreen); coloredRectFactory = new ColoredRectFactory(VirtualScreen); minimapTextureFactory = new MinimapTextureFactory(); audioFactory = new AudioFactory(dataSource); var audio = audioFactory.GetAudio(); if (audio != null) { var musicPlayer = audio.GetMusicPlayer(); var soundPlayer = audio.GetSoundPlayer(); var volumeController = audio.GetVolumeController(); if (musicPlayer != null) { musicPlayer.Enabled = UserConfig.Audio.Music; } if (soundPlayer != null) { soundPlayer.Enabled = UserConfig.Audio.Sound; } if (volumeController != null) { volumeController.SetVolume(UserConfig.Audio.Volume); } } TextureAtlasManager.RegisterFactory(new TextureAtlasBuilderFactory()); var textureAtlas = TextureAtlasManager.Instance; textureAtlas.AddAll(dataSource); foreach (Layer layer in Enum.GetValues(typeof(Layer))) { if (layer == Layer.None) { continue; } // TODO: color keys? try { var texture = (layer == Layer.Minimap) ? minimapTextureFactory.GetMinimapTexture() : textureAtlas.GetOrCreate(layer).Texture as Texture; var renderLayer = Create(layer, texture, layer == Layer.Gui, // only the gui supports colored rects null, // no color key for now layer == Layer.GuiFont ? new Render.Color(115, 179, 67, 255) : null); // UI font uses green color overlay if (layer == Layer.Gui || layer == Layer.GuiBuildings || layer == Layer.Minimap) { // the gui needs scaling renderLayer.PositionTransformation = (Position position) => { float factorX = (float)VirtualScreen.Size.Width / 640.0f; float factorY = (float)VirtualScreen.Size.Height / 480.0f; return(new Position(Misc.Round(position.X * factorX), Misc.Round(position.Y * factorY))); }; renderLayer.SizeTransformation = (Size size) => { float factorX = (float)VirtualScreen.Size.Width / 640.0f; float factorY = (float)VirtualScreen.Size.Height / 480.0f; // don't scale a dimension of 0 int width = (size.Width == 0) ? 0 : Misc.Round(size.Width * factorX); int height = (size.Height == 0) ? 0 : Misc.Round(size.Height * factorY); return(new Size(width, height)); }; } else if (layer == Layer.GuiFont) // UI Font needs different scaling { renderLayer.PositionTransformation = (Position position) => { float factorX = (float)VirtualScreen.Size.Width / 640.0f; float factorY = (float)VirtualScreen.Size.Height / 480.0f; return(new Position(Misc.Round(position.X * factorX), Misc.Round(position.Y * factorY))); }; renderLayer.SizeTransformation = (Size size) => { // The UI expects 8x8 characters but we may use different sizes. // So we adjust the scale factors accordingly. float factorX = (8.0f / Global.UIFontCharacterWidth) * (float)VirtualScreen.Size.Width / 640.0f; float factorY = (8.0f / Global.UIFontCharacterHeight) * (float)VirtualScreen.Size.Height / 480.0f; // don't scale a dimension of 0 int width = (size.Width == 0) ? 0 : Misc.Round(size.Width * factorX); int height = (size.Height == 0) ? 0 : Misc.Round(size.Height * factorY); return(new Size(width, height)); }; } renderLayer.Visible = true; AddLayer(renderLayer); } catch (Exception ex) { throw new ExceptionFreeserf(ErrorSystemType.Render, $"Unable to create layer '{layer.ToString()}': {ex.Message}"); } } gui = new UI.Gui(this, this); }