Получить значения от объекта через класс - PullRequest
0 голосов
/ 04 марта 2012
public class BlockType
{
     public static BlockType Dirt_Block = new Block("Blah! values here");
}

public  struct Block
{
    public static string Value;

    public Block(string value)
    {
        value = value;
    }
}

Есть ли способ получить значение из DirtBlock?BlockType.Dirt_Block.Value Dosent работает, я не уверен, если это возможно, если нет каких-либо способов получить тот же результат?(Theres больше значений, но я сократил его для размера) Кстати, я доступ к BlockType.Dirt.value из другого класса.Я только хочу получить одно значение из этого, хотя

Ответы [ 4 ]

2 голосов
/ 04 марта 2012

Это потому, что Dirt_Block это BlockType, а не Block. На самом деле, я не ожидал бы, что этот код скомпилируется, поскольку нет способа конвертировать Block в BlockType.

Я не совсем уверен, что вы ищете, но, похоже, у вас есть набор типов блоков, которые подходят для перечисления:

public enum BlockType
{
   Dirt,
   Wood,
   Metal
}

и у вас есть коллекция блоков, каждый из которых имеет тип блока:

public class Block
{
   public BlockType Type { get; set; }
}

Здесь мы используем общедоступное свойство auto. Вам следует избегать использования открытых полей (без методов получения или установки).

Теперь, чтобы создать новый Block, вы можете использовать инициализацию объекта:

var block = new Block { Type = BlockType.Metal };

Кроме того, вы можете создать конструктор Block, который принимает параметр BlockType.

1 голос
/ 05 марта 2012

Другой способ добиться этого.

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

Строгий ООП с виртуальными методами и интенсивным наследованием не очень хорошая идея для игры, которая может нуждаться в оптимизации, чтобы нормально работать.

Конечно, это можно улучшить или сделать другим способом. ;)

public struct BlockProperty
{
    public Texture2D Texture;
    public string Name;
}

public class BlockProperties
{
    static readonly List<BlockProperty> Blocks;
    public static readonly BlockProperty Dirt;
    public static readonly BlockProperty Grass;
    public static readonly BlockProperty Wall;

    static BlockProperties( )
    {
        ContentManager Content = Game1.Instance.Content;

        Blocks = new List<BlockProperty>( ) 
        { 
            (Dirt = new BlockProperty( ) { Name = "Dirt", Texture = Content.Load<Texture2D>( "textures/dirt" ) }),
            (Grass = new BlockProperty( ) { Name = "Grass", Texture = Content.Load<Texture2D>( "textures/grass" ) }),
            (Wall = new BlockProperty( ) { Name = "Wall", Texture = Content.Load<Texture2D>( "textures/wall" ) }),
        };
    }

    public static BlockProperty ByName( string name )
    {
        return Blocks.FirstOrDefault( b => b.Name == name );
    }
}


public class Block
{
    public BlockProperty BlockType;
    pulic Vector2 Position;

    public Block( BlockProperty block )
    {
        this.BlockType = block;
    }

     public Block( string block )
    {
        this.BlockType = BlockProperties.ByName(block);
    }
}


public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;

    public static Game1 Instance { get; private set; }

    Block Block;

    public Game1( )
    {
        Instance = this;

        graphics = new GraphicsDeviceManager( this );
    }

    protected override void LoadContent( )
    {
        Block = new Block("Dirt") { Position = new Vector2(100,100) };
    }
}
0 голосов
/ 04 марта 2012

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

0 голосов
/ 04 марта 2012

Предполагая , вы подразумеваете, что Dirt_Block имеет тип Block - ваше поле Block Value является статическим - это означает, что оно связано с типом Block, а не с каким-либо конкретным экземпляром.Сделайте это открытым полем (или свойством), и ваш доступ будет работать:

public class BlockType
{
     public static Block Dirt_Block = new Block("Blah! values here");
}

public struct Block
{
  public string Value;

  public Block(string value)
  {
    value = value;
  }
}

Также, если нет особой причины, по которой вы собираетесь использовать struct, я бы предложил сделать Block классом.и выставить ценность как публичную собственность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...