我要做的是从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));
}
但这总是给我一个错误。如何工作?
感谢提前:)
答案 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);
}