C# - unzugänglich ist aufgrund seiner Schutzstufe
Ich kann nicht herausfinden, warum dies der Fall ist. Ich erstelle eine View-Klasse von der Klasse Spiel und dann bin ich versucht, rufen Sie eine Methode aus der Ansicht im Spiel und senden Sie das gesamte Spiel-Objekt als parameter. Wenn ich einzelne Variablen als parameter, dann ist es Arbeit ist kein problem, aber ich wollte das ganze Spiel Objekts, so dass nur eine Sache würde weitergeleitet werden.
Klasse Spiel
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);
}
}
}
View-Klasse
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);
}
}
}
}
Grundsätzlich bekomme ich die Fehlermeldung für jedes mal, wenn ich versuchen und verwenden Sie etwas, das gekommen ist aus dem Spiel.
Tut übergabe durch Referenz helfen?
InformationsquelleAutor RichardG | 2011-10-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem hier ist, dass alle Mitglieder innerhalb von
Game
gekennzeichnet sind, alsprotected
oder nicht markiert, die standardmäßigprivate
. Dies bedeutet, dass nurGame
und alle Klassen, die daraus hervorgehen, wird der Zugriff auf dieseprotected
Mitglieder und niemand anderes zuprivate
. Der TypView
ist eine völlig separate Art und kann daher nicht auf die Mitglieder, dieprotected
oderprivate
.Setzen Sie das
private
Felder, die Sie brauchen zu sein markiert alsinternal
oderpublic
.Meisten dieser Mitglieder sind auch mit der Bezeichnung als
override
damit Sie gesperrt sind inprotected
. Aber Sie können ein anderesnon-protected
Mitglied zu nennen, in derprotected
. Es ist nicht klar, aus der Probe, wenn Sie wollen auf diese Methoden oder nicht.InformationsquelleAutor JaredPar
All dies ist implizit
private
:Würden Sie diese ändern müssen, um
public
, das ist eine schlechte Idee für member-Variablen. Oder Sie können Eigenschaften erstellen, um den Zugriff auf die member-Variablen:Wenn du gehst, das zu tun, dann erwägen, eliding das Feld sichern.
public SpriteBatch SpriteBatch { get; set; }
ist kürzer und einfacher werden, damit sich die compiler machen das Sicherungsfeld für Sie.InformationsquelleAutor Yuck
Standardmäßig in C# alle Felder, die nicht die Barrierefreiheit explizit definiert sind, angenommen zu werden private. Also, werden Sie brauchen, um die folgenden in Ihrem
Game
Klasse:Zweiten, es ist erwähnenswert, dass alle Ihre
Game
Klasse die Methoden habenprotected
Zugänglichkeit, was bedeutet, dass nur Klassen, die Erben vonGame
wird in der Lage sein, diese Methoden.InformationsquelleAutor Brian Driscoll