我有这个屏幕上的操纵杆,它可以通过更改其位置来移动精灵,并且效果很好。我已经为精灵创建了一些墙以与之碰撞(使用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 (红色框固定在绿色框上)
答案 0 :(得分:2)
几乎可以肯定的问题是,您正在使用由操纵杆触发的代码直接设置子画面的位置,但是由于其物理物体的“ collisionBitMask”设置,子画面和墙不会重叠。
因此,精灵将靠在墙上,然后使用操纵杆将精灵移向墙壁。您更新精灵的位置,使其与墙节点重叠。 SK引擎从没有看到2个节点开始重叠,但是突然发现这些节点在不应该重叠的情况下大量重叠,并试图通过冲动来移动它们,使它们不再重叠,从而导致精灵“跳”到一个不会重叠的新位置,因此似乎会闪烁。
您可以通过使用SKAction来响应操纵杆输入来移动精灵,我认为这可以避免SK引擎一开始重叠就可以捕获墙和精灵之间的碰撞,并且可以使用接触检测以停止运动。