2017-11-16 9 views
3

私は最近、時にはと気付きました。XNAプロパティGame.IsActiveはゲームウィンドウの状態を常に正確に反映しているとは限りません。XNAプロパティGame.IsActiveが機能していません

さらに具体的には、ゲームウィンドウが明らかにアクティブでない場合でも(たとえば、上部のウィンドウバーが非アクティブとして表示されている場合など)、Game.IsActive = trueです。アクティブなFirefoxウィンドウでゲームウィンドウを少しオーバーラップさせてこの動作を再現することができます。

ここで問題が発生する可能性がありますか?

要求されたように、この絵は、問題を示しています enter image description here

ゲームウィンドウがバックグラウンドで動作している、(スタックオーバーフローを示す)ブラウザがフォアグラウンド(アクティブ)であり、まだ不動産Game.IsActiveがありますtrue(すべてのUpdate()で書き出されているビジュアルスタジオの出力(マゼンタの円)を参照してください。

XNAクラスの静的リファレンスを作成すると問題が発生する可能性がありますゲーム私のコアゲームクラスとそれを使用?

+0

私は自分自身で 'Game.IsActive'を使用しましたが、私はこれに何ら問題はありませんでした。その問題は外部にある可能性があります。あなたは写真を見せることができますか? (または.gifレコード)を再現する方法について教えてください。 – Steven

+0

私はスクリーンショットを要求通りに追加しました。 –

+0

本当に奇妙なことに、私はXNAで自分のゲームでそれを再現しようとしていましたが、リアルタイムで値をチェックすることはできません。毎回 'Game.isactive'にヒットしますが。最終的には、 'Game.isactive'がfalseのときだけチェックするifステートメント(または'!game.isactive = true')をもたらすことが最終的に役立つかもしれません。休止関数を使用する場合は、 – Steven

答えて

1

コメントで述べたように、IsActive -Propertyには弱点があります。

イベントGame.ActivatedGame.Deactivatedを購読する必要があります。起動時にウィンドウに焦点を合わせると、うまくいくはずです。

IMHO:IsActiveのような「マジック」プロパティが嫌いです。イベントは...はるかに正確で

例:ゲーム取得またはActivateMyGameDeactivateMyGameが呼び出されるメソッドを集中失い

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

毎回。プロパティIAmActiveはデフォルトではfalseです。これはIsActiveとの違いです。

+0

もう少し詳しく説明できますか?「ウィンドウの起動に重点を置く」とはどういう意味ですか?「Game.Activated」に登録するにはどうすればいいですか?ありがとう! –

+1

あなたが正しいと理解していれば、そのあなたrゲームは、ユーザーの前にいなくても開始することができます。 フォームで実行している場合は、 'BringToFront();'を実行できます。これを強制する。この後、あなたのIsActiveプロパティは正しいです。 – kara

+1

イベントを扱っていない場合は、https://docs.microsoft.comを参照してください。com/en-us/dotnet/standard/events/ – kara

関連する問題