2016-07-06 2 views
2

Я пытаюсь сделать удар мяча в круг, чтобы он не мог выйти из окружности круга. Теперь мяч отскакивает в self.frame. Как я могу заставить мяч отскочить в пределах круга?Как сделать отскок спрайта внутри объекта?

let sceneBody = SKPhysicsBody(edgeLoopFromRect: self.frame) 
    sceneBody.friction = 0 
    self.physicsBody = sceneBody 

    var ball = SKShapeNode(circleOfRadius: 9) 
    ball.fillColor = SKColor.whiteColor() 
    ball.position = view.center 
    ball.physicsBody = SKPhysicsBody(circleOfRadius: 9) 
    ball.physicsBody?.affectedByGravity = true 
    ball.physicsBody?.restitution = 1 
    ball.physicsBody?.linearDamping = 0 
    ball.zPosition = 3 
    self.addChild(ball) 

    circulo = SKSpriteNode(imageNamed: "circuloFondo2") 
    //Circle that I want the ball bounce within 
    circulo.size = CGSize(width:view.frame.size.width - padding , height: view.frame.size.width - padding) 
    circulo.color = UIColor(red: 0.15, green: 0.15, blue: 0.15, alpha: 1) 
    circulo.colorBlendFactor = 1 
    circulo.alpha = 0.35 
    circulo.position = view.center 
    self.addChild(circulo) 
    circulo.zPosition = 1 

ответ

6

Я подготовил простой тестовый проект, чтобы объяснить, как это сделать:

import UIKit 
import SpriteKit 

class GameScene: SKScene, SKPhysicsContactDelegate { 

    enum CollisionTypes: UInt32 { 
     case Circle = 1 
     case Ball = 2 
     //case Enemy1 = 4 
     //case Enemy2 = 8 
     //case Enemy3 = 16 
     //case EnemyBoss = 32 
    } 

    var circulo: SKSpriteNode! 
    var padding: CGFloat = 40.0 
    var center: CGPoint! 

    override func didMoveToView(view: SKView) { 

     self.physicsWorld.gravity = CGVectorMake(0, -6) 
     self.physicsWorld.contactDelegate = self 
     self.center = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame)) 

     // Prepare circle 
     circulo = SKSpriteNode(imageNamed: "circuloFondo2.png") 
     //Circle that I want the ball bounce within 
     circulo.size = CGSize(width:view.frame.size.width - padding , height: view.frame.size.width - padding) 
     let circlePath = UIBezierPath(arcCenter: self.center, radius: (view.frame.size.width - padding*2)/2, startAngle: CGFloat(0), endAngle:CGFloat(M_PI * 2), clockwise: true) 
     circulo.color = UIColor(red: 0.15, green: 0.15, blue: 0.15, alpha: 1) 
     circulo.colorBlendFactor = 1 
     circulo.alpha = 1 
     circulo.position = self.center 
     circulo.zPosition = 1 

     // Set physics 
     let circuloBody = SKPhysicsBody.init(edgeLoopFromPath: circlePath.CGPath) 
     self.physicsBody = circuloBody 
     self.physicsBody!.affectedByGravity = false 
     self.physicsBody!.usesPreciseCollisionDetection = true 
     self.physicsBody!.dynamic = true 
     self.physicsBody!.mass = 0 
     self.physicsBody!.friction = 0 
     self.physicsBody!.linearDamping = 0 
     self.physicsBody!.angularDamping = 0 
     self.physicsBody!.restitution = 1 
     self.physicsBody!.categoryBitMask = CollisionTypes.Circle.rawValue 
     self.physicsBody!.contactTestBitMask = CollisionTypes.Ball.rawValue 
     //self.circulo.physicsBody!.collisionBitMask = 0 

     self.addChild(circulo) 


     //Prepare ball 
     let ball = SKShapeNode(circleOfRadius: 9) 
     ball.fillColor = SKColor.whiteColor() 
     ball.position = self.center 
     ball.zPosition = 1 

     // Set physics 
     ball.physicsBody = SKPhysicsBody(circleOfRadius: 9) 
     ball.physicsBody!.affectedByGravity = true 
     ball.physicsBody!.restitution = 0.8 
     ball.physicsBody!.linearDamping = 0 
     ball.physicsBody!.friction = 0.3 
     ball.physicsBody?.dynamic = true 
     ball.physicsBody!.mass = 0.5 
     ball.physicsBody!.allowsRotation = true 
     ball.physicsBody!.categoryBitMask = CollisionTypes.Ball.rawValue 
     ball.physicsBody!.contactTestBitMask = CollisionTypes.Circle.rawValue 
     //ball.physicsBody!.collisionBitMask = 0 

     self.addChild(ball) 

    } 

    func didBeginContact(contact: SKPhysicsContact) { 
     // elements 
     if (contact.bodyA.categoryBitMask == CollisionTypes.Circle.rawValue && 
      contact.bodyB.categoryBitMask == CollisionTypes.Ball.rawValue) { 
      print("contact between circle and ball") 
     } 
    } 

circuloFondo2 изображение:

enter image description here

Демонстрационный о проект:

enter image description here

В ответе вы можете увидеть весь код, чтобы сделать это, но если вы хотите, вы можете загрузить проект here

+0

Спасибо большого Alessandro, как всегда, но что, если я хочу, чтобы тот мяч прыжок выше, я имею в виду, что когда он отказывается, мяч всегда касается противоположной стороны, где он подпрыгивает – Alex

+0

Спасибо тоже. Мяч подвергается силе тяжести, поэтому вы можете отключить гравитацию только до мяча (affectedByGravity = false), и мяч остановлен навсегда (например, на космическом корабле с гравитацией 0). Чтобы переместить его, вы можете применить импульс (пусть импульс = CGVectorMake (0.0,150.0) ball.physicsBody! .plplyImpulse (импульс)), и вы можете видеть, как мяч прыгает с одной стороны на другую при полном отсутствии силы тяжести. Вы можете делать все, что хотите, изменяя параметры физики шара. –

+0

Неустранимая ошибка: неожиданно найден нуль при разворачивании необязательного значения – Alex

Смежные вопросы