【问题标题】:SpriteKit sprite flickers on collisionSpriteKit 精灵在碰撞时闪烁
【发布时间】:2018-12-29 01:23:00
【问题描述】:

我有这个屏幕上的操纵杆,它通过改变它的位置来移动精灵,而且效果很好。我已经为精灵制作了一些墙来碰撞(使用物理)。而且它并没有像预期的那样走得更远,但是如果我继续进入墙壁精灵似乎会闪烁(改变它的位置一毫秒并立即返回)

 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 (红色框固定在绿色框上)

【问题讨论】:

    标签: swift sprite-kit


    【解决方案1】:

    问题几乎可以肯定是因为您使用代码(由操纵杆触发)直接设置精灵的位置,但精灵和墙由于其物理体的“collisionBitMask”设置而不能重叠。

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

    您可以避免这种情况,我使用 SKAction 来响应操纵杆输入来移动精灵,我认为这会让 SK 引擎在墙壁和怨恨开始重叠时捕获它们之间的碰撞,您可以使用接触检测然后停止运动。

    【讨论】:

    • 啊,这当然是有道理的。昨天我尝试这样做,但遇到了同样的问题。让我再试一次,我会用结果更新问题。谢谢!
    • 如果你使用moveToSKAction,你可能会遇到同样的问题,即精灵突然出现在墙的中间。尝试moveBy 一小段距离,持续时间为 1/60 秒。在此处查看此讨论; stackoverflow.com/a/41220965/1430420
    • 得到了相同的结果...我更新了帖子的详细信息
    • 这很奇怪 - y 位置从 -19 到 -29 变化了 10 个点,但 y 变化仅为 0.49。 print 和 moveBy 是否像您显示的那样彼此相邻(在 update() 中?)?
    • 我已经添加了一个关于这个问题的视频。没有打印也是一样的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多