2013-05-26 4 views
1

В моей игре у меня есть класс Ai, который в основном является связанным списком всех ai в моей игре. этот же класс содержит текстуры по умолчанию для каждого ai, и все отдельные классы моего ai наследуют от этого класса, таким образом, все они могут наследовать текстуры по умолчанию, которые уже были загружены классом ai. Однако, похоже, у меня проблемы с этим. Моя игра никогда не загружает gui при запуске, и через отладку кажется, что в игре есть проблемы с текстурами, которые я передаю. Вы не можете загрузить одну текстуру и передать ту же самую текстуру для использования другого объекта?Xna - Объекты, имеющие одну и ту же текстуру

AI Класс:

class AIs 
{ 
    private GraphicsDevice graphics; 
    private ContentManager content; 
    private SpriteBatch spriteBatch; 
    private LinkedList<object> ais; 
    private LinkNode<object> current; 

    //Default Textures 
    private Texture2D robotTexture 

    // Default Color Datas 
    private Color[] robotColorData; 

    public AIs() 
    { 
    } 

    public void Load(ContentManager content, GraphicsDevice graphics, SpriteBatch spriteBatch) 
    { 
     this.spriteBatch = spriteBatch; 
     this.graphics = graphics; 
     this.content = content; 

     // Loading Default Textures 
     robotTexture = content.Load<Texture2D>("robot"); 

     // Loading Default Color Data 
     robotColorData = new Color[robotTexture.Width * robotTexture.Height]; 
     robotTexture.GetData(robotColorData); 
    } 

    public void Update() 
    { 
     current = ais.getHead(); 

     while (current.getNext() != null) 
     { 
      if (current.getData() is Robot) 
      { 
       ((Robot)current.getData()).Update(); 
      } 
     } 
    } 

    public void Draw() 
    { 
     current = ais.getHead(); 

     while (current.getNext() != null) 
     { 
      if (current.getData() is Robot) 
      { 
       ((Robot)current.getData()).Draw(); 
      } 
     } 
    } 

    public addRobot(float spawnX, float spawnY) 
    { 
     Robot temp = new Robot(spawnX, spawnY); 
     temp.Load(content, graphics, spriteBatch); 
     ais.add(temp); 
    } 

    public Texture2D getRobotTexture() 
    { 
     return robotTexture; 
    } 

    public Color[] getRobotColorData() 
    { 
     return robotColorData; 
    } 
} 

Robot Класс:

class Robot : AIs 
{ 
    private GraphicsDevice graphics; 
    private ContentManager content; 
    private SpriteBatch spriteBatch; 
    private Texture2D robotTexture; 
    private Color[] robotColorData; 
    private Rectangle robotRectangle; 
    private Vector2 robotPosition = Vector2.Zero; 

    public Robot(float spawnX, float spawnY) 
    { 
     robotPosition = new Vector2(spawnX, spawnY); 
    } 

    new public void Load(ContentManager content, GraphicsDevice graphics, SpriteBatch spriteBatch) 
    { 
     this.spriteBatch = spriteBatch; 
     this.graphics = graphics; 
     this.content = content; 
     robotTexture = getRobotTexture(); 
     robotColorData = getRobotColorData(); 
    } 

    new public void Update() 
    { 
     robotRectangle = new Rectangle((int)robotPosition.X, (int)robotPosition.Y, robotTexture.Width, robotTexture.Height); 

    } 

    new public void Draw() 
    { 
     spriteBatch.Draw(robotTexture, robotPosition, Color.White); 
    } 
} 
+0

Да, одна и та же текстура может использоваться для нескольких объектов. Можете ли вы опубликовать код, относящийся к вашей проблеме? Это обеспечило бы более глубокое понимание, чтобы люди могли вам помочь. – jgallant

+0

Я бы, но я немного волновался и какой код мне следует показывать. – user2375782

+0

Я сделаю что-то близкое к нему, я думаю, я выложу это, когда закончу это. – user2375782

ответ

0

Оказывается, все, что вам нужно сделать, это добавить ключевое слово "статический" рядом с данными текстуры и цвета. Если статический не ставится, то, когда класс будет создан, он наследует методы и переменные, но переменные будут новыми, null, потому что это новый экземпляр класса. Таким образом, статичность рядом с ним делает значение неизменным для всех экземпляров.

В классе AI:

//Default Textures 
private static Texture2D robotTexture 

// Default Color Datas 
private static Color[] robotColorData; 
0

Кажется, проблема здесь в вашем использовании наследования.

Что происходит, так это то, что вы запускаете роботы Load-method, который извлекает robotTexture из себя через AI getRobotTexture-method. Этот метод просто возвращает robotTexture, поэтому вы можете написать robotTexture = robotTexture.

Но поскольку этот экземпляр не запускался AIs.Load, robotTexture имеет значение NULL.

Быть грубым честным; Прочитайте о наследовании!

Для удобства использования;

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

public class RobotManager 
{ 
    private SpriteBatch spriteBatch; 
    private Texture2D robotTexture; 

    private List<Robot> robots; 

    public RobotManager(SpriteBatch spriteBatch, Texture2D texture) 
    { 
     this.spriteBatch = spriteBatch; 
     this.robotTexture = texture; 

     robots = new List<Robot>(); 
    } 

    public void Update() 
    { 
     foreach (var robot in robots) 
      robot.Update(); 
    } 

    public void Draw() 
    { 
     foreach (var robot in robots) 
      robot.Draw(); 
    } 

    public void AddRobot(Vector2 position, Texture2D customTexture = null) 
    { 
     //Creates a new robot with position set and custom texture if specified 
     var newRobot = new Robot(spriteBatch, position, (customTexture == null) ? robotTexture : customTexture); 
     robots.Add(newRobot); 
    } 

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