C# est inaccessible en raison de son niveau de protection
Je ne peux pas comprendre pourquoi cela est le cas. Je suis en création d'une Vue de classe de classe de Jeu et puis je suis en train d'appeler une méthode de Vue dans le Jeu et envoyer l'ensemble du jeu de l'objet en tant que paramètre. Si j'envoie des variables simples comme un paramètre, il le travail n'est pas un problème, mais j'ai voulu envoyer l'ensemble du Jeu de l'objet de sorte qu'une seule chose serait passé.
Classe de jeu
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);
}
}
}
Vue De La Classe
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);
}
}
}
}
Fondamentalement, je reçois le message d'erreur à chaque fois que j'essaie de l'utiliser quelque chose qui est venu de Jeu.
Ne passage par référence aider?
OriginalL'auteur RichardG | 2011-10-26
Vous devez vous connecter pour publier un commentaire.
Le problème ici est que tous les membres à l'intérieur de
Game
sont marqués commeprotected
ou pas marquées à tous qui, par défaut,private
. Cela signifie que seuls lesGame
et toutes les classes qui en découlent auront accès à cesprotected
membres et personne d'autre àprivate
. Le typeView
est un tout autre type et ne peut donc pas accéder à tout les membres qui sontprotected
ouprivate
.Pour exposer la
private
champs, ils doivent être marqués commeinternal
oupublic
.La plupart de ces membres sont également étiquetés comme
override
d'où vous êtes enfermé dansprotected
. Mais vous pouvez utiliser un autrenon-protected
membre d'appeler laprotected
. Il n'est pas clair à partir de l'échantillon si vous voulez vous prévaloir de ces méthodes ou non.OriginalL'auteur JaredPar
Tout cela est implicitement
private
:Vous auriez besoin de les changer pour
public
, ce qui est une mauvaise idée pour les variables de membre. Ou vous pouvez créer des propriétés d'accéder aux variables membres:Si vous allez faire cela, alors envisager de eliding le champ de stockage.
public SpriteBatch SpriteBatch { get; set; }
est plus court et plus facile; laisser le compilateur faire la sauvegarde de domaine pour vous.OriginalL'auteur Yuck
Par défaut en C# tous les champs qui n'ont pas l'accessibilité explicitement définies sont supposés être privé. Donc, vous devez effectuer les opérations suivantes dans votre
Game
classe:Deuxième, il est intéressant de noter que la totalité de votre
Game
classe de méthodes ontprotected
l'accessibilité, ce qui signifie que seules les classes qui héritent deGame
sera en mesure d'appeler ces méthodes.OriginalL'auteur Brian Driscoll