【发布时间】:2016-06-24 21:16:06
【问题描述】:
我似乎对SpriteKit 中与碰撞检测、动作或位置相关的内容了解甚少。
我有一个玩家和积木,当一个玩家落在任何积木上时,他会跳过积木,然后所有积木都会向下移动一段距离。我将玩家添加为场景的子节点,将砖块添加为包含它们的节点 (SKNode) 的子节点。当我想改变它们的 y 位置时,我只需在该节点上使用 moveBy 操作,砖块确实会按照我想要的方式移动。
问题是,当他们移动甚至停止时,玩家不能再降落在他们身上(他们和玩家之间的碰撞不再被检测到),所以玩家只是从他们身上掉下来。
这是我在GameScene.swift中的代码:
func moveBricksDownFor(movedForY: CGFloat) {
let moveAction = SKAction.moveBy(CGVectorMake(0, -movedForY), duration: 1.0)
brickNode.runAction(moveAction)
for _ in 0...4 {addBrick(0.7)}
}
func playerCollidedWithBrick(brick: Brick) {
if player.position.y > brick.position.y {
player.physicsBody?.velocity.dy = player.maxVelocityY
}
if player.yChangedFor() > 70 {moveBricksDownFor(player.yChangedFor())}
}
物理体是否可能没有附加到砖块的视觉表示或类似的东西上?
这里也是Player类(上面代码中用到的部分):
let maxVelocityY: CGFloat = 900
var startPositionY: CGFloat!
init(position: CGPoint) {
let texture = SKTexture(imageNamed: "doodler.png")
super.init(texture: texture, color: UIColor.blackColor(), size: CGSizeMake(60, 60))
self.zPosition = Layer.player.rawValue
self.position = position
self.startPositionY = position.y
self.physicsBody = SKPhysicsBody(rectangleOfSize: self.size)
self.physicsBody?.affectedByGravity = true
self.physicsBody?.allowsRotation = false
self.physicsBody?.dynamic = true
self.physicsBody?.categoryBitMask = PhysicsCategory.Player
self.physicsBody?.contactTestBitMask = PhysicsCategory.Brick
self.physicsBody?.collisionBitMask = PhysicsCategory.None
self.physicsBody?.usesPreciseCollisionDetection = true
}
func yChangedFor() -> CGFloat {
return (self.position.y - startPositionY)
}
我在谷歌上搜索了类似的主题,但没有发现任何类似的问题,所以我想我在这里遗漏了一些基本的东西,或者犯了一个愚蠢的错误。
更新(添加Brick类和worldNode的初始化(SKNode)):
class Brick: SKSpriteNode {
init(position:CGPoint) {
let texture = SKTexture(imageNamed: "brick.png")
super.init(texture: texture, color: UIColor.clearColor(), size: CGSizeMake(70, 10))
self.position = position
self.zPosition = Layer.brick.rawValue
self.physicsBody = SKPhysicsBody(rectangleOfSize: self.size)
self.physicsBody?.affectedByGravity = false
self.physicsBody?.allowsRotation = true
self.physicsBody?.dynamic = false
self.physicsBody?.categoryBitMask = PhysicsCategory.Brick
self.physicsBody?.contactTestBitMask = PhysicsCategory.Player
self.physicsBody?.collisionBitMask = PhysicsCategory.None
self.physicsBody?.usesPreciseCollisionDetection = true
}
}
设置brickNode 并将砖块添加到它的子代:
func setupBrickNode() {
brickNode.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
brickNode.physicsBody?.affectedByGravity = false
}
func addBrick(minXPercantage: CGFloat) {
let randomX = random(min: size.width*0.25, max: size.width - 100)
let randomY = random(min: size.height*minXPercantage, max: size.height)
let brick = Brick(position: CGPointMake(randomX, randomY))
brickNode.addChild(brick)
}
func setupBricks() {
for _ in 0...10 {addBrick(0.25)}
}
更新了我移动 brickNode 的部分(现在设置了它的速度):
func moveBricks() {
brickNode.physicsBody?.velocity = CGVectorMake(0, -player.maxVelocityY/4)
let waitAction = SKAction.waitForDuration(1.0)
let setBrickNodeVelocityToZero = SKAction.runBlock({self.brickNode.physicsBody?.velocity = CGVectorMake(0, 0)})
runAction(SKAction.sequence([waitAction, setBrickNodeVelocityToZero]))
}
func playerCollidedWithBrick(brick: Brick) {
if player.position.y > brick.position.y {
player.physicsBody?.velocity.dy = player.maxVelocityY
moveBricks()
}
}
【问题讨论】:
-
看我的第二个回答。希望对您有所帮助。
标签: swift sprite-kit