XNA Vector2路径包含在矩形内

时间:2012-04-15 21:36:44

标签: xna-4.0 vectormath

您好我是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;
    }

1 个答案:

答案 0 :(得分:1)

  1. 您也需要初始位置,而不仅仅是方向
  2. 也许你需要更多分辨率
  3. ¿什么?删除“虚假”评估
  4. 下一个pos的计算有点复杂

  5.  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;
    }
    

    这会改善您的代码,但可能会让您感到虚伪......这取决于您想要做什么......

    你可能会发现有趣的bresenham线算法http://en.wikipedia.org/wiki/Bresenham's_line_algorithm

    你应该意识到你没有进行体积碰撞而是发生线碰撞,如果船只或角色或任何位于源位置的东西可能你必须添加更多的计算