您好,我是XNA的新手,并试图开发一个游戏原型,其中角色使用鼠标单击从一个位置移动到另一个位置。
我有一个代表当前位置的矩形。我使用玩家鼠标输入将目标位置作为 Vector2。我通过 Vector2 减法将方向向量从源提取到目标。
//the cursor's coordinates should be the center of the target position
float x = mouseState.X - this.position.Width / 2;
float y = mouseState.Y - this.position.Height / 2;
Vector2 targetVector = new Vector2(x, y);
Vector2 dir = (targetVector - this.Center); //vector from source center to target
//center
我使用平铺地图表示世界,每个单元格都是 32x32 像素。
int tileMap[,];
我想做的是检查上面的方向矢量是否穿过地图上的任何蓝色图块。蓝色图块在地图上等于 1。
我不知道该怎么做。我想过使用线性线方程和三角公式,但我发现很难实现。我尝试规范化矢量并乘以 32 以获得沿矢量路径的 32 像素长度间隔,但它似乎不起作用。谁能告诉我它是否有任何问题,或者解决这个问题的另一种方法?谢谢
//collision with blue wall. Returns point of impact
private bool CheckCollisionWithBlue(Vector2 dir)
{
int num = Worldmap.size; //32
int i = 0;
int intervals = (int)(dir.Length() / num + 1); //the number of 32-pixel length
//inervals on the vector, with an edge
Vector2 unit = Vector2.Normalize(dir) * num; //a vector of length 32 in the same
//direction as dir.
Vector2 v = unit;
while (i <= intervals & false)
{
int x = (int)(v.X / num);
int y = (int)(v.Y / num);
int type = Worldmap.getType(y, x);
if (type == 1) //blue tile
{
return true;
}
else
{
i++;
v = unit * i;
}
}
return false;
}
- 您还需要初始位置,而不仅仅是方向
- 也许您需要更高的分辨率
- 什么?删除"错误"评估
- 下一个位置的计算有点复杂
private bool CheckCollisionWithBlue(Vector2 source, Vector2 dir)
{
int num = 8; // pixel blocks of 8
int i = 0;
int intervals = (int)(dir.Length() / num);
Vector2 step = Vector2.Normalize(dir)*num;
while (i <= intervals)
{
int x = (int)(source.X);
int y = (int)(source.Y);
int type = Worldmap.getType(y, x);
if (type == 1) //blue tile
{
return true;
}
else
{
i++;
source+=step;
}
}
return false;
}
这将改进您的代码,但可能是无辜的......这取决于你想做什么...
你也许可以找到有趣的布雷森汉姆线算法 http://en.wikipedia.org/wiki/Bresenham's_line_algorithm
你应该意识到你不是在做体积碰撞,而是在做线碰撞,如果船或角色或任何在源位置的东西,也许你必须添加更多的计算