- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我目前正在尝试旋转 Sprite ,具体取决于它与直接面向目标的角度(或弧度,我更喜欢度数)不同,问题是当目标到达某个位置时, Sprite 决定旋转一个完整的 360 到其他方式而不是做 10 额外的。这张图片可能更好地解释了问题:
蓝色方 block = 目标
红色方 block = 对象
绿线=它想要的旋转
黑线=当前旋转
棕色箭头 = 它如何旋转以实现此目的
红色箭头 = 我希望它如何旋转。
请注意,情况 1 始终有效,具体取决于它的旋转方式,但情况 2 它始终执行该旋转,无论它是在当前旋转的“右侧”还是“左侧”。
这是我用来旋转对象的代码。
Vector2 distance = new Vector2(target.worldPos.X - this.worldPos.X, target.worldPos.Y - this.worldPos.Y);
float wantRot = (float)Math.Atan2(distance.Y, distance.X);
if (this.rotation < wantRot)
this.rotation += MathHelper.ToRadians(45) * Time.deltaTime;
if (this.rotation > wantRot)
this.rotation -= MathHelper.ToRadians(45) * Time.deltaTime;
我想要实现的是让它根据红色箭头而不是棕色箭头旋转(在情况 2 中)。
注意:我不是编程方面的专家,我只是在过去的一年里偶尔做过(主要是简单的 2D 射击/射击类游戏),所以深入的解释将不胜感激.我也是一名学习编程的学生。
PS:对于标题的建议也将不胜感激,因为我完全不知道该放什么。
最佳答案
您的问题是目标可能处于 5 角,而物体可能面向 355 度(例如)。根据你的测试,5小于355,所以逆时针走。
你应该做的是测试目标是在你左边 180 度以内,还是在你右边 180 度以内,然后相应地移动。
棘手的部分是让支票在 360 <-> 0 周围“环绕”。看起来你的情况下还剩下 0 度,所以很难测试 wantRot 位于 0 度范围内的一侧
如下图所示绘制一个圆圈,然后将您的对象放在我们面对的左侧。您会看到您必须分别检查 2 个阴影区域。
分别检查所有情况。
注意:下面的代码是我的想法,未经测试。您需要将度数更改为弧度。
int MoveDir = 0;
var BehindMe = this.rotation - 180;
if (BehindMe < 0)
BehindMe += 360;
if (wantRot != this.rotation)
{
if (wantRot == BehindMe)
MoveDir = 1; // or randomly choose
else if ((wantRot > BehindMe && wantRot < this.rotation) ||
(this.rotation < 180 && (wantRot > BehindMe ||
wantRot < this.rotation)))
MoveDir = -1;
else if ((wantRot < BehindMe && wantRot > this.rotation) ||
(this.rotation > 180 && (wantRot < BehindMe ||
wantRot > this.rotation))
MoveDir= 1;
this.rotation += MoveDir * MathHelper.ToRadians(45) * Time.deltaTime;
}
从图像中,您可能会意识到您可以只检查右侧的对象,如果不是,则假设它在左侧(因为只要当前角度小于 180 度,检查它在对很容易)。如果当前角度大于 180 度,则反转概念 - 检查它是否在左侧,如果不在则假设在右侧。如下所示:
int MoveDir = 0;
var BehindMe = this.rotation - 180;
if (BehindMe < 0)
BehindMe += 360;
if (wantRot != this.rotation)
{
if (this.rotation <= 180)
{
if (wantRot > this.rotation && wanrRot < BehindMe)
MoveDir = 1;
else
MoveDir = -1;
}
else
{
if (wantRot < this.rotation && wanrRot > BehindMe)
MoveDir = -1;
else
MoveDir = 1;
}
this.rotation += MoveDir * MathHelper.ToRadians(45) * Time.deltaTime;
}
关于c# - 如何逐渐旋转一个物体以面对另一个转动最短距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7846775/
有一个 servlet 代码用于将 excel/zip 文件从生产服务器下载到本地计算机。当我单击生产服务器上的“保存”或“打开”按钮时,它会抛出 ClientAbortException。相同的代码
在我的搜索页面中,默认情况下我使用 page=0 进行分页。并在 asyncData 方法中使用此参数调用 api。但不知何故,该值增加了一个。 所以这是我的网址,例如, http://localho
任何人都可以解释下面这段代码,我正在努力弄清楚。 order = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1357902468' pr
我正在 Java 平台上开发一个实时战略游戏克隆,我有一些概念性的问题关于放置在哪里以及如何管理游戏状态。游戏使用Swing/Java2D作为渲染。在目前的开发阶段,没有模拟,也没有人工智能,只有用户
这个问题在这里已经有了答案: Simple Linux Signal Handling (5 个答案) 关闭 8 年前。 我的应用程序已经配置了一个 SIGTERM 处理程序。例如: Signal(
我正在尝试创建一个会在几秒钟后淡入视野的文本,但我遇到了问题。淡入 View 效果很好,但文本在显示后几乎立即消失。其次我需要这个动画以延迟的方式工作,但是当我设置延迟时它似乎没有任何区别。延迟在早些
我正在尝试在我的项目 pubspec.yaml 中添加 flutter_svg: ^0.5.1 并面临以下问题。 依赖flutter_svg >=0.0.2 需要Flutter SDK版本>=0.3.
我在使用 Go 的 sync.Map 时遇到问题。以下是详细信息: 我创建了一个全局同步 map ,如下所示: var MySyncGlobalMap = sync.Map{} 在一个事件中,我用预期
12月9日,Apache 基金会针对一个名为 Log4Shell 的关键零日漏洞发布了紧急更新,这个在Log4j(一个用于各种Java应用的开源日志框架)中发现的漏洞被认定为CVE-2021-442
DNS 劫持作为最常见的网络攻击方式,是每个站长或者运维团队最为头疼的事情。苦心经营的网站受到 DNS 劫持后,不仅会影响网站流量、权重,还会让用户置身于危险之中,泄露隐私造成财产损失。 就是这样
我遇到过使用 Vision Framework 进行真人脸检测的问题。我在下面提到了苹果链接。 https://developer.apple.com/documentation/vision/tra
我是 MySQL 的新手,一直遇到一些错误,但我总能找到解决方案,除了这个,我不知道如何解决它。 如果变量“ue”为 1 或 0(一堆存在验证),则以下 MySQL 过程返回一个值。验证部分 (SET
我的应用程序出现此错误: java.lang.IllegalArgumentException: method ID not in [0, 0xffff]: 65536 我知道这是由于单个 dex 文
我必须对几乎在发送的每个请求中都使用 javax.faces.FormSignature 的应用程序进行负载测试。我正在使用这样的 xPath 提取器来获取 FormSignature 的值: /ht
屏幕上有 6 个开关控件。一次只能启用一个开关。如果第 5 个开关打开,则一个标签和一个文本字段应该可见或者隐藏。 当 5 开关从关闭变为打开并再次变为关闭时,我遇到了问题。标签和提交的文本应该被隐藏
当我将它应用于主体颜色或更改字体大小时,它工作正常,但当涉及到使元素 float 或 flex-direction 时,它根本不回应。尝试了所有可能的方法,只是不确定这里有什么问题:请检查代码,我认为
我希望我能得到一些关于如何解决这个问题的信息。我是 jenkins 的新手,正在尝试设置 jenkins 服务器。 启用 SSL 后,我无法登录 Jenkins。 Chrome 抛出错误 ERR_SS
我的项目是 EJB3 上的 java 项目,使用 Hibernate 和 Weblogic 服务器。 为了方便起见(据我所知,hibernate 很典型),一些实体包含循环依赖(父知道子,子知道父)。
@Autowired和@Resource都是Java Spring框架中的注解,用于实现依赖注入(DI)和控制反转(IoC)。它们的区别主要在以下三个方面: 源头不同 @Autowir
我正在使用下面的插件来自动管理补丁版本。 id "com.zoltu.git-versioning" version "3.0.3" 基本上,上述插件需要使用 v.major.minor 约定标记代码
我是一名优秀的程序员,十分优秀!