SpriteKit精灵在碰撞时会闪烁

时间:2018-12-27 14:36:35

标签: swift sprite-kit

我有这个屏幕上的操纵杆,它可以通过更改其位置来移动精灵,并且效果很好。我已经为精灵创建了一些墙以与之碰撞(使用Physics)。而且它并没有按照预期的那样前进,但是如果我继续钻进墙壁精灵似乎会闪烁(将其位置更改一毫秒然后立即返回)

 override func update(deltaTime seconds: TimeInterval) {
     cNode.position = CGPoint(x: playerCurrentPosition.x + xChange, 
                              y: playerCurrentPosition.y + yChange)
 }

进行了一些调试,似乎一个更新精灵的位置不正确:

 pos Y: -19.168764114379883
 pos Y: -19.164892196655273
 pos Y: -19.16112518310547
 pos Y: -29.928884506225586. <---
 pos Y: -19.15281105041504
 pos Y: -19.148771286010742

更新

好吧,我尝试像这样通过move By进行移动:

print("[", xChange,", ",yChange,"]", cNode.position.y)
cNode.run(SKAction.moveBy(x: xChange, y: yChange, duration: 1/60))

我在Y位置也有相同的闪烁:

            xChange,                yChange,        cNode.position.y
    [ -0.08623046134167665 ,  0.4925081801724735 ] -19.026506423950195
    [ -0.08623046134167665 ,  0.4925081801724735 ] -19.026336669921875
    [ -0.08623046134167665 ,  0.4925081801724735 ] -19.02557373046875
    [ -0.08623046134167665 ,  0.4925081801724735 ] -29.92888641357422
    [ -0.08623046134167665 ,  0.4925081801724735 ] -29.928884506225586
    [ -0.08623046134167665 ,  0.4925081801724735 ] -29.928884506225586
    [ -0.08623046134167665 ,  0.4925081801724735 ] -29.928884506225586
    [ -0.08623046134167665 ,  0.4925081801724735 ] -19.02621841430664
    [ -0.08623046134167665 ,  0.4925081801724735 ] -19.025728225708008
    [ -0.08623046134167665 ,  0.4925081801724735 ] -19.02647590637207
    [ -0.08623046134167665 ,  0.4925081801724735 ] -19.02564811706543
    [ -0.08623046134167665 ,  0.4925081801724735 ] -19.02585792541504
    [ -0.08623046134167665 ,  0.4925081801724735 ] -19.02660369873047
    [ -0.08623046134167665 ,  0.4925081801724735 ] -19.025630950927734
    [ -0.08623046134167665 ,  0.4925081801724735 ] -19.026046752929688
    [ -0.08623046134167665 ,  0.4925081801724735 ] -19.026309967041016
    [ -0.08623046134167665 ,  0.4925081801724735 ] -19.025686264038086

更新2:

我已经记录了该问题:Here

更新3:

似乎我的外部绿色区域有一些防撞面具,我将其取下后效果更好,但仍然有一些弹跳,请看一下:Here (红色框固定在绿色框上)

1 个答案:

答案 0 :(得分:2)

几乎可以肯定的问题是,您正在使用由操纵杆触发的代码直接设置子画面的位置,但是由于其物理物体的“ collisionBitMask”设置,子画面和墙不会重叠。

因此,精灵将靠在墙上,然后使用操纵杆将精灵移向墙壁。您更新精灵的位置,使其与墙节点重叠。 SK引擎从没有看到2个节点开始重叠,但是突然发现这些节点在不应该重叠的情况下大量重叠,并试图通过冲动来移动它们,使它们不再重叠,从而导致精灵“跳”到一个不会重叠的新位置,因此似乎会闪烁。

您可以通过使用SKAction来响应操纵杆输入来移动精灵,我认为这可以避免SK引擎一开始重叠就可以捕获墙和精灵之间的碰撞,并且可以使用接触检测以停止运动。