0

这是我的第一个问题,几天前我才开始用 C# 编码,所以如果我在做一些愚蠢的事情,请善待。问题是,我想在 xna 中编写一个小型 2D 游戏,因此我创建了一个带有纹理的 32x32 px 盒子,它应该是玩家。我可以通过为玩家编写一个类来使用箭头键来移动玩家,例如

namespace MyGame
{
    class Player
    {
        public Texture2D Textur;
        public Vector2 Position { get; set; }
    }
}

然后使用

KeyboardState keyboard = Keyboard.GetState();
if (keyboard.IsKeyDown(Keys.Right)) player.Position += new Vector(5,0);
//and so on

其中 5 是像素数量,玩家一键移动。我正在尝试写这样的东西

class Player
{
    public Texture2D Textur;
    public Vector2 Position { get; set; }
    public Vector2 UpperRightCorner = new Vector2(Position.X + 32, Position.Y);
}

但显然它不起作用。甚至以为我在 msdn 上阅读了有关 get 的文档;放; 我真的不明白,它是如何工作的。我需要角落,或者更准确地说是角落旁边的像素,来编写碰撞方法。这种方法每次都应该问,当我按箭头键时,玩家面前有什么样的关卡,然后调整速度。如果有实心块(如墙),则将移动设置为 0。

任何想法,我怎么能在播放器类中写这个角落的东西?我可以在实例化播放器后在主类中调用它,但我更愿意将它放入播放器类中。

4

3 回答 3

2

它不会起作用,因为您的职位尚未创建..

在您的 Player 构造函数(public Player()例如)中,您必须将 Position 设置为new Vector2第一个。例如:

public Player()
{
    Position = new Vector2(0,0);
    UpperRightCorner = new Vector2(Position.X + 32, Position.Y);
}
于 2013-01-23T15:01:39.607 回答
1

您正在UpperRightCorner为其实例化时分配一个值。该值将保持不变。这可以用 getter 重写,以便在UpperRightCorner每次访问时重新计算。例子:

public Vector2 UpperRightCorner
{
    get
    {
        return new Vector2(Position.X + 32, Position.Y);
    }
}
于 2013-01-23T15:11:36.677 回答
1

Ginosaji 的回应应该能满足您的要求。稍作修改,它也可以自动处理您选择的任何尺寸纹理:

public Vector2 UpperRightCorner {
    get {
        return new Vector2(Position.X + Textur.Width, Position.Y);
    }
}
于 2013-01-25T21:19:52.330 回答