让背景或相机根据角色位置“滚动”

2024-02-23

我正在开发一款具有自上而下视图的角色扮演游戏。我想将一张图片加载到角色正在行走的背景中,但到目前为止我还没有弄清楚如何正确地重绘背景以使其“滚动”。我发现的大多数示例都是自动滚动的。

我希望相机保持在角色中心,直到背景图像到达其边界,然后角色将移动,而无需在另一个位置重新绘制图像。


你的问题有点不清楚,但我想我明白了。让我们看看您的要求。

  1. 您有一个高架摄像机,可以直接俯视二维平面。我们可以将其表示为一个简单的 {x, y} 坐标对,对应于相机所观察的平面上的点。
  2. 摄像机可以跟踪某些物体的运动,可能是玩家,但更一般地说是游戏世界中的任何物体。
  3. 摄像机必须保持在游戏世界的有限范围内。

这很容易实现。从广义上讲,在你内心的某个地方Update()您需要执行以下步骤来满足每个要求:

if (cameraTarget != null)
{
    camera.Position = cameraTarget.Position;
    ClampCameraToWorldBounds();
}

换句话说:如果我们有一个目标物体,则将我们的位置锁定到它的位置;但要确保我们不会越界。

ClampCameraToBounds()实施起来也很简单。假设你有某个对象,world,其中包含一个Bounds表示世界范围(以像素为单位)的属性:

private void ClampCameraToWorldBounds()
{
    var screenWidth = graphicsDevice.PresentationParameters.BackBufferWidth;
    var screenHeight = graphicsDevice.PresentationParameters.BackBufferHeight;

    var minimumX = (screenWidth / 2);
    var minimumY = (screnHeight / 2);

    var maximumX = world.Bounds.Width - (screenWidth / 2);
    var maximumY = world.Bounds.Height - (screenHeight / 2);
    var maximumPos = new Vector2(maximumX, maximumY);

    camera.Position = Vector2.Clamp(camera.Position, minimumPos, maximumPos);
}

这可以确保相机与世界边缘的距离永远不会超过屏幕的一半。为什么是半屏?因为我们将相机的 {x, y} 定义为相机正在观察的点,这意味着它应始终位于屏幕中央。

这应该会给你一个具有你在问题中指定的行为的相机。从这里开始,只需实现地形渲染器,以便相对于相机对象指定的 {x, y} 坐标绘制背景。

给定一个对象在游戏世界坐标中的位置,我们可以将该位置转换为相机空间:

var worldPosition = new Vector2(x, y);
var cameraSpace = camera.Position - world.Postion;

然后从相机空间进入屏幕空间:

var screenSpaceX = (screenWidth / 2) - cameraSpace.X;
var screenSpaceY = (screenHeight / 2) - cameraSpace.Y;

