Вот файл класса я для создания кнопки:Я не уверен, если мой файл класса кнопка работает только в одном GameState
class Button
{
Texture2D buttonTexture;
Rectangle buttonRectangle;
Color buttonColour = new Color(255, 255, 255, 255);
public Vector2 size, buttonPosition;
public Button(Texture2D newButtonTexture, Vector2 newSize)
{
buttonTexture = newButtonTexture;
size = newSize;
}
public void setPosition(Vector2 newButtonPosition)
{
buttonPosition = newButtonPosition;
}
bool down;
public bool isClicked;
public void Update(MouseState mouse)
{
buttonRectangle = new Rectangle((int)buttonPosition.X, (int)buttonPosition.Y, (int)size.X, (int)size.Y);
Rectangle mouseRectangle = new Rectangle(mouse.X, mouse.Y, 1, 1);
if (mouseRectangle.Intersects(buttonRectangle))
{
if (buttonColour.A == 255)
down = false;
if (buttonColour.A == 0)
down = true;
if (down)
buttonColour.A += 3;
else
buttonColour.A -= 3;
if (mouse.LeftButton == ButtonState.Pressed)
isClicked = true;
}
else if (buttonColour.A < 255)
{
buttonColour.A += 3;
isClicked = false;
}
}
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(buttonTexture, buttonRectangle, buttonColour);
}
}
Ниже, как создать кнопки в LoadContent (игнорировать ветхие параметры это именно так, как я сейчас делаю это):
btnResume = new Button(Content.Load<Texture2D>("Buttons/button_Resume"), new Vector2(GraphicsDevice.Viewport.Width/1.875f, GraphicsDevice.Viewport.Height/4));
btnResume.setPosition(new Vector2(GraphicsDevice.Viewport.Width/2 - (0.5f*btnResume.size.X), GraphicsDevice.Viewport.Height/3));
btnQuit = new Button(Content.Load<Texture2D>("Buttons/button_Exit"), new Vector2(GraphicsDevice.Viewport.Width/1.875f, GraphicsDevice.Viewport.Height/4));
btnQuit.setPosition(new Vector2(GraphicsDevice.Viewport.Width/2 - (0.5f*btnQuit.size.X), GraphicsDevice.Viewport.Height - (GraphicsDevice.Viewport.Height/3)));
И это, как я рисую две кнопки в функции жки Game1.cs:
case GameState.Menu:
btnResume.Draw(spriteBatch);
btnQuit.Draw(spriteBatch);
break;
Все это работает нормально. Однако по какой-то причине, когда вы делаете то же самое для кнопки «Play», чтобы включить новое игровое состояние под названием «MainMenu», кнопка не отображается (я протестировал код кнопки в меню «Состояние игры») и кнопка появляется, она просто не будет отображаться, когда в каком-либо другом игровом состоянии, кроме «меню»).
Кто-нибудь знает, почему это не сработает? Я вспомнил, что создал кнопку, установил позицию, а затем нарисую ее в части «Draw Game.State.MainMenu» функции draw в Game1.cs, поэтому я честно понятия не имею, почему она не работает. В качестве побочного примечания я пробовал рисовать кнопки для другого игрового состояния под названием «CharacterSelection», и это тоже не работает. ОДНАКО, он работает, если я использую spriteBatch.Draw (так что я уверен, что это проблема с кнопкой класс '.
Я могу предоставить скриншоты кода или игровых элементов, и я сожалею, если код грязный, я, как правило, делаю это много. Это моя первая игра XNA, и я не закодированы в C# много в прошлом, так много это ново для меня
EDIT:.
Вот все мои gamestates:
enum GameState
{
Opening,
MainMenu,
CharacterSelection,
Countdown,
Playing,
Menu,
Options,
}
GameState CurrentGameState = GameState.Opening;
Открытие - открытие кинематографического главного меню - экран заголовка в основном Выбор персонажа - выберите, какой символ играть. Обратный отсчет - 3,2,1 GO до начала игры. Игра - Игра активна, игроки играют в меню e.t.c Меню - Пауза (открывается при нажатии esc). Опции - При нажатии «Параметры» в паузе или в главном меню (еще не настроено).
в gamestate.mainmenu, вы рисуете что-нибудь в стороне от btnResume и btnQuit? –
Я рисую «btnResume» и «btnQuit» только в игровом режиме «Меню». Программа переключится на этот игровой режим, если я нажимаю клавишу «побег» во время «игры» gamestate (это просто простой оператор if). Проблема заключается в том, что никакие другие кнопки не могут быть выведены за пределы меню gamestate. В mainmenu gamestate у меня есть только: IsMouseVisible = true; btnPlay.Draw (SpriteBatch); вот и все. В «Update» У меня есть кое-что проверяет, если btnPlay нажата (btnPlay что бы кнопку воспроизведения в главном меню) –
Вот все мои gamestates: перечисление GameState { Открытие, MainMenu, CharacterSelection, Обратный отсчет, Игры, меню, Параметров, } открытия - Открытие кинематографического Главного меню - титульный экрану в основном выбора символов - выбрать, какой символ, чтобы играть как. Обратный отсчет - 3,2,1 GO перед началом игры. Игра - Игра активна, игроки играют и т. Д. Меню - Меню паузы (открывается при нажатии esc) Опции - Когда нажата кнопка «Настройки» в паузе или в главном меню (еще не настроено) –