视口
您首先创建相机视口。在 2D 游戏的情况下,它可以像定义要开始渲染的左下角位置一样简单,并在您的情况下使用屏幕分辨率扩展它800x600
。
Rectangle viewportRect = new Rectangle(viewportX, viewportY, screenWidth, screenHeight);
这是一个示例,如果您的相机被偏移,它会是什么样子300,700
(该图非常近似,只是为了给您一个更好的主意)

能见度检查
现在,您要查找与 相交的每个精灵,red square
可以理解为您的Viewport
. 这可以用类似的东西来完成(这是未经测试的代码,只是它可能看起来的示例)
List<GameObject> objectsToBeRendered = new List<GameObject>();
foreach(GameObject obj in allGameObjects)
{
Rectangle objectBounds = new Rectangle(obj.X, obj.Y, obj.Width, obj.Height);
if(viewportRect.IntersectsWith(objectBounds))
{
objectsToBeRendered.Add(obj);
}
}
这是它在图形上的样子,绿色精灵是添加到objectsToBeRendered
. 如果您想在渲染它们之前对它们Back
进行排序,将对象添加到单独的列表中会很容易!Front

渲染
现在我们已经找到了哪些对象相交,我们需要弄清楚屏幕上的哪个位置会结束。
spriteBatch.Begin();
foreach(GameObject obj in objectsToBeRendered)
{
Vector2 pos = new Vector2(obj.X - viewportX, obj.Y - viewportY);
spriteBatch.Draw(obj.GetTexture(), pos, Color.White);
}
spriteBatch.End();
如您所见,我们推导出视口的X
和Y
位置以将对象的世界位置带入Screen Coordinates
视口内。这意味着在给定我们这里的视口的情况下,可能位于的小方块将在屏幕上400, 800
呈现World Coordinates
。100, 100
编辑:
虽然我同意“正确答案”的更改,但请记住,我在此处发布的内容在决定要处理哪些动画、要更新哪些 AI 等时仍然非常有用……让相机和 GPU 单独工作阻止您知道哪些对象实际上在屏幕上!