2015-02-10 2 views
-4

Я делаю игру, и я столкнулся с некоторой проблемой. Из предыдущих исследований я нашел способ изменения переменной из нескольких классов, но она не работает. Я установил все свои экраны в список массивов, и я пытаюсь использовать эту переменную для переключения между экранами, но экран не меняется. в визуальной студии нет ошибки, поэтому я не знаю, что пошло не так. жаль, что не смог указать на определенную линию. любая помощь очень ценится.пытается изменить переменную из другого класса, не работает

это класс, который использует Int32 GlobalVar.activescreen

public class ManageTheseScreens 
{ 
    ArrayList Screens; 
    Screen CurrentScreen; 

    public ManageTheseScreens() 
    { 
     Screens = new ArrayList(); 
     Screens.Add(new TitleScreen()); 
     Screens.Add(new OptionScreen()); 
     CurrentScreen = (Screen)Screens[GlobalVar.activescreen]; 
    } 

    public void Draw(SpriteBatch spriteBatch) 
    { 
     CurrentScreen.Draw(spriteBatch); 
    } 
} 

это класс, который держит Int32

public static class GlobalVar 
    { 
     public static Int32 activescreen = 0; 
    } 

это класс, который пытается изменить его

class OptionScreen : Screen 
{ 
    Rectangle titleButton1Rectangle = new Rectangle(450, 100, 222, 44); 

    MouseState mouseState; 

    public OptionScreen() 
     : base() 
    { 

    } 

public void Update() 
{ 
    mouseState = Mouse.GetState(); 
    if (titleButton1Rectangle.Contains(new Point(Mouse.GetState().X, Mouse.GetState().Y))) 
    { 
     if (Mouse.GetState().RightButton == ButtonState.Pressed) 
     { 
      ///this should switch screens 
      GlobalVar.activescreen = 1; 
     } 
    } 
} 
+3

Что не работает? Я считаю, экран не меняется? возможно, из-за того, что вы изменяете переменную, но не вызываете ничего, что проверяет ее после того, как вы ее измените .... угадывая здесь, поскольку вы не предоставили достаточную информацию – Sorceri

+0

правильно, экран не изменяется. Я не думаю, что мне нужно вызывать все, что обновляет его, потому что оно находится в функции Draw, которая вызывается несколько раз в секунду. пожалуйста, исправьте меня, если я ошибаюсь, но я верю, что так оно и работает. – MlkShakes

+0

, пожалуйста, научитесь использовать отладчик, вы должны быть в состоянии сказать нам, действительно ли значение переменной изменяется, просто запустив программу и глядя на нее –

ответ

0

Вам не нужно вызывать экраны CurrentScreen = (Screen) [GlobalVar.activescreen]; в вашем методе рисования. В классе ManageScreen вы должны иметь метод обновления

Public void UpdateCurrentScreen() 
{ 
    CurrentScreen = (Screen)Screens[GlobalVar.activescreen]; 
} 

в вашем методе обновления вы называете

GlobalVar.activescreen = 1; 

после установки вара вы вызываете метод обновления в ManageScreens

public void Update() 
{ 
    mouseState = Mouse.GetState(); 
    if (titleButton1Rectangle.Contains(new Point(Mouse.GetState().X, Mouse.GetState().Y))) 
    { 
     if (Mouse.GetState().RightButton == ButtonState.Pressed) 
     { 
      ///this should switch screens 
      GlobalVar.activescreen = 1; 
      //variable changes so you now have to update the member CurrentScreen to reflect the change hence the example of below 
      manageScreensInstance.UpdateCurrentScreen(); 
     } 
    } 
} 

Хороший Ссылки на статические переменные и их срок службы C# Static variables - scope and persistence

Значит, GlobalVar.activescreen всегда 0? вы поставили точку останова, чтобы убедиться, что она действительно нажимает на строку кода, чтобы изменить переменную?

+0

, если я добавлю _GlobalVar.activescreen = 1; _ для класса обновления, тогда он всегда будет установлен в 1. точка должна изменить его, поэтому, когда я использую _GlobalVar.acticescreen_, будет равен элемент массива для экрана, который я хочу нарисовать. Я поставил точку останова, и теперь она обновляет переменную, но экраны по-прежнему не переключаются. – MlkShakes

+0

@MlkShakes вы полностью пропустили то, что я сказал. Я не вижу нигде в вашем коде, кроме конструктора, где вы обновляете член Currentscreen, чтобы отразить изменение в переменной. Вы должны установить его в элемент в arraylist. Он просто не делает это сам по себе. – Sorceri

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

  • Нет связанных вопросов^_^