- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
你好,
我正在使用 spritekit 为 iOS 制作一个 2d 平台游戏。我有移动平台,让我的角色可以随着平台移动。
我不能只使用 skactions 来移动我的平台,因为角色不会随着平台移动。
问题:
我将如何添加缓入和缓出功能以拥有平台???模拟:SKactionTimeMode.easeInEaseOut
当前解决方案:
我面前没有代码,但对于左/右移动平台,这几乎就是我正在做的。这将在平台 update() 方法中运行。
If platform.position.x < xPositionIWantNodeToStopGoingLeft {
velAmount = -velAmount
}
else if platform.position.x > xPositionIWantNodeToStopGoingRight {
velAmount = -velAmount
}
platform.physicsBody?.velocity = SKVector(dx: velAmount, dy: velAmount
platform.position.y = staticYPosition
最佳答案
缓入出功能
如果我们将平台从一侧移动到另一侧的时间视为一个单位(可能是 10 秒或 17 帧,没关系,我们现在以单位工作)。
我们对距离做同样的事情。平台必须在一单位时间内移动一单位距离。
这个回答时间是t
位置是时间的函数,写为 f(t)
是时间的平台位置t
.
对于简单的直线运动,函数就是 f(t)=t
.所以在时间t=0
移动的距离为 0,在时间 0.5(中途)时,距离为 0.5(中途),依此类推。
所以让我们把它变成更实用的东西。
请原谅我的 swift 我从来没有使用过它(我相信你可以纠正我弄错的任何语法)。
// First normalise the distance and time (make them one unit long)
// get the distance
let distance = Double(xPositionStopGoingLeft - xPositionStopGoingRight);
// use that and the velocity to get the time to travel
let timeToTravel = distance / Double(velAmountX);
// first we have a frame ticker
gameTick += 1; // that ticks for every frame
// We can assume that the platform is always moving back and forth
// Now is the unit time where at now = 2 the platform has move there and back
// at 3 it has move across again and at 4 back again.
let now = Double(gameTick) / timeToTravel; // normalize time.
// get the remainder of 2 as from 0-1 is moving forward and 1-2 is back
let phase = now % 2.0;
// We also need the unit time for the function f(t)=t
let t = abs(phase - 1);
if phase >= 1 { t = 1 - t } // reverse for return
// implement the function f(t) = t where f(t) is dist
let dist = t
// and convert back to pixel distance
platform.position.x = Int(dist * distance + Double(xPositionStopGoingLeft));
这就是线性平台。要改变运动,我们需要做的就是改变函数
f(t)=?
。 , 在上面它的行
let dist = t
为了便于使用,有一个方便的功能可用于大多数简单的应用程序
f(t) = t * t / ((t * t) + (1 - t) * ( 1 - t))
有一些
t*t
哪些是权力,
t
2 或 t^2 的幂。 swift 其
pow(t,2)
所以将上面的代码重写为代码
let dist = pow(t,2) / (pow(t,2) + pow((1-t),2);
这在开始和结束时提供了很好的轻松因为经过的距离和时间是恒定的,中间点的速度
t = 0.5
必须更大才能 catch 缓慢的开始和结束。 (旁注,获取上述函数的导数可以让您在每个时间点锻炼速度
f'(t) = speed(t) = 2(-(t-1)t)^(2-1) /(t^2+(1-t)^2)^2
)
let dist = pow(t,1.2) / (pow(t,1.2) + pow((1-t),1.2);
所以现在我们可以引入另一个术语,
maxSpeed
这是归一化的 maxSpeed (更准确地说,它是 t=0.5 时的速度,因为它可能比 1 慢,但我们需要最大速度)
let maxSpeed = Double(velAmountX + 3) / Double(velAmountX); // 3 pixels per frame faster
和函数
f(t) = t^m / (t^m + (1-t)^m)
其中 m 是
maxSpeed
.
// the next 3 lines can be constats
let distance = Double(xPositionStopGoingLeft - xPositionStopGoingRight);
let timeToTravel = distance / Double(velAmountX);
let maxSpeed = Double(velAmountX + 3) / Double(velAmountX);
gameTick += 1; // that ticks for every frame
let now = Double(gameTick) / timeToTravel; // normalize time.
let phase = now % 2.0;
let t = abs(phase - 1);
if phase >= 1 { t = 1 - t } // reverse for return
// the next line is the ease function
let dist = pow(t, maxSpeed) / (pow(t, maxSpeed) + pow((1-t) ,maxSpeed);
// position the platform
platform.position.x = Int(dist * distance + Double(xPositionStopGoingLeft));
现在您可以在任何刻度上计算平台的位置。如果您想减慢整个游戏的速度并将帧步进到一半,它仍然可以工作。如果你加快游戏速度
gameTick += 2
它仍然有效。
t=0.5
套装
maxSpeed = 0.5
在中途点,速度将减半。为了让一切工作在开始和结束时轻松自如,冲进冲出会更快。 (也适用于反向)
f(t)=t
(恒定速度)。在任何时间点,您越过击中线向下移动,您可以找到行进的距离。
f(t)=t*t/(t*t+(1-t)*(1-t))
它的工作原理相同。在任何时间点扫描以找到绿线并向下移动以获得距离。函数 f(t) 为你做这件事。
关于ios - 使用 spritekit 为 2d 平台游戏添加移动平台的轻松进出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45282678/
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我试图用这种形式简单地获取数字 28 integer+space+integer+integer+space+integer我试过这个正则表达式 \\s\\d\\d\\s 但我得到了两个数字11 和
最近一直在学习D语言。我一直对运行时感到困惑。 从我能收集到的关于它的信息中,(这不是很多)我知道它是一种有助于 D 的一些特性的运行时。像垃圾收集一样,它与您自己的程序一起运行。但是既然 D 是编译
想问一下这两个正则表达式有区别吗? \d\d\d 与 \d{3} 我已经在我的本地机器上使用 Java 和 Windows 操作系统对此进行了测试,两者都工作正常并且结果相同。但是,当在 linux
我正在学习 Go,而且我坚持使用 Go 之旅(exercise-stringer.go:https://tour.golang.org/methods/7)。 这是一些代码: type IPAddr
我在Java正则表达式中发现了一段令我困惑的代码: Pattern.compile( "J.*\\d[0-35-9]-\\d\\d-\\d\\d" ); 要编译的字符串是: String string
我在 ruby 代码上偶然发现了这个。我知道\d{4})\/(\d\d)\/(\d\d)\/(.*)/是什么意思,但是\1-\2-\3-\4 是什么意思? 最佳答案 \1-\2-\3-\4 是 b
我一直在努力解决这个问题,这让我很恼火。我了解 D 运行时库。它是什么,它做什么。我也明白你可以在没有它的情况下编译 D 应用程序。就像 XoMB 所做的那样。好吧,XoMB 定义了自己的运行时,但是
我有两个列表列表,子列表代表路径。我想找到所有路径。 List> pathList1 List> pathList2 当然是天真的解决方案: List> result = new ArrayList>
我需要使用 Regex 格式化一个字符串,该字符串包含数字、字母 a-z 和 A-Z,同时还包含破折号和空格。 从用户输入我有02-219 8 53 24 输出应该是022 198 53 24 我正在
目标是达到与this C++ example相同的效果: 避免创建临时文件。我曾尝试将 C++ 示例翻译为 D,但没有成功。我也尝试过不同的方法。 import std.datetime : benc
tl;dr:你好吗perfect forwarding在 D? 该链接有一个很好的解释,但例如,假设我有这个方法: void foo(T)(in int a, out int b, ref int c
有什么方法可以在 D 中使用abstract auto 函数吗? 如果我声明一个类如下: class MyClass { abstract auto foo(); } 我收到以下错误: mai
有没有人为内存中重叠的数组切片实现交集?算法在没有重叠时返回 []。 当 pretty-print (使用重叠缩进)内存中重叠的数组切片时,我想要这个。 最佳答案 如果您确定它们是数组,那么只需取 p
我已经开始学习 D,但我在使用 Andrei Alexandrescu 所著的 The D Programming Language 一书中提供的示例时遇到了一些麻烦。由于 int 和 ulong 类
如何创建一个不可变的类? 我的目标是创建一个实例始终不可变的类。现在我只是用不可变的方法和构造函数创建了一个“可变”类。我将其称为 mData,m 表示可变。然后我创建一个别名 alias immut
不久前我买了《The D Programming Language》。好书,很有教育意义。但是,我在尝试编译书中列出的语言功能时遇到了麻烦:扩展函数。 在这本书中,Andrei 写了任何可以像这样调用
我在 D http://www.digitalmars.com/d/2.0/lazy-evaluation.html 中找到了函数参数的惰性求值示例 我想知道如何在 D 中实现可能的无限数据结构,就像
这个问题在这里已经有了答案: 12 年前关闭。 Possible Duplicate: Could anyone explain these undefined behaviors (i = i++
当前是否可以跨模块扫描/查询/迭代具有某些属性的所有函数(或类)? 例如: source/packageA/something.d: @sillyWalk(10) void doSomething()
我是一名优秀的程序员,十分优秀!