2017-06-12 67 views
1

我目前正在开发一个使用SpriteKit的IOS游戏。SKShapeNode更新触摸物理身体

我有一个SKShapeNode的背景。基本上这个形状的路径是一条具有一些曲线的bezierPath。玩家可以使用touchBegan或touchMove触发器更新此路径。

- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event{ 
    CGPoint touchPoint = [[touches anyObject] locationInView:self.view]; 

    // Create path 
    UIBezierPath* newPath = ... 

    // Update path 
    [self.backgroundShape setPath:newPath.CGPath]; 
    [self.backgroundShape setPhysicsBody:[SKPhysicsBody bodyWithEdgeLoopFromPath:newPath.CGPath]]; 
} 

在更新背景的路径时,其他一些SKNode可以在我的背景中输入。

假设我们在y0(原始垂直位置)上放置了一些表格(SKNodes)。当将表格的物理更新为另一个垂直位置(例如y0 + deltaY)时,这些框(受重力影响)落在屏幕的底部。

我如何避免这种情况?我想更新桌子的物理特性,但我希望箱子保持在上面。

Short video of the current issue

感谢,

+1

实际上有什么行为?请更好地描述一个问题,例如。添加一些图片,动画...很抱歉,但问题不清楚,从提供的代码,它不能说是什么问题。我最好的猜测是,你碰撞位掩码设置有问题... – Whirlwind

+0

我编辑了我的文章。不知道我很清楚.. @Whirlwind –

+0

好吧,现在它有点清晰。更新物理机构总是一件事情。当您重新创建边界时,您是否正确设置了蒙版? – Whirlwind

回答

0

在你gamescene:

func keepBallOnTable() { 
    if ball.frame.minY < table.frame.maxY { 
    ball.position.y = table.frame.maxY + (ball.size.height/2) + 1 
    } 
} 

override func didFinishUpdate() { 
    keepBallOnTable() 
} 

你将不得不转换为objC:P

Video results of implementation

gist of the whole gamescene

物理体和像.moveTo.position这样的东西混合不好。每次尝试混合物体时,您都必须与物理系统对抗。因此,我上面创建的功能:)

+1

好的,谢谢你的时间,我会尽快试一试! –

+0

@Johnsmith为你解答了这个问题吗?如果不让我知道,我可以尝试更新它。 – Fluidity