2

これは、次を含む変数を取得するために使用しているコードですscreenHeight

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    Ball pall;
    MinuPad playerPad;
    public int screenWidth;
    public int screenHeight;

    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";

    }

    protected override void Initialize()
    {
        screenWidth = GraphicsDevice.Viewport.Width;
        screenHeight = GraphicsDevice.Viewport.Height;

しかし、異なるクラスで変数を使用することはできません。たとえば、 とBall.csに関する情報も使用する必要があるというクラスがscreenWidthありscreenHeightます。

同じものを使用しようとすると、次のようGraphicsDevice.Viewport.Widthになります。

An object reference is required for the non-static field, method, or property 
'Microsoft.Xna.Framework.Graphics.GraphicsDevice.Viewport.get'

私の質問:GraphicsDevice.Viewport他のクラスで使用できないのはなぜですか? 問題を解決するにはどうすればよいですか?

4

3 に答える 3

3

アクセスできない理由は、Ball クラスのインスタンスが単にビューポートを認識していないためです。これはいくつかのオプションで修正できます。主なものViewportは、ボールのコンストラクターに を渡すことです。たとえば、次のようになります。

public class Ball
{

    Viewport viewport;

    // ... 

    public Ball(int stuff, Viewport viewport)
    {
         this.viewport = viewport;

         // ...
    }
}

Game1次の行に沿って、クラス内にボールのインスタンスを作成します。

Ball ball = new Ball(42, GraphicsDevice.Viewport);

viewport.Heightその後、 Ball.cs 内から簡単に実行できます。

どこでも高さ/幅を使用できるように、よりグローバルなものが必要な場合は、Game1 ( public static Viewport)で静的ビューポートを作成Viewportし、Initialise()/LoadContent()メソッドで設定できます。でこれにアクセスしGame1.Viewportます。個人的には、「ハッカーっぽい」ように見えるので、この方法は好きではありませんが、仕事は完了します..そうは言っても、私は通常、ゲームクラスに静的なランダムクラスを持っています:)!

于 2012-09-22T23:26:12.010 に答える
0

私はC#に100%精通しているわけではありませんが、上部にインポートステートメントがないようです。

次の行を含めてみてください。

using Microsoft.Xna.Framework.Graphics

...の上部にありBall.csます。

メインファイルをチェックすると、ファイルの先頭にその行(および同様の行)が表示されると思います。

のドキュメントを確認すると、名前空間GraphicsDeviceに存在することがわかります。Microsoft.Xna.Framework.Graphics

于 2012-09-22T22:32:26.843 に答える
0

私は XNA に詳しくありませんが、それGraphicsDeviceは base class のメンバーだと思いMicrosoft.Xna.Framework.Gameます。から派生していないクラスからはアクセスできませんGame

繰り返しますが、XNA には詳しくありませんが、Ballクラスがクラスのインスタンスにアクセスできる場合は、フィールドGame1にアクセスできるはずです。screenWidth

public class Ball
{
    Game1 _game;
    public Ball(Game1 game){_game = game;}
    private void UseScreenWidth(){
        // Do something with _game.screenWidth;
    }
}
于 2012-09-22T23:16:39.767 に答える