2016-11-03 2 views
-1

Вот файл класса я для создания кнопки:Я не уверен, если мой файл класса кнопка работает только в одном 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). Опции - При нажатии «Параметры» в паузе или в главном меню (еще не настроено).

+0

в gamestate.mainmenu, вы рисуете что-нибудь в стороне от btnResume и btnQuit? –

+0

Я рисую «btnResume» и «btnQuit» только в игровом режиме «Меню». Программа переключится на этот игровой режим, если я нажимаю клавишу «побег» во время «игры» gamestate (это просто простой оператор if). Проблема заключается в том, что никакие другие кнопки не могут быть выведены за пределы меню gamestate. В mainmenu gamestate у меня есть только: IsMouseVisible = true; btnPlay.Draw (SpriteBatch); вот и все. В «Update» У меня есть кое-что проверяет, если btnPlay нажата (btnPlay что бы кнопку воспроизведения в главном меню) –

+0

Вот все мои gamestates: перечисление GameState { Открытие, MainMenu, CharacterSelection, Обратный отсчет, Игры, меню, Параметров, } открытия - Открытие кинематографического Главного меню - титульный экрану в основном выбора символов - выбрать, какой символ, чтобы играть как. Обратный отсчет - 3,2,1 GO перед началом игры. Игра - Игра активна, игроки играют и т. Д. Меню - Меню паузы (открывается при нажатии esc) Опции - Когда нажата кнопка «Настройки» в паузе или в главном меню (еще не настроено) –

ответ

0

Спасибо за помощь, но я решил. Глупая ошибка! Забыл "btnPlay.Update (мышь);" в моей функции обновления! -__-

Смежные вопросы