ios – SKSpriteNode在碰撞时失去速度
发布时间:2020-12-14 17:25:20 所属栏目:百科 来源:网络整理
导读:我正在制作iOS应用程序并遇到一些物理问题.正如您可以通过下面的.GIF所知,当我旋转六边形并且球以一定角度撞击矩形时,它会失去一些速度并且不会反弹得那么高.这是因为共享 here的原因(主要是因为我约束球的水平位置,它只是在击中角度时使用垂直速度,因此失去
我正在制作iOS应用程序并遇到一些物理问题.正如您可以通过下面的.GIF所知,当我旋转六边形并且球以一定角度撞击矩形时,它会失去一些速度并且不会反弹得那么高.这是因为共享
here的原因(主要是因为我约束球的水平位置,它只是在击中角度时使用垂直速度,因此失去速度).
我无法为我的生活找到解决方案来解决这个问题.有没有人有任何想法? Ball节点代码: func createBallNode(ballColor: String) -> SKSpriteNode { let ball = SKSpriteNode(imageNamed: ballColor) ball.position = CGPoint(x: CGRectGetMidX(frame),y: CGRectGetMidY(frame)+30) ball.zPosition = 1 ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.width/2) ball.physicsBody?.affectedByGravity = true ball.physicsBody?.restitution = 1 ball.physicsBody?.linearDamping = 0 ball.physicsBody?.friction = 0 ball.physicsBody?.categoryBitMask = ColliderType.Ball.rawValue ball.physicsBody?.contactTestBitMask = ColliderType.Rect.rawValue ball.physicsBody?.collisionBitMask = ColliderType.Rect.rawValue let centerX = ball.position.x let range = SKRange(lowerLimit: centerX,upperLimit: centerX) let constraint = SKConstraint.positionX(range) ball.constraints = [constraint] return ball } 解决方法
是的,问题可能是由于球没有完全“对齐”时击中六边形.在这种情况下,球失去垂直速度而有利于水平轴.
既然你想要一个“离散逻辑”我相信这个场景你应该避免物理学(至少对于弹跳部分).重复垂直移动球的SKAction会容易得多. 例 我准备了一个简单的例子 class GameScene: SKScene { override func didMove(to view: SKView) { super.didMove(to: view) let ball = createBallNode() self.addChild(ball) } func createBallNode() -> SKSpriteNode { let ball = SKSpriteNode(imageNamed: "ball") ball.position = CGPoint(x: frame.midX,y: frame.minY + ball.frame.height / 2) let goUp = SKAction.move(by: CGVector(dx: 0,dy: 600),duration: 1) goUp.timingMode = .eaSEOut let goDown = SKAction.move(by: CGVector(dx: 0,dy: -600),duration: 1) goDown.timingMode = .easeIn let goUpAndDown = SKAction.sequence([goUp,goDown]) let forever = SKAction.repeatForever(goUpAndDown) ball.run(forever) return ball } } 更新 如果您需要在每次球接触Hexagon底座时执行检查,您可以使用此代码 class GameScene: SKScene { override func didMove(to view: SKView) { super.didMove(to: view) let ball = createBallNode() self.addChild(ball) } func createBallNode() -> SKSpriteNode { let ball = SKSpriteNode(imageNamed: "ball") ball.position = CGPoint(x: frame.midX,duration: 1) goDown.timingMode = .easeIn let check = SKAction.customAction(withDuration: 0) { (node,elapsedTime) in self.ballTouchesBase() } let goUpAndDown = SKAction.sequence([goUp,goDown,check]) let forever = SKAction.repeatForever(goUpAndDown) ball.run(forever) return ball } private func ballTouchesBase() { print("The ball touched the base") } } 正如您现在所看到的,每次球是一个较低的y坐标时,都会调用ballTouchesBase方法.这是添加六边形颜色检查的正确位置. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Swift:如何创建静态库的外部接口(Objective-C .h中的公共头
- reactjs – 将错误响应拦截器放在redux-axios-middleware上
- 潘石屹:创意的价值依赖精神进步
- Qt15 Update a data from Sqlite database with pushbutton
- ajax跨域问题解决方法
- ruby-on-rails – 监视RTMP流,记录是否可用
- c# – ListBox ScrollIntoView当使用GroupViewSource与Grou
- 从Oracle使用WCF服务
- JSON.parse()和JSON.stringify的介绍和使用方法
- vue框架搭建之axios使用教程