我正在制作iOS游戏(swift xcode)。
有一辆不断移动的汽车(SKAction)和一个可以用滑动手势移动的玩家。
一切都很好,但现在我想要的是,如果玩家接触到汽车,它会随着汽车一样移动(它会粘在汽车上)
现在我该怎么做?
我尝试过很多东西,但没有一个能顺利运作..
我尝试使用
if (CGRectIntersectsRect(car.frame, player.frame)) {
car.position = player.position
}
这有效,但是玩家被踢到了车的中间,我不想要这个。 我想要的是,如果玩家接触到汽车的底部,它就会粘在汽车的底部。
我该怎么做?
对于碰撞检测我也尝试使用:
func didBeginContact(contact: SKPhysicsContact!) {
var firstBody:SKPhysicsBody
var secondBody:SKPhysicsBody
if(contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask){
firstBody = contact.bodyA
secondBody = contact.bodyB
}else{
firstBody = contact.bodyB
secondBody = contact.bodyA
}
if((firstBody.categoryBitMask & CarCategory) != 0 && (secondBody.categoryBitMask & playerCategory) != 0)
{
}
}
但是我不知道在括号之间放什么,以使它像我想要的那样顺利运作。
答案 0 :(得分:3)
您可以使用固定的物理关节连接两个节点。通常,物理关节连接场景中的两个物理主体。固定版本SKPhysicsJointFixed
加入两个实体,使它们作为一个整体。
以下是如何将两个物理实体与固定关节连接的示例:
首先,将其添加到您的SKScene
子类(例如,GameScene.m)
func joinPhysicsBodies(bodyA:SKPhysicsBody, bodyB:SKPhysicsBody, point:CGPoint) {
let joint = SKPhysicsJointFixed.jointWithBodyA(bodyA, bodyB: bodyB, anchor: point)
self.physicsWorld.addJoint(joint)
}
并将其添加到if
didBeginContact
语句中
self.joinPhysicsBodies(firstBody, bodyB:secondBody, point:contact.contactPoint)
其中contact.contactPoint
是联系点。
答案 1 :(得分:2)
在没有物理的情况下更简单的方法是使用constraints:
if (CGRectIntersectsRect(car.frame, player.frame)) {
player.constraints=[SKConstraint.distance(SKRange(upperLimit: 100), toNode: car)]
}
这将确保玩家离车最远100点(您可以更改此数字以使其更加真实)
当你想要分离玩家时:
player.constraints=[]
答案 2 :(得分:0)
实施SKPhysicsContactDelegate协议:
class GameScene: SKScene, SKPhysicsContactDelegate
在didMoveToView
的末尾设置委托override func didMoveToView(view: SKView) {
...
self.physicsWorld.contactDelegate = self
}
创建全局变量以存储碰撞类别:
let collisionCar: UInt32 = 0x1 << 0
let collisionPlayer: UInt32 = 0x1 << 1
为汽车和玩家创建一个物理主体:
car.physicsBody = SKPhysicsBody(rectangleOfSize: car.size)
car.physicsBody?.affectedByGravity = false
car.physicsBody?.dynamic = false
car.physicsBody?.categoryBitMask = collisionCar
car.physicsBody?.contactTestBitMask = collisionPlayer
car.physicsBody?.collisionBitMask = 0x0;
player.physicsBody = SKPhysicsBody(rectangleOfSize: player.size)
player.physicsBody?.affectedByGravity = false
player.physicsBody?.dynamic = false
player.physicsBody?.categoryBitMask = collisionPlayer
player.physicsBody?.contactTestBitMask = collisionCar
player.physicsBody?.collisionBitMask = 0x0;
实施didBeginContact:
func didBeginContact(contact: SKPhysicsContact) {
...
}
答案 3 :(得分:0)
有两种方法可以做到这一点。
您可以使用关节,详见How to create joints in Sprite Kit (Xcode)?
或者您可以从世界中移除玩家节点并将其添加为车辆节点的子节点,在这种情况下,车辆节点和玩家节点将被链接并将一起移动。使用removeChildWithName()
和addChild()
执行此操作。