public void Dispose() { labels.Clear(); sounds.Clear(); for (var i = 0; i < 2; i++) { customImages[i] = null; } if (backgroundSound != null) { backgroundSound.Dispose(); backgroundSound = null; } if (backgroundMusic != null) { backgroundMusic.Dispose(); backgroundMusic = null; } if (videosnapVideo != null) { videosnapVideo.Dispose(); videosnapVideo = null; } backgroundImage = null; screenSaverImage = null; images.Clear(); }
public void ResetImages() { images.Clear(); onTopImages.Clear(); CImage[] customImages = new CImage[2]; backgroundImage = bezelImage = actorsImage = null; }
public void SetCustomImage(string fileName) { if (customImages[0] == null) { customImages[0] = new CImage(fileName, screenResX, screenResY, "", false, true); } else if (File.Exists(fileName)) { customImages[0].LoadImage(fileName); } }
public CImage CreateImage(ImageType type, string filename, int width, int height, int posX, int posY, string fileNotFoundImage, bool stretch, bool isVisible, bool blackBackground, bool onTop) { var image = new CImage(filename, width, height, fileNotFoundImage, stretch, isVisible, blackBackground); image.X = posX; image.Y = posY; if (!onTop) { images.Add(new KeyValuePair <ImageType, CImage>(type, image)); } else { onTopImages.Add(new KeyValuePair <ImageType, CImage>(type, image)); } if (type == ImageType.Snapshot) { snapshotImage = image; } return(image); }
/* LED LAYOUT * // 28 29 30 31 * // * // 03 04 05 06 17 18 19 20 * // 11 25 * // 13 02 07 08 09 10 16 21 22 23 24 27 * // 12 26 * // 00 01 14 15 */ /* * HYBRID MODE * =========== * PLAYER 1 * d6 = start * d7 = joy * d8 = button 1 * d9 = button 2 * d10 = button 3 * d11 = button 4 * * PLAYER 2 * d18 = start * d19 = joy * d20 = button 1 * d21 = button 2 * d22 = button 3 * d23 = button 4 * * DEDICATED MODE * ============== * PLAYER 1 * e1a = start * e1b = coindoor * e2a = joy * e2b..d7 = button 1..8 * d8 = spinner * d9 = trackball * * PLAYER 2 * e3a = start * e3b = coindoor * e4a = joy * e4b..d19 = button 1..8 * d20 = spinner * d21 = trackball */ public static void Initialize(OBJScene scene, string name, bool debugMode, SmartAsdMode wiringMode) { _smartAsd = IntPtr.Zero; _scene = scene; _smartAsdName = name; _wiringMode = wiringMode; _debugMode = debugMode; var xOffset = scene.screenResX - 380; var yOffset = scene.screenResY - 90; var dedicatedMode = _wiringMode == SmartAsdMode.Dedicated || _wiringMode == SmartAsdMode.Dedicated6Buttons ? 1 : 0; _background = _scene.CreateImage(OBJScene.ImageType.Led, null, 400, 130, xOffset - 20, yOffset - 40, string.Empty, false, true, true, true); _background.StartTransition(CDrawable.Transition.Freeze); var ledIndex = 0; for (var iPlayers = 0; iPlayers < 2; iPlayers++) { // start [0] _ledImages[ledIndex] = _scene.CreateImage(OBJScene.ImageType.Led, "*start", 20, 20, xOffset + 50 + iPlayers * 180, yOffset + 60, string.Empty, false, true, false, true); _ledImages[ledIndex].StartTransition(CDrawable.Transition.Freeze); ledIndex++; // coindoor [1] _ledImages[ledIndex] = _scene.CreateImage(OBJScene.ImageType.Led, "*coindoor", 30 * dedicatedMode, 30 * dedicatedMode, xOffset + 90 + iPlayers * 180, yOffset + 55, string.Empty, false, true, false, true); _ledImages[ledIndex].StartTransition(CDrawable.Transition.Freeze); ledIndex++; // joy [2] _ledImages[ledIndex] = _scene.CreateImage(OBJScene.ImageType.Led, "*joy", 30, 30, xOffset + 15 + iPlayers * 180, yOffset + 15, string.Empty, false, true, false, true); _ledImages[ledIndex].StartTransition(CDrawable.Transition.Freeze); ledIndex++; // buttons 1..4 [3-6] for (var iLoop = 0; iLoop < 4; iLoop++) { var size = 20; if (iLoop == 3 && _wiringMode == SmartAsdMode.Dedicated6Buttons) { size = 0; } _ledImages[ledIndex] = _scene.CreateImage(OBJScene.ImageType.Led, "*button", size, size, xOffset + 50 + iLoop * 20 + iPlayers * 180, yOffset + 10, string.Empty, false, true, false, true); _ledImages[ledIndex].StartTransition(CDrawable.Transition.Freeze); ledIndex++; } // buttons 5..8 [7-10] for (var iLoop = 0; iLoop < 4; iLoop++) { var size = 20; if (iLoop == 3 && _wiringMode == SmartAsdMode.Dedicated6Buttons) { size = 0; } _ledImages[ledIndex] = _scene.CreateImage(OBJScene.ImageType.Led, "*button", size * dedicatedMode, size * dedicatedMode, xOffset + 50 + iLoop * 20 + iPlayers * 180, yOffset + 30, string.Empty, false, true, false, true); _ledImages[ledIndex].StartTransition(CDrawable.Transition.Freeze); ledIndex++; } // spinner [11] _ledImages[ledIndex] = _scene.CreateImage(OBJScene.ImageType.Led, "*spinner", 30 * dedicatedMode, 30 * dedicatedMode, xOffset + 135 + iPlayers * 180, yOffset + 0, string.Empty, false, true, false, true); _ledImages[ledIndex].StartTransition(CDrawable.Transition.Freeze); ledIndex++; // trackball [12] _ledImages[ledIndex] = _scene.CreateImage(OBJScene.ImageType.Led, "*trackball", 40 * dedicatedMode, 40 * dedicatedMode, xOffset + 130 + iPlayers * 180, yOffset + 30, string.Empty, false, true, false, true); _ledImages[ledIndex].StartTransition(CDrawable.Transition.Freeze); ledIndex++; // side button [13] _ledImages[ledIndex] = _scene.CreateImage(OBJScene.ImageType.Led, "*button", 20 * dedicatedMode, 20 * dedicatedMode, xOffset - 10 + iPlayers * 360, yOffset + 20, string.Empty, false, true, false, true); _ledImages[ledIndex].StartTransition(CDrawable.Transition.Freeze); ledIndex++; } // extra buttons 1..4 [28-31] for (var iLoop = 0; iLoop < 4; iLoop++) { _ledImages[ledIndex] = _scene.CreateImage(OBJScene.ImageType.Led, "*button", 20 * dedicatedMode, 20 * dedicatedMode, xOffset + 120 + iLoop * 30, yOffset - 30, string.Empty, false, true, false, true); _ledImages[ledIndex].StartTransition(CDrawable.Transition.Freeze); ledIndex++; } // initialize "none" transition frames noneFrames[0] = 0xffffffff; // initialize "wake-up" and "reverse-wake-up" transition frames for (var frame = 0; frame < 14; frame++) { for (var led = 0; led < 14; led++) { wakeUpFrames[frame] |= led <= frame ? 1u << led : 0u; wakeUpFrames[frame] |= led <= frame ? 1u << led + 14 : 0u; } reverseWakeUpFrames[frame] = ReverseWord(wakeUpFrames[frame] & 0xFFFF); reverseWakeUpFrames[frame] |= ReverseWord(wakeUpFrames[frame] >> 16) << 16; } for (var frame = 14; frame < 17; frame++) { for (var led = 0; led < 32; led++) { wakeUpFrames[frame] |= led <= frame + 14 ? 1u << led : 0u; } reverseWakeUpFrames[frame] = ReverseWord(wakeUpFrames[frame] & 0xFFFF); reverseWakeUpFrames[frame] |= ReverseWord(wakeUpFrames[frame] >> 16) << 16; } // initialize "chase" transition frames for (var frame = 0; frame < 14; frame++) { for (var led = 0; led < 14; led++) { chaseFrames[frame] |= led == frame ? 1u << led - 1: 0u; //chaseFrames[frame] |= led == frame ? 1u << led + 14 : 0u; chaseFrames[frame] |= led == 14 - frame ? 1u << led + 13 : 0u; } } for (var frame = 14; frame < 26; frame++) { for (var led = 0; led < 14; led++) { chaseFrames[frame] |= led == 14 - (frame - 14) ? 1u << led - 1 : 0u; //chaseFrames[frame] |= led == 14 - (frame - 14) ? 1u << led + 14: 0u; chaseFrames[frame] |= led == frame - 14 ? 1u << led + 13 : 0u; } } // initialize "curtain" transition frames if (_wiringMode == SmartAsdMode.Dedicated6Buttons) { curtainFrames = new uint[] { 0xFEEFFBBF, 0xFEEFFBBF, 0xFEEFFBBF, 0xFEEFFBBF, 0x9EEEE3BF, 0x9EEEE3BF, 0x0ECCA19D, 0x0ECCA19D, 0x0E88208C, 0x0E88208C, 0x0E002004, 0x0E002004, 0x08002000, 0x08002000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x08002000, 0x08002000, 0x0E002004, 0x0E002004, 0x0E88208C, 0x0E88208C, 0x0ECCA19D, 0x0ECCA19D, 0x9EEEE3BF, 0x9EEEE3BF, 0xFEEFFBBF, 0xFEEFFBBF, 0xFEEFFBBF, 0xFEEFFBBF, } } ; // dungeonmaster's version //curtainFrames = new uint[] { // 0x00000000, 0x00000000, // 0x00000000, 0x00000000, // 0x00884089, 0x00884089, // 0x90440110, 0x90440110, // 0x60220220, 0x60220220, // 0x08012004, 0x08012004, // 0x60220220, 0x60220220, // 0x90440110, 0x90440110, // 0x00884089, 0x00884089 //}; else { curtainFrames = new uint[] { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x08002000, 0x08002000, 0x0E002004, 0x0E002004, 0x0F10208C, 0x0F10208C, 0x0F98A19D, 0x0F98A19D, 0x0FDCE3BF, 0x0FDCE3BF, 0x9FFEE7FF, 0x9FFEE7FF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; curtainFrames = new uint[] { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x9FFFFFFF, 0x9FFFFFFF, 0x0FFFFFFF, 0x0FFFFFFF, 0x0FFEE7FF, 0x0FFEE7FF, 0x0FDCE3BF, 0x0FDCE3BF, 0x0F98A19D, 0x0F98A19D, 0x0F10208C, 0x0F10208C, 0x0E002004, 0x0E002004, 0x08002000, 0x08002000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x08002000, 0x08002000, 0x0E002004, 0x0E002004, 0x0F10208C, 0x0F10208C, 0x0F98A19D, 0x0F98A19D, 0x0FDCE3BF, 0x0FDCE3BF, 0x9FFEE7FF, 0x9FFEE7FF, 0xFFFFFFFF, 0xFFFFFFFF }; } _curFETransition = FETransition.None; _curTransitionFrames = noneFrames; ResetLed(false); }
public void ShowMenu(List <List <string> > menuCols, string titleText, string statusbarText, string currentMenu, string additionalData, string additionalInfo, bool menuChanged, string preselectedMenuKey, bool isWindowTextReader, string snapshotPath, string iconPath, bool showSideBar) { _currentMenu = currentMenu; _additionalData = additionalData; _additionalInfo = additionalInfo; _menuStrings = menuCols; menuColumnCount = menuCols.Count; _isMenuTextReader = isWindowTextReader; _snapshotPath = snapshotPath != string.Empty ? snapshotPath + (snapshotPath[snapshotPath.Length - 1] != '\\' ? "\\" : string.Empty) : string.Empty; _iconPath = iconPath; _showSideBar = showSideBar; Width = menu_min_width; menu_first_item_shown = 0; var currentCol = 0; var indent = menuCols.Count == 1 ? " " : string.Empty; _menuItems.Clear(); _titlebar = _statusbar = null; // create titlebar if (titleText != string.Empty) { _titlebar = new CLabel(0, 0, Width, (int)(menu_item_height * 1.2), titleText, menu_font_name, menu_font_size + 1, menu_font_style, menu_selected_font_color, menu_selected_backcolor, TextAlign.Left, false); _titlebar.BorderColor = menu_font_color; } // additional info _additionalInfoLayout = BuildTable(additionalInfo, TextAlign.Left, 0); _additionalInfoLayout.PaddingLeft = 10; var itemWidth = Width; var yCounter = 0; foreach (var menuRows in menuCols) { // on first column, decide menu size if (currentCol == 0) { var maxWidth = Width; foreach (var menuRow in menuRows) { var text = menuRow.Split('|').Length < 3 ? indent + menuRow.Split('|')[1] + indent : menuRow.Split('|')[1]; maxWidth = Math.Max(maxWidth, (int)menu_sprite_font.MeasureString(Utils.StringCleanup(text)).X + 8); } itemWidth = (int)Math.Min(maxWidth, _showSideBar && _currentMenu != "show_game_info" ? screenResX / 1.2 : screenResX - screenResX / 64) / menuColumnCount; } for (yCounter = 0; yCounter < menuRows.Count; yCounter++) { var menuRow = menuRows[yCounter]; var arr = menuRow.Split('|'); if (arr[1].StartsWith(("*#*T"))) { // process table var alignChar = arr[1].Substring("*#*T".Length, 1); var textAlign = alignChar == "L" ? TextAlign.Left : alignChar == "C" ? TextAlign.Center : TextAlign.Right; var tableString = string.Empty; for (; yCounter < menuRows.Count; yCounter++) { var tableRow = menuRows[yCounter].Split('|'); var rowString = menuRows[yCounter].Replace("*#*TL*#*", string.Empty). Replace("*#*TC*#*", string.Empty). Replace("*#*TR*#*", string.Empty). Replace("*#*/T*#*", string.Empty); tableString += rowString + "\n"; if (tableRow[1].Contains("*#*/T*#*")) { break; } } // remove last \n tableString = tableString.Substring(0, tableString.Length - 1); // inject table in menu _menuItems.AddRange(BuildTable(tableString, textAlign, itemWidth).Items); } else { // process item var lbl = new CLabel(0, 0, itemWidth, menu_item_height, arr.Length < 3 ? indent + arr[1] + indent : arr[1], menu_font_name, menu_font_size, menu_font_style, menu_font_color, Color.TransparentWhite, TextAlign.Left, arr.Length < 3 ? true : false); lbl.KeyName = arr[0]; lbl.Scrolling = false; _menuItems.Add(lbl); } } currentCol++; } menuRowsCount = yCounter; // create statusbar if (statusbarText != string.Empty) { _statusbar = new CLabel(0, 0, Width, (int)(menu_item_height * 0.9), statusbarText, menu_font_name, menu_font_size - 1, menu_font_style, menu_selected_font_color, menu_selected_backcolor, TextAlign.Right, false); _statusbar.BorderColor = menu_font_color; } _snapshotImage = new CImage(string.Empty, screenResX / 4, screenResY / 4, null, false, true, true); _snapshotImage.BorderColor = menu_font_color; _previousSnapshotPath = string.Empty; _iconImage = new CImage(string.Empty, screenResX / 12, screenResX / 12, null, false, true, false); _previousIconPath = string.Empty; StartTransition(CDrawable.Transition.FadeIn, 0); SelectMenuItem(preselectedMenuKey, menuChanged); }
public void Render(GameTime gameTime, Feel.MachineState machineState) { if (_pendingTransition != CDrawable.Transition.None || _resolutionChanged) { if (_pendingTransition != CDrawable.Transition.None && renderTarget != null) { // save last frame _lastFrame = renderTarget.GetTexture(); _transitionStep = 0f; effectPost.CurrentTechnique = effectPost.Techniques[ _pendingTransition == CDrawable.Transition.Slide ? "PostProcessSlide" : "PostProcessFade"]; } // refresh render target PresentationParameters pp = graphics.GraphicsDevice.PresentationParameters; renderTarget = new RenderTarget2D(graphics.GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, 1, graphics.GraphicsDevice.DisplayMode.Format); _resolutionChanged = false; } graphics.GraphicsDevice.SetRenderTarget(0, renderTarget); spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None); if (machineState.State == Feel.MachineState.StateEnum.ScreenSaver) { graphics.GraphicsDevice.Clear(screenSaverBackcolor); if (screenSaverChange) { if (screenSaverImage != null) { if (nextScreenSaverLeftScrolling) { if (screenSaverImage.X > screenSaverX) { screenSaverImage.X = screenSaverImage.X - (screenResX / 10); if (screenSaverImage.X <= screenSaverX) { screenSaverImage.X = screenSaverX; screenSaverChange = false; } } else { screenSaverImage.X = screenSaverImage.X - (screenResX / 10); if (screenSaverImage.X < -screenSaverSize.Width) { screenSaverImage = null; } } } else { if (screenSaverImage.X < screenSaverX) { screenSaverImage.X = screenSaverImage.X + (screenResX / 10); if (screenSaverImage.X >= screenSaverX) { screenSaverImage.X = screenSaverX; screenSaverChange = false; } } else { screenSaverImage.X = screenSaverImage.X + (screenResX / 10); if (screenSaverImage.X > screenResX) { screenSaverImage = null; } } } } else { screenSaverImage = new CImage(nextScreenSaverFileName, screenSaverSize.Width, screenSaverSize.Height, snapshotImage.FileNotFoundName, nextScreenSaverSnapshotStretch, true); if (nextScreenSaverLeftScrolling) { screenSaverImage.X = screenResX; } else { screenSaverImage.X = -screenSaverImage.Width; } screenSaverImage.Y = screenSaverY; screenSaverTitle.Text = nextScreenSaverTitle; } } if (screenSaverImage != null) { var posX = screenSaverImage.X < 0 ? 0 : screenSaverImage.X; var posY = screenSaverImage.Y < 0 ? 0 : screenSaverImage.Y; var srcRect = screenSaverImage.GetRect(screenResX, screenResY); if (srcRect != null) { screenSaverImage.Draw(gameTime, spriteBatch, _pendingTransition); } screenSaverTitle.Draw(gameTime, spriteBatch, _pendingTransition); } // screensaver written directly on SB! var position = new Vector2(screenResX - (int)(50 * ratioX), (screenResY - (int)(60 * ratioY)) / 2); var rotatedPosition = drawRotated ? new Vector2(screenResY - position.Y, position.X) : position; spriteBatch.Draw(screenSaverLeftArrow, rotatedPosition, null, new Color(Color.White, screenSaverChange && nextScreenSaverLeftScrolling ? .6f : .2f), drawRotated ? MathHelper.PiOver2 : 0f, Vector2.Zero, ratioX, SpriteEffects.FlipHorizontally, 0f); position = new Vector2((int)(20 * ratioX), (screenResY - (int)(60 * ratioY)) / 2); rotatedPosition = drawRotated ? new Vector2(screenResY - position.Y, position.X) : position; spriteBatch.Draw(screenSaverLeftArrow, rotatedPosition, null, new Color(Color.White, screenSaverChange && !nextScreenSaverLeftScrolling ? .6f : .2f), drawRotated ? MathHelper.PiOver2 : 0f, Vector2.Zero, ratioX, SpriteEffects.None, 0f); // OnTop Images foreach (var image in onTopImages) { image.Value.Draw(gameTime, spriteBatch, _pendingTransition); } } else { graphics.GraphicsDevice.Clear(Color.Black); // Background Image if (backgroundImage != null) { backgroundImage.Draw(gameTime, spriteBatch, _pendingTransition); } // Video Image Texture2D texture = videosnapVideo.GetTexture(); if (videosnapVideo.IsPlaying && texture != null) { snapshotImage.SetTexture(texture); } // Images foreach (var image in images) { image.Value.Draw(gameTime, spriteBatch, _pendingTransition); } // Labels foreach (var label in labels) { label.Draw(gameTime, spriteBatch, _pendingTransition); } // Actors Image if (actorsImage != null) { actorsImage.Draw(gameTime, spriteBatch, _pendingTransition); } // Bezel Image if (bezelImage != null) { bezelImage.Draw(gameTime, spriteBatch, _pendingTransition); } // OnTop Images foreach (var image in onTopImages) { image.Value.Draw(gameTime, spriteBatch, _pendingTransition); } // FNET fnetMessage.Draw(gameTime, spriteBatch, _pendingTransition); // Menu menu.Draw(gameTime, spriteBatch, _pendingTransition); // Mapping Image if (machineState.State == Feel.MachineState.StateEnum.CustomImage && currentCustomImage >= 0) { customImages[currentCustomImage].Draw(gameTime, spriteBatch, _pendingTransition); } // Message Labels menu.DrawMessage(gameTime, spriteBatch, _pendingTransition); // Toast messageToast.Draw(gameTime, spriteBatch, _pendingTransition); PlayBackgroundMusic(); } if (machineState.testMode) { // test mode written directly on SB! spriteBatch.DrawString( testTextFont, "F.E.E.L. " + Application.ProductVersion + " (Test Mode) - FPS: " + machineState.fps + "\n" + machineState.ToString(), new Vector2(testTextPosition.X, testTextPosition.Y), Color.GhostWhite); } spriteBatch.End(); // Switch back to drawing onto the back buffer graphics.GraphicsDevice.SetRenderTarget(0, null); // Draw to backbuffer graphics.GraphicsDevice.Clear(Color.Black); spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.SaveState); // Apply the post process shader effectPost.Parameters["fFadeAmount"].SetValue(_transitionStep); effectPost.Parameters["ColorMap2"].SetValue(_lastFrame); effectPost.Parameters["fSmoothSize"].SetValue(.3f); effectPost.CommitChanges(); effectPost.Begin(); { effectPost.CurrentTechnique.Passes[0].Begin(); { spriteBatch.Draw(renderTarget.GetTexture(), _screenRectangle, Color.White); effectPost.CurrentTechnique.Passes[0].End(); } } effectPost.End(); spriteBatch.End(); // Update transition step if (_transitionStep < 1f) { _transitionStep += .1f; } else { _lastFrame = null; _transitionStep = 1f; } _pendingTransition = CDrawable.Transition.None; }