基本上,游戏由玩家在屏幕上移动的篮子组成,游戏的目的是让玩家捕捉从屏幕顶部落下的球。我目前正试图在球和篮子之间增加碰撞检测,但是我们面临的困难是实施这种碰撞检测。我对swift,sprite kit和app开发很陌生,所以请帮助。任何帮助,将不胜感激。我面临的另一个问题是所有的球落在屏幕的中心。一行代码应该执行的时候,球击中篮,然后球应该消失,请帮助,因为我是Spritekit的新手。实现碰撞检测
import SpriteKit
class GameScene: SKScene {
var basket = SKSpriteNode()
let actionMoveRight = SKAction.moveByX(50, y: 0, duration: 0.2)
let actionMoveLeft = SKAction.moveByX(-50, y: 0, duration: 0.2)
//let physicsBody = SKPhysicsBody(texture: , size: 3500)
override func didMoveToView(view: SKView) {
/* Setup your scene here */
self.physicsWorld.gravity = CGVectorMake(0.0, -0.5)
self.backgroundColor = SKColor.whiteColor()
basket = SKSpriteNode(imageNamed: "basket")
basket.setScale(0.5)
basket.position = CGPointMake(self.size.width/2, self.size.height/8)
basket.size.height = 50
basket.size.width = 75
self.addChild(basket)
let updateAction = SKAction.runBlock {
var choice = arc4random_uniform(3)
switch choice {
case 1 :
var ball1 = SKSpriteNode(imageNamed: "redBall")
ball1.position = CGPointMake(self.size.width/3, self.size.height)
ball1.setScale(0.5)
ball1.size.height = 20
ball1.size.width = 30
ball1.physicsBody = SKPhysicsBody(circleOfRadius: ball1.size.height/2.75)
ball1.physicsBody!.dynamic = true
self.addChild(ball1)
println("0")
case 0 :
var ball2 = SKSpriteNode(imageNamed: "redBall")
ball2.position = CGPointMake(self.size.width/5, self.size.height)
ball2.setScale(0.5)
ball2.size.height = 20
ball2.size.width = 30
ball2.physicsBody = SKPhysicsBody(circleOfRadius: ball2.size.height/2.75)
ball2.physicsBody!.dynamic = true
self.addChild(ball2)
println("1")
case 2 :
var ball3 = SKSpriteNode(imageNamed: "redBall")
ball3.position = CGPointMake(self.size.width*4/5, self.size.height)
ball3.setScale(0.5)
ball3.size.height = 20
ball3.size.width = 30
ball3.physicsBody = SKPhysicsBody(circleOfRadius: ball3.size.height/2.75)
ball3.physicsBody!.dynamic = true
self.addChild(ball3)
println("2")
default :
println("Problem")
}
}
let waitDuration : NSTimeInterval = 1.0
let updateAndWaitAction = SKAction.sequence([updateAction,SKAction.waitForDuration(waitDuration)])
let repeatForeverAction = SKAction.repeatActionForever(updateAndWaitAction)
self.runAction(repeatForeverAction)
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
/* Called when a touch begins */
for touch: AnyObject in touches {
let location = touch.locationInNode(self)
if location.x > basket.position.x {
if basket.position.x < self.frame.maxX {
basket.runAction(actionMoveRight)
}
}
else {
if basket.position.x > self.frame.minX {
basket.runAction(actionMoveLeft)
}
}
}
}
override func update(currentTime: CFTimeInterval) {
}
}
http://stackoverflow.com/questions/24169882/how-to-properly-remove-node-当出界限时/ 24195006#24195006 虽然它起初可能看起来并不相关,但它是两个物体接触时如何触发事件的示例。这种方法是在sprite工具包中处理碰撞检测的方法。 RayWenderlich.com有一些易于理解的教程,可以在不到一个小时的时间内完成您的任务。我的答案可以让你既检测到碰撞又可以访问碰撞的两个物体。这可以让你轻松地移除球。 – meisenman 2015-04-01 14:18:18
请记住,您不会检测到碰撞 - 您会检测到两个SKNode之间的接触。碰撞是由游戏引擎自动处理的,如果你这样设置的话。碰撞检测和接触检测是分开的,真实的事情,它有助于正确地使用术语。不幸的是,其他人所指的是“碰撞检测”意味着SK中的接触检测。 – 2016-07-20 09:44:52