然后,您可以使用对象的屏幕空间坐标来渲染它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让背景或相机根据角色位置“滚动” 的相关文章

  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • 在移动设备上滚动

    这个问题更多的是一个建议研究 我确实希望它对其他人有帮助 并且它不会关闭 因为我不太确定在哪里寻求有关此事的建议 在过去的 6 个月里 我一直在进行移动开发 我有机会处理各种设备上的各种情况和错误 最麻烦的是滚动问题 当涉及到在网站的多个区
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • MVC4 绑定列表中的下拉列表(错误)

    我在视图中有以下代码 索引 cshtml 绑定问题 第一个下拉列表根据 ChildItem 编辑器模板选择正确的值 使用内联下拉列表的第二个示例不起作用我不想创建一个编辑器模板只是为了显示下拉值 奇怪的是 TextBoxFor 将显示正确的
  • 在使用 CLI 创建的 MongoDB 分片集合中插入文档时出错

    使用最新的 azure cli 2 0 21 我尝试使用以下脚本 来自 powershell 在 CosmosDB 中创建分片 MongoDB 集合 resourceGroupName RG S01 APP CASRWA 001 name
  • 带有 uuid 字段的 Django 迁移生成重复值

    我有一个uuid字段 不是主键 生成的迁移是 from future import unicode literals from django db import migrations models import uuid class Mig
  • Lua中的反序列化

    我已经在lua中序列化了一个表 lua有没有反序列化它的函数 function dump o if type o table then local s for k v in pairs o do if type k number then
  • CherryPy:“error_page.default”与“error_page.404”配置设置之间有什么区别?

    假设我想显示我自己的 404 和 500 页面 到目前为止我发现了两种可能性 1 使用cherrypy config update def error page 404 status message traceback version re
  • 如何使用 CLI 添加模块到 Wildfly

    我正在尝试使用 postgres 数据源创建 Wildfly docker 映像 当我构建 dockerfile 时 当我尝试安装 postgres 模块时 它总是失败并显示 权限被拒绝 我的 dockerfile 看起来是这样的 FROM
  • 将注册表项加载到 wso2 属性中介器中

    我当前正在使用以下语句从 wso2 esb 中的本地条目加载数据
  • 使用 HashMap 实现类似 SQL 的 RIGHT OUTER JOIN 的迭代器适配器

    我正在努力延长幸福的时间Rust 工具 http bluss github io rust itertools doc itertools index html使用类似 SQL 的连接迭代器 我在使用散列连接策略的 RIGHT OUTER
  • 在python中将unicode文本输出到RTF文件

    我正在尝试从 python 脚本将 unicode 文本输出到 RTF 文件 对于背景 维基百科 https en wikipedia org wiki Rich text format Character encoding says 对于
  • Java实例变量可访问性[重复]

    这个问题在这里已经有答案了 Java中以下变量的可访问性有什么区别 public class Joe public int a protected int b private int b int c 我最感兴趣的是最后一个在做什么 publ
  • 属性的 CNContact 编码

    我有一个包含名字的 v 卡字符串Andr 我初始化一个CNContact与 v 卡 BEGIN VCARD VERSION 2 1 N Foo Andr FN Andr Foo TEL CELL 00023 4474848 END VCAR
  • 尝试通过 AWS Lambda 连接到 Redshift

    我正在使用节点 postgres https github com brianc node postgres我的 AWS Redshift 数据库的客户端 在本地 我可以运行以下代码node 获取 gt gt 已连接 和 gt gt gt
  • PostgreSQL 字符串字符替换

    我正在尝试编写一个词汇数据库来存储由词根和模式组成的单词 我想知道如何创建一个为我组合词根和模式的列 同时忽略不具有两个列的行SELECT查询已填充 基本上 我有来自 PostgreSQL 数据库的输出 SELECT root root i
  • PHP 函数的 Big-O 列表

    使用 PHP 一段时间后 我注意到并非所有内置 PHP 函数都像预期的那么快 考虑一个函数的这两种可能的实现 该函数使用缓存的素数数组来查找一个数字是否是素数 very slow for large prime array prime ar
  • 在文本中查找大量字符串 - Python

    我正在寻找解决这个问题的最佳算法 有一个小句子列表 或一个字典 一组 在更大的文本中找到该句子的所有出现 列表 或字典或集合 中的句子约为 600k 但平均由 3 个单词组成 文本平均长度为 25 个字 我刚刚格式化了文本 删除标点符号 全
  • RAC 环境的 Oracle 连接字符串?

    我已经获得了 ORACLE RAC 环境访问权限 详细信息是 数据库名称 orcl 服务名称 orcl IP地址 192 168 1 1和192 168 1 2 SQL gt host srvctl status database d or
  • C 中的复合类型是什么?

    From 6 2 7 5 http www open std org jtc1 sc22 wg14 www docs n1570 pdf 第 66 页 示例 给定以下两个文件范围声明 int f int double 3 int f int
  • Scrapy 返回多个项目

    我是 Scrapy 的新手 我真的不知道如何在一个块中返回多个项目 基本上 我得到一个 HTML 标签 其中有一个引用 其中包含文本 作者姓名的嵌套标签以及有关该引用的一些标签 这里的代码只返回一个引号 仅此而已 它不使用循环来返回其余部分
  • EPPlus 绑定后不计算公式输出

    我正在使用 EPPlus 我被单元格公式困住了 我的代码如下 ExcelPackage pck new ExcelPackage D MYSheets EmptyFile xlsx var ws pck Workbook Worksheet
  • 让背景或相机根据角色位置“滚动”

    我正在开发一款具有自上而下视图的角色扮演游戏 我想将一张图片加载到角色正在行走的背景中 但到目前为止我还没有弄清楚如何正确地重绘背景以使其 滚动 我发现的大多数示例都是自动滚动的 我希望相机保持在角色中心 直到背景图像到达其边界 然后角色将