数学帮助 - 调整摄像机中心以使图形保持在屏幕上

时间:2014-06-14 14:47:53

标签: math geometry

要么我的咖啡还没有开始,或者我在大学时没有给予足够的重视,无论哪种方式,我都无法绕着正确的方式进行计算。

我有一个由区域组成的迷宫,玩家一次只能看到一个区域。目前相机保持在播放器的中心位置,因此当它们接近区域的边缘时,我们看到每一个不断膨胀的黑色,因为那里什么都没有。当玩家接近区域的调整时,我希望相机的中心保持静止。

这是我到目前为止的代码:

private void ResetRenderView()
{
    // Make sure this control always fills the parent
    this.Size = this.Parent.Size;

    //Calculate and correct CellSize so the screen can always be filled
    int zoneSize = DM.currentDungeon.Settings.ZoneSize;
    float minCellSize = (float)this.Size.Width / (float)zoneSize;
    if (cellSize < minCellSize + .5f) { cellSize = minCellSize + .5f; }

    //Calculate Center Point (usually on Player except when close to the edge)
    Vector2f center = new Vector2f(PlayerLocation.X * cellSize, PlayerLocation.Y * cellSize);
    /**** NEED HELP HERE ****/
    if (center.X < (this.Size.Width / 2) - ((zoneSize * cellSize) / 2)) { center.X = ((zoneSize * cellSize) / 2); }
    renderwindow.SetView(new SFML.Graphics.View(center, new Vector2f(this.Size.Width, this.Size.Height)));
}

我相信解决这个问题所需的一切如上所示:

cellSize是每个单元格的像素大小

zoneSize是每个区域中的单元格数(宽度和高度)

this.Size会返回可见像素

cellSize * zoneSize将返回区域使用的总像素数(宽度和高度)。

目前有一个if语句用于调整一个部分center.X,我计划再做3个。但我无法让那个人工作。我尝试过几件事。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

咖啡开了。这就是我的工作:

    float totalSize = zoneSize * cellSize;
    if (center.X > totalSize - (this.Size.Width / 2))
    {
        center.X = totalSize - (this.Size.Width / 2);
    }
    if (center.X < this.Size.Width / 2)
    {
        center.X = this.Size.Width / 2;
    }
    if (center.Y > totalSize - (this.Size.Height / 2))
    {
        center.Y = totalSize - (this.Size.Height / 2);
    }
    if (center.Y < this.Size.Height / 2)
    {
        center.Y = this.Size.Height / 2;
    }

如果有人可以发布更好的答案(更少if语句,更优雅等等),那不仅仅是对上述代码的重写,在接下来的几天里,我会很乐意将其标记为答案。