Reputation: 21
Hi I making a main menu with sub menus in XNA 4/C#. I created a void to call the buttons, all work good but at click in buttons only work the first of the menu (this in all menus) .
The mouse over work in all, all text show, but no the clicks(only in the first of all menus. I tested to remove the Released check and the click work in all, but have the problem of release the click and press in next menu...
Here is the code:
#region CheckforMenus
//Level 0
public static bool ismenuIntro = true;
//Level 1
public static bool ismenuMain = true;
public static bool ismenuSinglePlayer = false;
public static bool ismenuMultiplayer = false;
public static bool ismenuChallenges = false;
public static bool ismenuSettings = false;
public static bool ismenuSelectProfile = false;
public static bool ismenuCredits = false;
public static bool ismenuExit = false;
//Level 2
//public static bool ismenuSinglePlayerP = false;
public static bool ismenuMultiplayerJoin = false;
public static bool ismenuMultiplayerHost = false;
//Level 2 Settings
public static bool ismenuSVideo = false;
public static bool ismenuSSound = false;
public static bool ismenuSControls = false;
public static bool ismenuSLang = false;
//Level 3
public static bool ismenuMultiplayerHostlobby = false;
#endregion
public static MouseState previousMouseState;
public static bool mbOverMouse = false;
public static bool mbClickMouse = false;
//The Button
protected void mButton(SpriteFont mbFont, string mbName, string mbInfo, int mbType, int mbPosX, int mbPosY, string mbOldMenu, string mbNextMenu)
{
Vector2 origin1 = Main.fGUIMenu_Small.MeasureString(mbName);
Rectangle clickableArea = new Rectangle(mbPosX, mbPosY, (int)origin1.X + 100, (int)origin1.Y);
Point mousePos = new Point(Mouse.GetState().X, Mouse.GetState().Y);
if (clickableArea.Contains(mousePos))
{
if (previousMouseState.LeftButton == ButtonState.Released && Mouse.GetState().LeftButton == ButtonState.Pressed)
{
mbClickMouse = true;
}
else
{
mbClickMouse = false;
}
mbOverMouse = true;
}
else
{
mbOverMouse = false;
}
spriteBatch.Begin();
if (mbOverMouse)
{
spriteBatch.DrawString(mbFont, mbName, new Vector2(mbPosX, mbPosY), Color.White);
spriteBatch.DrawString(fGUIMenu_Small, mbName, new Vector2(20, 480), Color.White);
spriteBatch.DrawString(fGUIMenu_Tiny, mbInfo, new Vector2(20, 500), Color.White);
}
else
{
spriteBatch.DrawString(mbFont, mbName, new Vector2(mbPosX, mbPosY), Color.White);
mbOverMouse = false;
}
if (mbClickMouse)
{
if (mbOldMenu == "ismenuIntro") ismenuIntro = false;
if (mbOldMenu == "ismenuMain") ismenuMain = false;
if (mbOldMenu == "ismenuSinglePlayer") ismenuSinglePlayer = false;
if (mbOldMenu == "ismenuMultiplayer") ismenuMultiplayer = false;
if (mbOldMenu == "ismenuChallenges") ismenuChallenges = false;
if (mbOldMenu == "ismenuSettings") ismenuSettings = false;
if (mbOldMenu == "ismenuSelectProfile") ismenuSelectProfile = false;
if (mbOldMenu == "ismenuCredits") ismenuCredits = false;
if (mbOldMenu == "ismenuExit") ismenuExit = false;
if (mbOldMenu == "ismenuMultiplayerJoin") ismenuMultiplayerJoin = false;
if (mbOldMenu == "ismenuMultiplayerHost") ismenuMultiplayerHost = false;
if (mbOldMenu == "ismenuSVideo") ismenuSVideo = false;
if (mbOldMenu == "ismenuSSound") ismenuSSound = false;
if (mbOldMenu == "ismenuSControls") ismenuSControls = false;
if (mbOldMenu == "ismenuSLang") ismenuSLang = false;
if (mbOldMenu == "ismenuMultiplayerHostlobby") ismenuMultiplayerHostlobby = false;
if (mbNextMenu == "ismenuIntro") ismenuIntro = true;
if (mbNextMenu == "ismenuMain") ismenuMain = true;
if (mbNextMenu == "ismenuSinglePlayer") ismenuSinglePlayer = true;
if (mbNextMenu == "ismenuMultiplayer") ismenuMultiplayer = true;
if (mbNextMenu == "ismenuChallenges") ismenuChallenges = true;
if (mbNextMenu == "ismenuSettings") ismenuSettings = true;
if (mbNextMenu == "ismenuSelectProfile") ismenuSelectProfile = true;
if (mbNextMenu == "ismenuCredits") ismenuCredits = true;
if (mbNextMenu == "ismenuExit") ismenuExit = true;
if (mbNextMenu == "ismenuMultiplayerJoin") ismenuMultiplayerJoin = true;
if (mbNextMenu == "ismenuMultiplayerHost") ismenuMultiplayerHost = true;
if (mbNextMenu == "ismenuSVideo") ismenuSVideo = true;
if (mbNextMenu == "ismenuSSound") ismenuSSound = true;
if (mbNextMenu == "ismenuSControls") ismenuSControls = true;
if (mbNextMenu == "ismenuSLang") ismenuSLang = true;
if (mbNextMenu == "ismenuMultiplayerHostlobby") ismenuMultiplayerHostlobby = true;
}
else
{
mbClickMouse = false;
}
spriteBatch.End();
previousMouseState = Mouse.GetState();
}
//Here the menus
//this is called in protected override void Draw(GameTime gameTime)
//as this.menuMain();
protected void menuMain()
{
//Main
//Level 0
if (ismenuMain)
{
mButton(fGUIMenu_Small, "Singleplayer", "test text 1", 0, 20, 80, "ismenuMain", "ismenuSinglePlayer");
mButton(fGUIMenu_Small, "Multiplayer", "test text 2", 0, 20, 80, "ismenuMain", "ismenuMultiplayer");
spriteBatch.Begin();
this.spriteBatch.DrawString(fGUIMenu_AMega, "Main Menu", new Vector2(10, 20), Color.White);
spriteBatch.End();
}
else if (ismenuSinglePlayer)
{
mButton(fGUIMenu_Small, "MainMenu1", "hi 1", 0, 20, 80, "ismenuSinglePlayer", "ismenuMain");
mButton(fGUIMenu_Small, "MainMenu2", "hi 1", 1, 20, 300, "ismenuSinglePlayer", "ismenuMain");
}
else if (ismenuMultiplayer)
{
mButton(fGUIMenu_Small, "MainMENU", "TEST TEST", 1, 20, 80, "ismenuMultiplayer", "ismenuMain");
}
}
Upvotes: 0
Views: 202
Reputation: 21
Solution:
Need define bool mbOverMouse & bool mbClickMouse,mouseState,previousMouseState for different calls of the void. I've done it with this way:
#region CheckforMenus
//Level 0
public static bool ismenuIntro = true;
//Level 1
public static bool ismenuMain = true;
public static bool ismenuSinglePlayer = false;
public static bool ismenuMultiplayer = false;
public static bool ismenuChallenges = false;
public static bool ismenuSettings = false;
public static bool ismenuSelectProfile = false;
public static bool ismenuCredits = false;
public static bool ismenuExit = false;
//Level 2
public static bool ismenuMultiplayerJoin = false;
public static bool ismenuMultiplayerHost = false;
//Level 2 Settings
public static bool ismenuSVideo = false;
public static bool ismenuSSound = false;
public static bool ismenuSControls = false;
public static bool ismenuSLang = false;
//Level 3
public static bool ismenuMultiplayerHostlobby = false;
#endregion
//9 bools for 9 different types of buttons, dont need this, only 1 if you like
bool[] mbOverMouse = new bool[9];
bool[] mbClickMouse = new bool[9];
MouseState[] mouseState = new MouseState[9];
MouseState[] previousMouseState = new MouseState[9];
void mButtonG(SpriteFont mbFont, string mbName, string mbInfo, int mbType, int mbPosX, int mbPosY, string mbOldMenu, string mbNextMenu)
{
int n = new int();
n = mbType;
//mbOverMouse[n] = false;
//mbClickMouse[n] = false;
Vector2 origin1 = Main.fGUIMenu_Small.MeasureString(mbName);
Rectangle clickableArea = new Rectangle(mbPosX, mbPosY, (int)origin1.X + 100, (int)origin1.Y);
Point mousePos = new Point(Mouse.GetState().X, Mouse.GetState().Y);
if (clickableArea.Contains(mousePos))
{
mouseState[n] = Mouse.GetState();
if (previousMouseState[n].LeftButton == ButtonState.Released && mouseState[n].LeftButton == ButtonState.Pressed)
//mbType == 1 && mouseStatePrevious1.LeftButton == ButtonState.Released && mouseStateCurrent1.LeftButton == ButtonState.Pressed) //previousMouseState.LeftButton == ButtonState.Released && Mouse.GetState().LeftButton == ButtonState.Pressed
{
mbClickMouse[n] = true;
}
else
{
mbClickMouse[n] = false;
}
mbOverMouse[n] = true;
}
else
{
mbOverMouse[n] = false;
}
spriteBatch.Begin();
if (mbOverMouse[n])
{
spriteBatch.DrawString(mbFont, mbName, new Vector2(mbPosX, mbPosY), Color.White);
spriteBatch.DrawString(fGUIMenu_Small, mbName, new Vector2(20, 480), Color.White);
spriteBatch.DrawString(fGUIMenu_Tiny, mbInfo, new Vector2(20, 500), Color.White);
}
else
{
spriteBatch.DrawString(mbFont, mbName, new Vector2(mbPosX, mbPosY), Color.White);
mbOverMouse[n] = false;
}
if (mbClickMouse[n])
{
if (mbOldMenu == "ismenuIntro") ismenuIntro = false;
if (mbOldMenu == "ismenuMain") ismenuMain = false;
if (mbOldMenu == "ismenuSinglePlayer") ismenuSinglePlayer = false;
if (mbOldMenu == "ismenuMultiplayer") ismenuMultiplayer = false;
if (mbOldMenu == "ismenuChallenges") ismenuChallenges = false;
if (mbOldMenu == "ismenuSettings") ismenuSettings = false;
if (mbOldMenu == "ismenuSelectProfile") ismenuSelectProfile = false;
if (mbOldMenu == "ismenuCredits") ismenuCredits = false;
if (mbOldMenu == "ismenuExit") ismenuExit = false;
if (mbOldMenu == "ismenuMultiplayerJoin") ismenuMultiplayerJoin = false;
if (mbOldMenu == "ismenuMultiplayerHost") ismenuMultiplayerHost = false;
if (mbOldMenu == "ismenuSVideo") ismenuSVideo = false;
if (mbOldMenu == "ismenuSSound") ismenuSSound = false;
if (mbOldMenu == "ismenuSControls") ismenuSControls = false;
if (mbOldMenu == "ismenuSLang") ismenuSLang = false;
if (mbOldMenu == "ismenuMultiplayerHostlobby") ismenuMultiplayerHostlobby = false;
if (mbNextMenu == "ismenuIntro") ismenuIntro = true;
if (mbNextMenu == "ismenuMain") ismenuMain = true;
if (mbNextMenu == "ismenuSinglePlayer") ismenuSinglePlayer = true;
if (mbNextMenu == "ismenuMultiplayer") ismenuMultiplayer = true;
if (mbNextMenu == "ismenuChallenges") ismenuChallenges = true;
if (mbNextMenu == "ismenuSettings") ismenuSettings = true;
if (mbNextMenu == "ismenuSelectProfile") ismenuSelectProfile = true;
if (mbNextMenu == "ismenuCredits") ismenuCredits = true;
if (mbNextMenu == "ismenuExit") ismenuExit = true;
if (mbNextMenu == "ismenuMultiplayerJoin") ismenuMultiplayerJoin = true;
if (mbNextMenu == "ismenuMultiplayerHost") ismenuMultiplayerHost = true;
if (mbNextMenu == "ismenuSVideo") ismenuSVideo = true;
if (mbNextMenu == "ismenuSSound") ismenuSSound = true;
if (mbNextMenu == "ismenuSControls") ismenuSControls = true;
if (mbNextMenu == "ismenuSLang") ismenuSLang = true;
if (mbNextMenu == "ismenuMultiplayerHostlobby") ismenuMultiplayerHostlobby = true;
}
else
{
mbClickMouse[n] = false;
}
spriteBatch.End();
previousMouseState[n] = mouseState[n];
}
protected void menuMain()
{
if (ismenuMain)
{
mbOverMouse[0] = false;
mbClickMouse[0] = false;
mButtonG(fGUIMenu_Small, "Singleplayer", "Here my text A", 0, 20, 80, "ismenuMain", "ismenuSinglePlayer");
mButtonG(fGUIMenu_Small, "Multiplayer", "Here my text B", 0, 20, 110, "ismenuMain", "ismenuMultiplayer");
spriteBatch.Begin();
this.spriteBatch.DrawString(fGUIMenu_AMega, "Main Menu", new Vector2(10, 20), Color.White);
spriteBatch.End();
}
else if (ismenuSinglePlayer)
{
mbOverMouse[0] = false;
mbClickMouse[0] = false;
mButtonG(fGUIMenu_Small, "Singleplayer", "Here my text A", 0, 20, 80, "ismenuSinglePlayer", "ismenuMain");
mButtonG(fGUIMenu_Small, "Singleplayer", "Here my text B", 0, 20, 300, "ismenuSinglePlayer", "ismenuMain");
}
else if (ismenuMultiplayer)
{
mbOverMouse[0] = false;
mbClickMouse[0] = false;
mButtonG(fGUIMenu_Small, "Multiplayer", "Text", 0, 20, 110, "ismenuMultiplayer", "ismenuMain");
}
}
Upvotes: 1