Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 穿过墙壁的SpriteKit节点_Swift_Xcode_Sprite Kit_Playgrounds - Fatal编程技术网

Swift 穿过墙壁的SpriteKit节点

Swift 穿过墙壁的SpriteKit节点,swift,xcode,sprite-kit,playgrounds,Swift,Xcode,Sprite Kit,Playgrounds,我在一个Xcode游乐场工作,我遇到了一些SpriteKit碰撞的问题 第一个长方体的质量为1,第二个长方体的质量为100000(例如,当后者为100时,一切正常)。碰撞是弹性的(restoration设置为1),并且根本没有摩擦或阻尼 以下是我的场景代码(ColliderType只是类别的enum): class游戏场景:SKScene{ 私人var墙:SKSpriteNode! 私人楼层:SKSpriteNode! 私有变量框1:SKSpriteNode! 私有变量框2:SKSpriteN

我在一个Xcode游乐场工作,我遇到了一些SpriteKit碰撞的问题

第一个长方体的质量为1,第二个长方体的质量为100000(例如,当后者为100时,一切正常)。碰撞是弹性的(
restoration
设置为1),并且根本没有摩擦或阻尼

以下是我的场景代码(
ColliderType
只是类别的
enum
):

class游戏场景:SKScene{
私人var墙:SKSpriteNode!
私人楼层:SKSpriteNode!
私有变量框1:SKSpriteNode!
私有变量框2:SKSpriteNode!
覆盖func didMove(到视图:SKView){
self.backgroundColor=.white
墙=SKSpriteNode(颜色:SKColor.black,尺寸:CGSize(宽度:10,高度:self.frame.height))
墙位置=CGPoint(x:100,y:self.frame.height/2)
wall.physicsBody=SKPhysicsBody(矩形:wall.frame.size)
wall.physicsBody?.isDynamic=false
地板=SKSpriteNode(颜色:SKColor.BLOCK,尺寸:CGSize(宽度:self.frame.width,高度:10))
floor.position=CGPoint(x:self.frame.width/2,y:100)
floor.physicsBody=SKPhysicsBody(矩形:floor.frame.size)
floor.physicsBody?.isDynamic=false
box1=SKSpriteNode(颜色:SKColor.black,尺寸:CGSize(宽度:100,高度:100))
box1.position=CGPoint(x:300,y:floor.position.y+box1.size.height/2)
box1.physicsBody=SKPhysicsBody(圆形半径:box1.frame.size.width/2)
box2=SKSpriteNode(颜色:SKColor.black,大小:CGSize(宽:100,高:100))
box2.position=CGPoint(x:750,y:floor.position.y+box2.size.height/2)
box2.physicsBody=SKPhysicsBody(圆形半径:box2.frame.size.width/2)
self.addChild(墙)
自我添加儿童(楼层)
self.addChild(框1)
self.addChild(框2)
框1.physicsBody?.allowsRotation=false
框2.physicsBody?.allowsRotation=false
框1.物理实体?恢复=1
框2.物理实体?恢复=1
框1.physicsBody?质量=1
框2.物理体?质量=100000
框1.physicsBody?摩擦力=0
框2.physicsBody?摩擦力=0
框1.physicsBody?.linearDamping=0
框2.physicsBody?.linearDamping=0
wall.physicsBody?.categoryBitMask=ColliderType.wall.rawValue
box1.physicsBody?.categoryBitMask=ColliderType.box1.rawValue
box2.physicsBody?.categoryBitMask=ColliderType.box2.rawValue
box1.physicsBody?.collisionBitMask=ColliderType.Wall.rawValue | ColliderType.Floor.rawValue | ColliderType.Box2.rawValue
box2.physicsBody?.collisionBitMask=ColliderType.Floor.rawValue | ColliderType.Box1.rawValue
box1.physicsBody?.contactTestBitMask=ColliderType.Box2.rawValue | ColliderType.Wall.rawValue
框1.physicsBody?.velocity=CGVector(dx:0,dy:0)
框2.physicsBody?.velocity=CGVector(dx:-50,dy:0)
}
}
我尝试过的事情:

  • 在第一个框中设置
    usesprecisecollisondetection=true
  • 更新位置并通过覆盖更新方法检查碰撞(它没有SpriteKit的引擎优化,所以速度非常慢)
  • 使第二个框变慢,并将
    physicsWorld.speed
    设置为大于1的数字

我想总的来说,你可能期望太高了。SpriteKit是一个游戏引擎,旨在为涉及普通物理的场景提供定性合理的行为。这不是一个高精度的物理模拟,当你把它推进一个必须做极端事情的区域,它可能会失败


在本例中,您希望它在很短的时间和距离内模拟大量的完全弹性碰撞(当重块将轻块挤压成一个小间隙时,模拟的每个动画帧都会发生许多碰撞)。它将在帧中找到第一次碰撞,计算出应用于块的脉冲,然后前进到下一帧,结果是大块愉快地融入小块所在的空间。在寻找60 fps时,所有后续的碰撞都会被忽略。

我想总的来说,你可能期望太高了。SpriteKit是一个游戏引擎,旨在为涉及普通物理的场景提供定性合理的行为。这不是一个高精度的物理模拟,当你把它推进一个必须做极端事情的区域,它可能会失败


在本例中,您希望它在很短的时间和距离内模拟大量的完全弹性碰撞(当重块将轻块挤压成一个小间隙时,模拟的每个动画帧都会发生许多碰撞)。它将在帧中找到第一次碰撞,计算出应用于块的脉冲,然后前进到下一帧,结果是大块愉快地融入小块所在的空间。在搜索60 fps的过程中,所有后续的碰撞都将被忽略。

非常感谢!我还认为问题在于SpritKit的局限性。。。我想我会考虑其他的事情(这是Swift学生挑战赛),我假设这是为了演示碰撞块来计算π。您可能能够分析地计算帧内应该发生的事情,并且只需将SpriteKit用于绘图/动画。祝你好运我试过了,但是更新方法会让实时视图滞后很多。。。另外,最酷的部分是使用默认的物理引擎来真正展示用它计算Pi是可能的。我已经找到了我可以做的其他事情:)非常感谢!我也认为这是错误的