如何限制SKSpriteNodes的位置(在我的情况下) [英] How do I constrict where SKSpriteNodes fall (in my case)

查看:106
本文介绍了如何限制SKSpriteNodes的位置(在我的情况下)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好的,所以我正在制作一个游戏,其中的东西落在屏幕上,它随机地随机地在X值的顶部产生。有时当它们产卵时,它们会非常靠近屏幕的边缘,直到很难看到它们。所以我需要的是一些让它们产生距离边缘更远的方法。这是我的代码

} * / 
func spawnChlorine(){
var Chlorine = SKSpriteNode(imageNamed: Chlorine.png

var minValue = self .size.width / 8
var maxValue = self .size.width - 20
var spawnPoint = UInt32 ( maxValue - minValue)
Chlorine.position = CGPoint(x:CGFloat(arc4random_uniform(spawnPoint)),y: self .size.height)
action = SKAction.moveToY(-20,持续时间: 5 0
actionDone = SKAction.removeFromParent()
Chlorine.runAction(SKAction.sequence([action, actionDone]))
Chlorine.runAction(SKAction.repeatActionForever(action))
Chlorine.physicsBody = SKPhysicsBody(rectangleOfSize:Chlorine.size)
Chlorine.physicsBody?.categoryBitMask = PhysicsCatagory.Chlorine
Chlorine.physicsBody?.contactTestBitMask = PhysicsCatagory.Shot
Chlorine.physicsBody?.affectedByGravity = true
Chlorine.physicsBody?.dynamic = true
self .addChild(Chlorine)
}

解决方案

相当简单。



计算一次全局变量中的值。



可以说:

玩场宽度是800

从边缘掉落是100

sprite宽度是30

下降宽度计算

下降偏移计算



  var  fw =  800  
var de = 100
var sw = 30

var dw = fw-2 * de
var = de-sw / 2





并且在你的函数中,改为这一行

 Chlorine.position = CGPoint(x:CGFloat(arc4random_uniform(dw)+ do),y: self  .size.height)





变量名由你决定。 />


更新:我不知道swift,但这个改变应该适合

  func  spawnChlorine(){
var Chlorine = SKSpriteNode(imageNamed: Chlorine.png

var fw = self .size.width
< span class =code-keyword> var de = 100
var sw = 30

var dw = UInt32 (fw-2 * de) // dw是下降的宽度
var ok = UInt32 (de-sw / 2) // ok是使液滴居中的偏移量
Chlorine.position = CGPoint(x:CGFloat(arc4random_uniform(dw) + ok),y: self .size.height)
action = SKAction.moveToY(-20,持续时间: 5 0
actionDone = SKAction.removeFromParent()
Chlorine.runAction(SKAction.sequence([action,actionDone]) )
Chlorine.runAction(SKAction.repeatActionForever(action))
Chlorine.physicsBody = SKPhysicsBody(rectangleOfSize:Chlorine.size)
Chlorine.physicsBody?.categoryBitMask = PhysicsCatagory.Chlorine
Chlorine.physicsBody?.contactTestBitMask = PhysicsCatagory.Shot
Chlorine.physicsBody?.affectedByGravity = true
Chlorine.physicsBody?.dynamic = true
self .addChild(Chlorine)
}


Ok so I am making a game where things fall down the screen, its at a random where they spawn at the top on the X value randomly. sometimes when they spawn they go really close to the edge of the screen to the point where they are hard to see. So what I need is some way to make them spawn a little bit farther away from the edges. here is my code

}*/
    func spawnChlorine(){
        var Chlorine = SKSpriteNode(imageNamed: "Chlorine.png")
        
        var minValue = self.size.width / 8
        var maxValue = self.size.width - 20
        var spawnPoint = UInt32(maxValue - minValue)
        Chlorine.position = CGPoint(x: CGFloat (arc4random_uniform (spawnPoint )) ,y: self.size.height)
        let action = SKAction.moveToY(-20, duration: 5.0)
        let actionDone = SKAction.removeFromParent()
        Chlorine.runAction(SKAction.sequence([action, actionDone]))
        Chlorine.runAction(SKAction.repeatActionForever(action))
        Chlorine.physicsBody = SKPhysicsBody(rectangleOfSize: Chlorine.size)
        Chlorine.physicsBody?.categoryBitMask = PhysicsCatagory.Chlorine
        Chlorine.physicsBody?.contactTestBitMask = PhysicsCatagory.Shot
        Chlorine.physicsBody?.affectedByGravity = true
        Chlorine.physicsBody?.dynamic = true
        self.addChild(Chlorine)
    }

解决方案

Rather simple.

compute once the values in global variable.

Lets say:
play field width is 800
drop from edge is 100
sprite width is 30
drop width is computed
drop offset is computed

var fw= 800
var de= 100
var sw= 30

var dw= fw-2*de
var do= de-sw/2



and in your function, change to this line

Chlorine.position = CGPoint(x: CGFloat (arc4random_uniform (dw )+do) ,y: self.size.height)



variable names are up to you.

Update: I don't know swift, but this change should fit

func spawnChlorine(){
    var Chlorine = SKSpriteNode(imageNamed: "Chlorine.png")

    var fw= self.size.width
    var de= 100
    var sw= 30

    var dw= UInt32(fw-2*de) // dw is the narrow width of drop
    var ok= UInt32(de-sw/2) // ok is an offset to center the drops
    Chlorine.position = CGPoint(x: CGFloat (arc4random_uniform (dw )+ok) ,y: self.size.height)
    let action = SKAction.moveToY(-20, duration: 5.0)
    let actionDone = SKAction.removeFromParent()
    Chlorine.runAction(SKAction.sequence([action, actionDone]))
    Chlorine.runAction(SKAction.repeatActionForever(action))
    Chlorine.physicsBody = SKPhysicsBody(rectangleOfSize: Chlorine.size)
    Chlorine.physicsBody?.categoryBitMask = PhysicsCatagory.Chlorine
    Chlorine.physicsBody?.contactTestBitMask = PhysicsCatagory.Shot
    Chlorine.physicsBody?.affectedByGravity = true
    Chlorine.physicsBody?.dynamic = true
    self.addChild(Chlorine)
}


这篇关于如何限制SKSpriteNodes的位置(在我的情况下)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