如何从XNA页面重定向到Silverlight中的页面?

时间:2012-03-03 10:27:55

标签: c# silverlight-4.0 xna xna-4.0

我要做的是从XNA GamePage.xaml重定向到Silverlight中的其他页面。

例如,一旦玩家不再有生命,我想显示一个带有文字GAME OVER的Silverlight页面。我怎样才能做到这一点?我在onUpdate方法中尝试过类似的东西:

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

但这总是给我一个错误。如何工作?

感谢提前:)

2 个答案:

答案 0 :(得分:2)

这是正确的方法!

创建一个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;

接下来我们需要在GameOverScreen的Game1.Update()方法中为switch语句添加一个case:

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 :(得分:1)

我不认为你可以使用“导航”方法进入“游戏”页面......这是不正确的......例如,让游戏使用:

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);

}