Swift - 良好的随机节点生成SpriteKit

时间:2015-03-05 17:36:58

标签: swift random sprite-kit physics

我尝试创建一个游戏,你需要避开对象(节点),我不想在随机位置(屏幕外,右边)生成这些节点,并通过动作,节点越过屏幕向左。但是我怎样才能创建一个好的随机生成,以便在同一个位置上没有两个节点或者太近。

我在didMoveToView方法中有一个计时器:

nodeGenerationTimer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: Selector("nodeGeneration"), userInfo: nil, repeats: true)

每2秒生成节点的功能:

func nodeGeneration() {


    var randomX = CGFloat(Int(arc4random()) % sizeX)
    println(randomX)


    let node = SKSpriteNode(imageNamed: "node")
    node.anchorPoint = CGPointMake(0.5, 0.5)
    node.size.width = self.size.height / 8
    node.size.height = bin.size.width * (45/34)
    node.position = CGPointMake(self.size.width + randomX, ground1.size.height / 2 + self.size.height / 14)
    node.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: node.size.width, height: node.size.height))
    node.physicsBody?.dynamic = false
    self.addChild(node)

    let moveAction = SKAction.moveByX(-1, y: 0, duration: 0.005)
    let repeatMoveAction = SKAction.repeatActionForever(moveAction)
    node.runAction(repeatMoveAction)


}

我还有第二个问题,想象一下你需要避开物体的游戏,但你可以跳过它,是否有可能检测到用户是否与节点一侧发生碰撞,或者是否跳到了顶部。我认为还有另一种方法,而不是在侧面创建一个物理身体,一个在顶部!

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

对于问题1:保留一个可以从中产生敌人的可能位置列表。创建敌人时,请从列表中删除。当敌人完成其动作并被摧毁/离开屏幕时,则替换其在列表上的起始位置。每当你掷骰子以产生随机敌人时,你实际上只是在你的列表中选择可能的起始位置。

//Create your array and populate it with potential starting points
var posArray = Array<CGPoint>()
posArray.append((CGPoint(x: 1.0, y: 1.0))
posArray.append((CGPoint(x: 1.0, y: 2.0))
posArray.append((CGPoint(x: 1.0, y: 3.0))

//Generate an enemy by rolling the dice and 
//remove its start position from our queue
let randPos = Int(arc4random()) % posArray.count
posArray[randPos]
posArray.removeAtIndex(randPos)

...

//Play game and wait for enemy to die
//Then repopulate the array with that enemy's start position
posArray.append(enemyDude.startPosition)

对于问题2:您可以访问节点的x和y坐标,这样您就可以使用单个物理主体来适当地处理碰撞。只需将对象的底部X与障碍物的顶部Y进行比较,您就会知道自己是在顶部还是侧面。