2014-12-23 2 views
0

Я создал два класса, которые замещают функцию Point (оба варианты) просто проверить их, это то, как я их создал:Подкласса инициализация члена

Entity.cs:

namespace Xnagame 
{ 

    class Player 
    { 

     public class float2 
     { 
      public float X { get; set; } 
      public float Y { get; set; } 
     } 
     public class int2 
     { 
      public int X { get; set; } 
      public int Y { get; set; } 
     } 
     public int2 Position { get; set; } 
     public int angle { get; set; } 
     public float speed { get; set; } 
     public float2 velocity { get; set; } 

     public Player CreatePlayer() 
     { 

      Position = new Player.int2(); 
      Player player = new Player(); 
      return player; 
     } 
    } 
} 

Как вы можете видеть, оба класса Point имеют переменную X и Y (я не уверен, что это способ их настройки, если это не рассказать мне), и эти классы используются в позиции и экземпляры скорости, которые создаются в методе CreatePlayer().

Game1.cs:

namespace Xnagame 
{ 
    public class Game1 : Microsoft.Xna.Framework.Game 
    { 
     GraphicsDeviceManager graphics; 
     SpriteBatch spriteBatch; 
     private Texture2D playerimage; 
     private Texture2D background; 
     Player player = Player.CreatePlayer(); 

Теперь проблема в том, что, когда CreatePlayer() метод пытается вернуть это «игрок» на местных игроков это дает:

Ссылка на объект требуется для нестатического поля, метода или свойства Xnagame.Player.CreatePlayer()

ошибка.

Я также пробовал с новым ключевым словом, и он дал мне:

Xnagame.Player.CreatePlayer() является метод, но используется как тип.

+0

http://msdn.microsoft.com/en-US/library/ms173115%28v=vs.80%29.aspx – BartoszKP

ответ

0

проблема заключается в том, что вы используете метод экземпляра для создания экземпляра ,

У вас есть два варианта:

1) Используйте конструктор по умолчанию

class Player 
{ 
    // Other subclasses, and properties. 

    public Player() 
    { 
     // Note: I added the other instance value just for fun. 
     Position = new Player.int2(); 
     velocity = new Player.float2(); 
    } 
} 

2) Используйте статический метод конструктора. (Они, как правило, используется только в singleton pattern.)

class Player 
{ 
    // Other subclasses, and properties. 

    public static Player CreatePlayer() 
    { 
     // Note how I created the instance variables for the player class, 
     // and I used a notation called "object initalizer" to set those properties 
     // when I create the Player instance. 
     var p = new Player.int2(); 
     var v = new Player.float2(); 
     Player player = new Player() 
     { 
      velocity = v, 
      Position = p 
     }; 
     return player; 
    } 
} 
+0

Я не могу выполнить ваше первое решение, поскольку, похоже, переменная не существует в этой области. Ваше второе решение дает мне nullreferenceexception в инициализации sub, где я пытаюсь установить player.position.X = 100; – Croccy

+0

Я только что проверил свой код; он работает так, как ожидалось. Если вы должны были скопировать и вставить мой код, как он стоит в вашем файле (и вы не изменили код примера из своего вопроса), он должен работать как ожидалось. – Cameron

+0

Хорошо, я сделал, как вы сказали, и я все еще получаю nullreferenceexception в моей инициализации sub, я начинаю думать, что это потому, что переменные-члены int2 и float2 не инициализируются? – Croccy

2

Ваш метод CreatePlayer является экземпляр метод - другими словами, он должен быть вызван на существующем экземпляре. Вы, вероятно, хотите, чтобы сделать его статическим:

public static Player CreatePlayer() 

Затем вы должны удалить Position = new Player.int2() линии - создание игрока не должно изменить местоположение существующего игрока, предположительно.

(Я также настоятельно рекомендую извлекать ваши вложенные типы быть неизменные Структуры верхнего уровня, и переименовав их к чему-то вроде Int32Position и SinglePosition. - хотя вы можете обнаружить, что структура имеет нечто подобное уже Вы должны также сделать все ваши свойства следуют соглашениям .NET именования.)

+0

Это дает мне nullreferenceexception в инициализации sub, где я пытаюсь установить player.position.X = 100; – Croccy

+0

@Croccy: Ну да, если вы придерживаетесь своего текущего типа позиции, являющегося классом, вам нужно будет инициализировать вновь созданного игрока. Однако я бы посоветовал вместо этого создать структуру и сделать ее неизменной. Я только попытался решить одну проблему в вашем вопросе, а также некоторые общие советы ... мы не будем проходить вас через каждую проблему, пока у вас не будет рабочего приложения. Вы должны попытаться решить следующую проблему самостоятельно, разместив при необходимости новый вопрос (* после * попробуйте себя). –

1

вы должны использовать статические функции прямого вызов из класса, как этого

public static Player CreatePlayer() 
{ 
    //all the code 
} 
+0

Это дает мне nullreferenceexception здесь: Player player = Player.CreatePlayer(); – Croccy

Смежные вопросы