我已经创建了两个类来替换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
变量(我不确定这是否是设置它们的方法,如果它不是't}请告诉我)这些类用于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()
错误。
我也尝试使用new关键字,它给了我:
Xnagame.Player.CreatePlayer()
是一种方法,但用作类型。
答案 0 :(得分:2)
您的CreatePlayer
方法是实例方法 - 换句话说,它必须在现有实例上调用。你可能想把它变成静态的:
public static Player CreatePlayer()
然后你应该删除Position = new Player.int2()
行 - 创建一个玩家不应该改变现有玩家的位置。
(我还强烈建议将嵌套类型提取为不可变的顶级结构,并将它们重命名为Int32Position
和SinglePosition
- 尽管您可能会发现框架已经有类似的东西了。您还应该使所有属性都遵循.NET命名约定。)
答案 1 :(得分:1)
您需要使用静态函数直接从类
这样的类调用public static Player CreatePlayer()
{
//all the code
}
答案 2 :(得分: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;
}
}