我尝试创建一个游戏,你需要避开对象(节点),我不想在随机位置(屏幕外,右边)生成这些节点,并通过动作,节点越过屏幕向左。但是我怎样才能创建一个好的随机生成,以便在同一个位置上没有两个节点或者太近。
我在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)
}
我还有第二个问题,想象一下你需要避开物体的游戏,但你可以跳过它,是否有可能检测到用户是否与节点一侧发生碰撞,或者是否跳到了顶部。我认为还有另一种方法,而不是在侧面创建一个物理身体,一个在顶部!
感谢您的帮助!
答案 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进行比较,您就会知道自己是在顶部还是侧面。