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工作,我不确定这是否可行,如果没有任何方法可以获得相同的结果? (更多的值,但我缩短了它的大小)顺便说一下,我从另一个类访问BlockType.Dirt.value。我只希望从中得到一个值
答案 0 :(得分:2)
那是因为Dirt_Block
是BlockType
,而不是Block
。事实上,我不希望编译这个代码,因为无法将Block
转换为BlockType
。
我不太确定你追求的是什么,但听起来你有一系列适合枚举的块类型:
public enum BlockType
{
Dirt,
Wood,
Metal
}
你有一组块,每个块都有一个块类型:
public class Block
{
public BlockType Type { get; set; }
}
在这里,我们使用公共汽车财产。您应该避免使用公共字段(没有getter或setter)。
现在,要创建新的Block
,您可以使用对象初始化:
var block = new Block { Type = BlockType.Metal };
或者,您可以创建一个带有Block
参数的BlockType
构造函数。
答案 1 :(得分:1)
实现它的其他方式。
我认为这个方法提供了一种更简单的加载/保存图块地图的方法,并允许在需要时从文本中定义块属性。
对于可能需要优化才能运行良好的游戏,使用虚拟方法和密集继承的严格OOP不是一个好主意。
当然可以通过其他方式改进或完成。 ;)
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) };
}
}
答案 2 :(得分:0)
假设您的意思是Dirt_Block
属于Block
类型 - 您的阻止Value
字段是静态的 - 这意味着它与{{1}相关联} type,而不是任何特定的实例。将其设为公共字段(或属性),您的访问权限将起作用:
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
作为一个类,并将Value公开为公共财产。
答案 3 :(得分:0)
你的疑问不是很清楚......但我认为你想要的是这样......在块类上使用OOP范例。
public class BlockType
{
public virtual string Value;
public static BlockType Dirt = new Block("Blah! values here");
}
public class Block : BlockType
{
private string value;
public Block(string value)
{
this.value = value;
}
public string Value
{
get { return value; }
}
}
右?