Как перенаправить на страницу в Silverlight со страницы XNA? - PullRequest
0 голосов
/ 03 марта 2012

Я пытаюсь перенаправить файл XNA GamePage.xaml на другую страницу в Silverlight.

Например, когда у игрока больше нет жизней, я хочу отобразить страницу Silverlight с текстом GAME OVER. Как я могу это сделать? Я пытался что-то вроде этого в методе onUpdate:

if(lifes == 0)
{
    SharedGraphicsDeviceManager.Current.GraphicsDevice.SetSharingMode(false);
    timer.Stop();
    NavigationService.Navigate( new Uri("/GameOverPage.xaml",UriKind.Relative));
}

но это всегда дает мне ошибку. Как это сделать, чтобы работать?

спасибо за продвижение:)

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Вот правильный метод!

Создание класса GameOverScreen:

public class GameOverScreen
{
private Texture2D texture;
private Game1 game;
private KeyboardState lastState;

public GameOverScreen(Game1 game)
{
    this.game = game;
    texture = game.Content.Load<Texture2D>("GameOverScreen");
    lastState = Keyboard.GetState();
}

public void Update()
{
    KeyboardState keyboardState = Keyboard.GetState();

    if (keyboardState.IsKeyDown(Keys.Enter) && lastState.IsKeyUp(Keys.Enter))
    {
        game.StartGame();
    }
    else if (keyboardState.IsKeyDown(Keys.Escape) && lastState.IsKeyUp(Keys.Escape))
    {
        game.Exit();
    }

    lastState = keyboardState;
}

public void Draw(SpriteBatch spriteBatch)
{
    if (texture != null)
        spriteBatch.Draw(texture, new Vector2(0f, 0f), Color.White);
}
}

Реализация класса GameOverScreen

Теперь у нас естьКласс GameOverScreen. Нам нужно добавить код в Game1.cs для его реализации.

Сначала нам понадобится переменная для нового экрана.Вверху класса Game1 добавьте новый

GameOverScreen object:
StartScreen startScreen;
GamePlayScreen gamePlayScreen;
GameOverScreen gameOverScreen;

Далее нам нужно добавить регистр в оператор switch в методе Game1.Update () для GameOverScreen:

case Screen.GameOverScreen:
if (gameOverScreen != null)
    gameOverScreen.Update();
break;

И мы должны сделать то же самое для метода Draw ():

case Screen.GameOverScreen:
if (gameOverScreen != null)
    gameOverScreen.Draw(spriteBatch);
break;

Теперь нам нужно добавить метод EndGame ()это закроет GamePlayScreen и откроет GameOverScreen.Это будет вызвано, когда условие игры закончено.

public void EndGame()
{
gameOverScreen = new GameOverScreen(this);
currentScreen = Screen.GameOverScreen;

gamePlayScreen = null;
}

Также необходимо внести одно незначительное изменение в метод StartGame ().На GameOverScreen мы собираемся дать пользователю возможность перезапустить игру, которая вызовет метод StartGame ().Итак, в конце метода StartGame () нам просто нужно добавить одну строку кода, чтобы установить для gameOverScreen значение null.

 gameOverScreen = null;

Условие завершения игры

Последнее, что нам нужно сделать, это позаботиться о том, чтобы игра закончилась, что будет обработано в классе GamePlayScreen.Откройте GamePlayScreen.cs.Первое, что нам нужно здесь, это новое целое число, чтобы сохранить количество жизней, которое имеет игрок, добавьте его в начало класса: Например:

int lives = 3;

Это значение нене должно быть 3, вы можете изменить его на что угодно, конечно.Затем нам нужно добавить код для уменьшения количества жизней каждый раз, когда кусок торта сдвигается с нижней части экрана и удаляется.Когда число жизней равно 0, вызывается Game1.EndGame ().Этот код будет добавлен в метод HandleFallingCake ().

if (toRemove.Count > 0)
{
foreach (Sprite cake in toRemove)
{
    cakeList.Remove(cake);
    --lives;
    if (lives == 0)
        game.EndGame();
}
}
1 голос
/ 12 марта 2012

Не думаю, что вы можете использовать метод "Навигация" на странице "игры" ... Это не правильно ... Чтобы выйти из игры, используйте, например:

protected override void Update(GameTime gameTime)

{

// Allows the game to exit

if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)

this.Exit(); //this

// TODO: Add your update logic here

base.Update(gameTime);

}
...