我是编程和Spritekit的新手,我有兴趣探索毫秒和帧率之间的关系,以及如何将更新函数用作两者之间的中介.
帧率与毫秒
从本质上讲,帧速率和时间之间的主要区别在于时间始终是一致的,而帧速率则不然(由于密集的图形程序,它可能会下降).但是,时间通常在SKScene的更新事件(每帧调用)期间进行检查和设置,所以我想弄清楚时间是如何正确计算的,当你不知道有多少帧会在一秒钟内.
例
我目前正在观看太空射击游戏的更新事件,其中更新功能负责计算产生另一个外星人之前的时间间隔.您可以在此处查看完整代码:http://www.globalnerdy.com/2014/08/10/a-simple-shoot-em-up-game-with-sprite-kit-and-swift-part-one-最后一件事-第一最完整的项目/
// Called exactly once per frame as long as the scene is presented in a view
// and isn't paused
override func update(currentTime: CFTimeInterval) {
var timeSinceLastUpdate = currentTime - lastUpdateTime
lastUpdateTime = currentTime
if timeSinceLastUpdate > 1 {
timeSinceLastUpdate = 1.0 / 60.0
lastUpdateTime = currentTime
}
updateWithTimeSinceLastUpdate(timeSinceLastUpdate)
}
Run Code Online (Sandbox Code Playgroud)
问题
我似乎无法弄清楚为什么timeSinceLastUpdate被设置为1.0/60.我知道它与帧率和秒之间的协调有关,但有人可以向我解释这个吗?另外,为什么我们允许使用小数?我认为时间间隔属于Int类型.
更重要的是,这是为了保持游戏玩法在帧速率下降时减速?谢谢阅读!
更新:我已经解决了这个问题,并且找到了一个更简单的方法来做到这一点,然后提供了答案。我的解决方案是使SPACESHIP的速度等于从我的手指触摸到的距离。为了加快运动速度,可以将该速度乘以一个常数。在这种情况下,我使用了16。我还摆脱了在touchesEnd事件中将lastTouch设置为nil的问题。这样,即使我松开手指,船仍会停下来。
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
if let touch = lastTouch {
myShip.physicsBody.velocity = CGVector(dx: (lastTouch!.x - myShip.position.x) * 16, dy: 0)
}
}
Run Code Online (Sandbox Code Playgroud)
==============================
我有一个SPACESHIP节点,其运动仅限于X轴。当用户在屏幕上的某个位置按下并按住时,我希望SPACESHIP能够移动到手指的x坐标,而不希望在松开手指之前不停止向手指移动。如果SPACESHIP靠近用户的手指并且用户的手指仍被按下,则希望它逐渐减速并停止。我还希望在SPACESHIP改变方向,开始和停止时应用这种平滑运动。
我正在尝试找出最佳方法。
到目前为止,我已经创建了节点并且它可以正确移动,但是存在一个问题:如果我按下屏幕并按住不放,船最终将越过我的手指并继续移动。这是因为仅当我移动手指时才会触发更改船方向的逻辑。因此,基本上,将我的手指移到船上以改变船的方向是可行的,但是如果船越过我的静止指头,则不会改变方向
我需要SPACESHIP节点来识别它何时越过我的食指,并根据其与我手指的接近程度来更改其方向或停止。
以下是相关代码:
第1部分:当用户按下时,找出触摸来自何处,并使用速度相应地移动myShip(SPACESHIP)
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
/* Called when a touch begins */
let touch = touches.anyObject() as UITouch
let touchLocation = touch.locationInNode(self)
if (touchLocation.x < myShip.position.x) {
myShip.xVelocity = -200
} else {
myShip.xVelocity = 200 …Run Code Online (Sandbox Code Playgroud) 我最近在ASP .NET Core Web API中实现了OData。只要我直接返回数据库模型,就可以找到成功。但是,当我尝试返回域模型时,便遇到了麻烦。
潜在的问题涉及在保持IQueryable返回类型的同时将数据类映射到域类。虽然我发现使用AutoMapper的MapTo扩展方法部分成功,但是我发现使用$ extend方法扩展也是域对象的实体集时不成功。
我创建了一个示例项目来说明此问题。您可以查看或下载完整的项目在GitHub上这里。请参阅下面的说明。
给定以下两个数据库类:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public ICollection<Order> Orders { get; set; }
public Product() {
Orders = new Collection<Order>();
}
}
public class Order
{
public int Id { get; set; }
public Double Price { get; set; }
public DateTime OrderDate { get; set; }
[Required]
public int …Run Code Online (Sandbox Code Playgroud) 我目前在一个 2 人团队中开发 Web 应用程序。我正在开发客户端应用程序,而我的合作伙伴在一个单独的项目中开发后端。我的合作伙伴已将他的项目上传到我们的域 ( https://api.example.com ),并坚持只应通过 https 调用后端。
在开发我的客户端应用程序时,我通过 localhost 为其提供服务。问题是 localhost 默认通过 http 提供服务。我不知道如何通过https调用后端。
我正在通过 Angular 4 CLI 开发我的客户端应用程序。我试图通过自签名证书通过https://localhost为我的应用程序提供服务,但我在这样做时遇到了可怕的问题,因为 Chrome 检测到的证书不是真实的。
所以我被困住了。通过 https 调用我们的开发服务器的最佳方式是什么?或者,我应该这样做吗?合作伙伴是否应该为我开发客户端应用程序提供不同的 api 端点?我们应该如何共同努力解决这个问题?
sprite-kit ×2
swift ×2
.net ×1
api ×1
automapper ×1
c# ×1
cross-domain ×1
https ×1
ios ×1
iqueryable ×1
odata ×1
time ×1
xcode ×1
xcode6 ×1