2011-10-26 9 views
3

なぜこのような場合がわかりません。私はGameクラスからViewクラスを作成しています。そして、View in Gameからメソッドを呼び出して、ゲームオブジェクト全体をパラメータとして送信しようとしています。パラメータとして単一の変数を送信すると問題はありませんが、Gameオブジェクト全体を送信して、1つのものしか渡されないようにしたいと考えていました。C# - 保護レベルのためにアクセスできない

ゲームクラス

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; 

namespace Airfield 
{ 
    public class Game : Microsoft.Xna.Framework.Game 
    { 
     // Device Objects 
     GraphicsDevice device = null; 
     GraphicsDeviceManager graphics = null; 
     MouseState mouse; 

     // Game Objects 
     SpriteBatch spriteBatch; 
     Texture2D b = null; 
     View view = null; 

     // Arrays 
     Buoy [] buoy = new Buoy[3]; 
     Plane [] plane = new Plane[3]; 

     // Variables 
     bool selected = false; 
     int index = 0; 

     public Game() 
     { 
      graphics = new GraphicsDeviceManager(this); 
     } 

     protected override void Initialize() 
     { 
      Content.RootDirectory = "Content"; 
      this.IsMouseVisible = true; 
      graphics.PreferredBackBufferWidth = 800; 
      graphics.PreferredBackBufferHeight = 600; 
      graphics.ApplyChanges(); 
      base.Initialize(); 

      view = new View(); 

      for (index = 0; index < buoy.Length; index++) 
      { 
       buoy[index] = new Buoy(); 
       plane[index] = buoy[index].CreatePlane(); 
      } 
     } 

     protected override void LoadContent() 
     { 
      device = graphics.GraphicsDevice; 
      spriteBatch = new SpriteBatch(device); 
      b = Content.Load<Texture2D>("buoy"); 
     } 

     protected override void UnloadContent() 
     { 

     } 

     protected override void Update(GameTime gameTime) 
     { 
      base.Update(gameTime); 

      mouse = Mouse.GetState(); 

      if (selected == true || mouse.X >= buoy[0].position.X - 3 && mouse.X <= buoy[0].position.X + 19 && mouse.Y >= buoy[0].position.Y - 3 && mouse.Y <= buoy[0].position.Y + 19) 
      { 
       if (mouse.LeftButton == ButtonState.Pressed) 
       { 
        selected = true; 
        buoy[0].position= new Vector2(mouse.X - 8, mouse.Y - 8); 
       } 

       else 
       { 
        selected = false; 
       } 
      } 
     } 

     protected override void Draw(GameTime gameTime) 
     { 
      base.Draw(gameTime); 
      view.DrawScreen(this); 
     } 
    } 
} 

ビュークラス

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
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; 

namespace Airfield 
{ 
    class View 
    { 
     public View() 
     { 

     } 

     public void DrawScreen(Game game) 
     { 
      game.device.Clear(Color.CornflowerBlue); 

      game.spriteBatch.Begin(); 
      DrawBuoys(game); 
      game.spriteBatch.End(); 
     } 

     public void DrawBuoys(Game game) 
     { 
      for (int x = 0; x < game.buoy.Length; x++) 
      { 
       game.buoy[x].DrawBuoy(game.spriteBatch, game.b); 
      } 
     } 
    } 
} 

基本的に私は私がしようとすると、ゲームから来ているものを使用するたびのエラーを取得します。

+0

参考にして渡しますか? – Tim

答えて

5

問題はGameの内部メンバーの全てがprotectedとしてマークまたはprivateにすべてがデフォルトでマークされていないということです。これは、Gameとそれから派生したクラスだけがprotectedのメンバーにアクセスでき、他の誰もprivateにアクセスできないことを意味します。タイプViewは完全に別のタイプであるため、protectedまたはprivateのメンバーにはアクセスできません。

フィールドを公開するには、internalまたはpublicとマークする必要があります。

public class Game : Microsoft.Xna.Framework.Game 
{ 
    ... 
    public SpriteBatch spriteBatch; 
} 

これらのメンバーのほとんどはまた、overrideので、あなたがprotectedにロックされているとしてラベル付けされています。しかし、別のnon-protectedのメンバーを使ってprotectedに電話をかけることができます。これらのメソッドを呼び出すかどうかは、サンプルからはわかりません。

2

このすべてが暗黙のうちにprivateです:

// Device Objects 
GraphicsDevice device = null; 
GraphicsDeviceManager graphics = null; 
MouseState mouse; 

// Game Objects 
SpriteBatch spriteBatch; 
Texture2D b = null; 
View view = null; 

// Arrays 
Buoy [] buoy = new Buoy[3]; 
Plane [] plane = new Plane[3]; 

// Variables 
bool selected = false; 
int index = 0; 

あなたはメンバ変数のための悪い考えである、publicにそれらを変更する必要があると思います。それとも、メンバ変数にアクセスするためのプロパティを作成することができます:ここ

public SpriteBatch SpriteBatch { 
    get { return this.spriteBatch; } 
    protected set { this.spriteBatch = value; } 
} 
+0

基本的には、これらの変数は公開されておらず、そのような変数にアクセスしようとしています。 – Yatrix

+1

あなたがそれをやるつもりなら、バッキングフィールドを削除することを検討してください。 'public SpriteBatch SpriteBatch {get;セット; } '短くて簡単です。コンパイラがあなたのためにバッキングフィールドを作るようにしてください。 –

0

デフォルトでは、C#でアクセシビリティが明示的に定義されていないフィールドはすべてプライベートであるとみなされます。だから、あなたはあなたのGameクラスで次の操作を実行する必要があります。

// Device Objects 
    public GraphicsDevice device = null; 
    public GraphicsDeviceManager graphics = null; 
    public MouseState mouse; 

    // etc... for your other fields 

第二に、それはあなたのGameクラスのメソッドのすべてがGameから継承するクラスだけのことができるようになることを意味しprotectedアクセスを、持っていることは注目に値しますそれらのメソッドを呼び出します。

関連する問題