Я создал свою собственную очень простую тестовую игру на основе Breakout, изучая SpriteKit (используя игры iOS от Tutorials от Ray Wenderlich и др.), Чтобы узнать, могу ли я применить которые я узнал. Я решил упростить свой код, используя файл .sks для создания узлов спрайтов и замены проверки ручных границ и столкновения с физическими телами.Физика SpriteKit в Swift - Мяч скользит против стены вместо отражения
Однако, мой шар продолжает работать параллельно стенам/другим прямоугольникам (как в, просто сдвигая их вверх и вниз) в любое время, когда он сталкивается с ними под крутым углом. Вот соответствующий код - я переместил свойство физики тела в код, чтобы сделать их более заметными:
import SpriteKit
struct PhysicsCategory {
static let None: UInt32 = 0 // 0
static let Edge: UInt32 = 0b1 // 1
static let Paddle: UInt32 = 0b10 // 2
static let Ball: UInt32 = 0b100 // 4
}
var paddle: SKSpriteNode!
var ball: SKSpriteNode!
class GameScene: SKScene, SKPhysicsContactDelegate {
override func didMoveToView(view: SKView) {
physicsWorld.gravity = CGVector.zeroVector
let edge = SKNode()
edge.physicsBody = SKPhysicsBody(edgeLoopFromRect: frame)
edge.physicsBody!.usesPreciseCollisionDetection = true
edge.physicsBody!.categoryBitMask = PhysicsCategory.Edge
edge.physicsBody!.friction = 0
edge.physicsBody!.restitution = 1
edge.physicsBody!.angularDamping = 0
edge.physicsBody!.linearDamping = 0
edge.physicsBody!.dynamic = false
addChild(edge)
ball = childNodeWithName("ball") as SKSpriteNode
ball.physicsBody = SKPhysicsBody(rectangleOfSize: ball.size))
ball.physicsBody!.usesPreciseCollisionDetection = true
ball.physicsBody!.categoryBitMask = PhysicsCategory.Ball
ball.physicsBody!.collisionBitMask = PhysicsCategory.Edge | PhysicsCategory.Paddle
ball.physicsBody!.allowsRotation = false
ball.physicsBody!.friction = 0
ball.physicsBody!.restitution = 1
ball.physicsBody!.angularDamping = 0
ball.physicsBody!.linearDamping = 0
physicsWorld.contactDelegate = self
}
забыл упомянуть об этом раньше, но я добавил простую функцию touchesBegan для отладки отскоков - это просто регулирует скорость, чтобы указать мяч в точке касания:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
let touch = touches.anyObject() as UITouch
let moveToward = touch.locationInNode(self)
let targetVector = (moveToward - ball.position).normalized() * 300.0
ball.physicsBody!.velocity = CGVector(point: targetVector)
}
функция нормализована() как раз уменьшает шарик/позиция касания дельты в единичном вектор, и есть переопределение минус оператора, что позволяет CGPoint вычитания ,
Шарнир/краевые столкновения должен всегда отражать шар точно противоположным углом, но по какой-то причине шар действительно имеет вещь для прямых углов. Я могу, конечно, реализовать некоторое обходное решение, чтобы отразить угол шара вручную, но дело в том, что я хочу сделать все это, используя встроенную физическую функциональность в SpriteKit. Есть ли что-то очевидное, что мне не хватает?
Вам нужно будет перемещать спрайт по применяя силу или импульс к ее физическому телу или устанавливая его свойство скоростей. Спрайт не будет участвовать в физическом моделировании, если вы переместите его с действием или, установив его положение напрямую. – 0x141E
Извините, я не учитывал настройку скорости. Я только что редактировал его, но в основном это событие касания, которое задает скорость шара в точке касания в SKScene. –
Вы нажимаете и отпускаете палец или удерживаете его, когда происходит контакт? – 0x141E