使用向量在XNA / C#中移动精灵


9

我目前正在研究使用C#语言开发XNA游戏。

我有两个类:主游戏处理程序和“ sprite”类。以下是一些基本的伪代码,我希望可以充分描述问题。

Game.cs

class game {
  sprite the_sprite;
  void update(time) {
    var mouse = mouse.state
    if(mouse.clicked) { this.the_sprite.moveTo(mouse.x, mouse.y) }
    this.the_sprite.update(time)
    base.update(time)
  }
}

Sprite.cs

class sprite {
  vector2 location;
  vector2 move_to;
  void moveTo(x, y) { this.move_to = new vector2(x, y) }
  void update(time) {
    if(this.location.x > this.move_to.x /* (or less than) */) {
      // adjust location.x
    }
    if(this.location.y > this.move_to.y /* (or greater than) */) {
      // adjust location.y
    }
  }
}

基本上:当用户单击游戏窗口中的某个位置时,将获取鼠标的x和y坐标,并且游戏对象将在一段时间内移向该位置。

嗯...代码可以工作,但是很丑陋,对象不会直接朝对象移动(相反,它是对角线移动,然后是单轴移动)。我猜想我可以使用一些数学函数,但是老实说,我不知道从哪里开始。有什么建议么?


3
你好,客人。您正在寻找的是规范化。请阅读以下问题的答案:gamedev.stackexchange.com/questions/7540/…。一个提供您需要的代码,第二个解释它如何很好地工作。
Notabene 2011年

您好,我已经查看了链接,而这正是我所需要的。谢谢!
马特

Answers:


12

如果我正确理解了您的问题,则应该只将一个方向Vector2表示要在sprite类中移动的方向。像这样:

public Vector2 Direction { get; set; }

这是归一化的向量(这意味着它的长度为1),显示您要去的地方。

然后,添加一个Speed float属性,该属性说明精灵应该走多快。

public float Speed { get; set; }

您还需要添加一个UpdateSprite函数,那么为什么不将其放入Sprite类中呢?

public Update(GameTime gameTime)
{
   Position += Direction * Speed * gameTime.ElapsedGameTime.TotalSeconds;
}

这将更新精灵的位置以使其移动(您乘以增量秒,以便精灵在慢速计算机上也能正确移动)。

最后,您只需要像下面这样设置direction属性:

sprite.Direction = location - sprite.Position;
sprite.Direction.Normalize();

还要注意,如果sprite.Direction的长度(归一化之前)小于某个阈值,则说明您的精灵已经到达。
2011年

确实,我将要编辑我的帖子,但我想不会。如果您不想让精灵不断寻找目标,只需在其距离目标足够近的情况下将Direction设置为Vector2.Zero即可。
杰西·埃蒙德

很好的答案...,您还教会了我有关gameTime的使用(在较慢的计算机上以适当的速度移动精灵),所以两只鸟只一块一块地。我会将这个答案标记为已接受。
马特

:)顺便说一句,我个人喜欢将规范化放在我的Sprite类中(在我的update函数中),以防止不得不在类外不断进行规范化。您还应确保向量的长度不等于0,否则将获得除以0的异常。只需将Direction.LengthSquared()> 0标准化,然后将其标准化为安全(长度平方即可,这样就不必计算该昂贵的平方函数;))。
杰西·埃蒙德

可以说我们正在使用不具有标准化函数的其他IDE,那么标准化方程是什么?
惊吓

2

Google规范化...我对此也有些不知所措,但是我敢肯定,这将有助于解决您的问题。我相信其他人可以阐述或反驳我的回答

编辑:我可以更好地回答这个,道歉

我个人总是看这篇博客文章来解决这些类型的问题:http : //blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/

它从头开始,与游戏开发有关。


3
您是对的,这是归一化。但是最好总是尝试在先前的问题中找到好的答案。而且,如果您要回答问题,则最好不多解释或共享代码或任何您认为有用的内容,而不仅仅是指向Google。
Notabene 2011年

我应该发表评论,你是对的。
道格拉斯·雷
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.