最近开始使用XNA(来自java)并遇到显示游戏屏幕的问题。在加载XNA时,我得到了一个game.cs类,我将其解释为一组用于在游戏中绘制单个自包含屏幕的函数。显然,将所有不同屏幕的代码输入到这个单独的类中会很快变得非常混乱,所以我创建了下面的类来处理更改:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Colonies
{
public class GameManager //manages game screens
{
Microsoft.Xna.Framework.Game currentScreen;
public enum screens { menu, game, summary };
public GameManager()
{
initialize();
}
public void initialize()
{
currentScreen = new Menu(this);
((Menu)currentScreen).Run();
}
public void changeScreen(int i)
{
switch (i)
{
case 0:
currentScreen = new Menu(this);
((Menu)currentScreen).Run();
break;
case 1:
currentScreen = new World(this);
((World)currentScreen).Run();
break;
case 2:
currentScreen = new Summary(this);
((Summary)currentScreen).Run();
break;
}
}
}
}
然而,当其中一个更改被触发时,这会导致错误标记,告诉我我不能多次调用游戏。这是否意味着初步估计有一个单一的通用游戏屏幕实际上是正确的吗?!应该是经理而不是像屏幕一样查询游戏,然后在主游戏.ccs类中调用哪些方法?
即
在game.cs更新方法中,例如:
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// TODO: Add your update logic here
aGameManager.getAGameObject.DoAnUpdate();
base.Update(gameTime);
}
所以基本上我的主要游戏类永远不会再次运行,只是改变它显示的内容。这是正确的解决方案吗? (隐藏了很多游戏类,我不确定使用它的正确方法是什么)
答案 0 :(得分:1)
Game
课程整个游戏。这就是为什么它被称为Game
。如果需要,您可以创建“屏幕”对象,每个对象控制不同的屏幕,并在尝试使用“游戏管理器”时使用Game
类。
EG:
public static int currentScreen = 0; // Any screen can change this variable when needed
List<Screenobject> myscreens = new List<Screenobject>(); // Populate this with screens
// OR
menuscreen = new menuScreen();
otherscreen = new otherScreen();
// ...
protected override void Update(GameTime gameTime)
{
myscreens[currentScreen].Update(gameTime);
// OR
switch (currentScreen)
{
case 1:
menuscreen.Update(gameTime); break;
// ...
}
base.Update(gameTime);
}
和Draw(..)
与Update(..)
答案 1 :(得分:-1)
创建枚举器
enum gamestate
mainmenu
gameplay
options
end enum
然后只需更新(绘制)主要功能
if gamestate = mainmenu then mainmenu.update();
if gamestate = gameplay then gameplay.update()