C# XNA property Game.IsActive不工作
我最近注意到,有时候XNA属性并不总是正确反映游戏窗口的状态 更具体地说,C# XNA property Game.IsActive不工作,c#,windows,xna,xna-4.0,C#,Windows,Xna,Xna 4.0,我最近注意到,有时候XNA属性并不总是正确反映游戏窗口的状态 更具体地说,Game.IsActive=true,即使游戏窗口明显未处于活动状态(例如,顶部窗口栏的颜色为非活动)。我可以在活动的Firefox窗口与游戏窗口稍微重叠的情况下重现这种行为 这里可能有什么问题 根据要求,此图显示了问题: 游戏窗口在后台,浏览器(显示堆栈溢出)在前台(并处于活动状态),但属性game.IsActive为true(正如您在visual studio输出(洋红色“圆圈”)中看到的,该属性在每次更新()时都被
Game.IsActive=true
,即使游戏窗口明显未处于活动状态(例如,顶部窗口栏的颜色为非活动)。我可以在活动的Firefox窗口与游戏窗口稍微重叠的情况下重现这种行为
这里可能有什么问题
根据要求,此图显示了问题:
游戏窗口在后台,浏览器(显示堆栈溢出)在前台(并处于活动状态),但属性game.IsActive为true(正如您在visual studio输出(洋红色“圆圈”)中看到的,该属性在每次更新()时都被写入
我在我的核心游戏类中创建XNA类游戏的静态引用并使用它,这可能是一个问题吗?如评论中所述,
IsActive
-属性有它的弱点
您应该订阅事件游戏。激活的和游戏。停用的。在启动时将更多的焦点放在您的窗口上,您就没事了
IMHO:我不喜欢像IsActive
这样的“神奇”属性。事件要精确得多
例如:
public class MyGame : Game
{
public MyGame()
{
// Should move to Initialize-method..
this.Activated += ActivateMyGame;
this.Deactivated += DeactivateMyGame;
this.IAmActive = false;
// do you init-stuff
// bring you window to front. After this point the "Game.IsActive"
// will be set correctly, while IAmActive is correct from the beginning.
}
public bool IAmActive { get; set; }
public void ActivateMyGame(object sendet, EventArgs args)
{
IAmActive = true;
}
public void DeactivateMyGame(object sendet, EventArgs args)
{
IAmActive = false;
}
}
每次游戏获得或失去焦点时,都会调用方法ActivateMyGame
和DeactivateMyGame
。属性IAmActive
默认为false,这与IsActive
不同,我使用过游戏。IsActive
我自己和我没有任何问题。很可能问题是外部的。您可以显示图片吗?(或.gif记录)关于如何复制它?我已按要求添加了屏幕截图。真奇怪,我一直试图用XNA在我自己的游戏中复制它,但无法实时检查值。虽然每次都会命中游戏.isactive
。最终可能会有帮助的是,带来一个if语句,只检查游戏.isactive
为false(或!game.isactive=true
。如果您想使用暂停功能。我还在Update()
语句的顶部定义了!game.isactive
。游戏总是以isactive=true开始(框架缺陷)。当您在两个窗口之间切换时,是否会出现这种情况?谢谢您的评论。这实际上可能是问题所在。我只是在应用程序启动后的一开始就遇到了问题。一旦我在两个窗口之间切换,这种情况就不会再发生。有没有办法强制“刷新”关于iActive属性?你能更详细地解释一下吗?你说的“窗口启动的额外焦点”是什么意思?我如何订阅“Game.Activated”?谢谢!如果我理解你的意思是正确的,那么你的问题是,你的游戏可以开始,而不需要站在用户的前面和焦点。如果你以某种形式运行,你可以执行“BringToFront();”来强制执行此操作。在此之后,你的IsActive属性是正确的。如果你没有处理事件,你应该阅读以下内容:谢谢你的回答,但不幸的是“事件”-方法也不起作用。这个问题很容易重现:如果在双击可执行文件后,但在窗口实际打开之前(或几秒钟内),将活动窗口从游戏窗口更改为活动窗口,则游戏窗口将被视为活动窗口(ActivateMyGame事件被触发)但实际上它不是活动窗口。强制游戏窗口处于活动状态会起作用,但我不使用窗体。如果不使用窗体,则可以使用win32 API:在将其置于属性“IsActive”之前“将正常工作。如果要确保在窗口位于最前面之前不会发生任何事情,则必须创建自己的活动标志,如示例所示。