确保节点可见

Posted

技术标签:

【中文标题】确保节点可见【英文标题】:Making Sure Nodes are visible 【发布时间】:2015-10-04 01:16:05 【问题描述】:

所以我有这个 sprite kit 游戏,它是用 swift 2 编码的。游戏包括从屏幕上掉下来的这些彩色圆圈(绿色、红色、紫色、黄色、蓝色),从相同的高度开始,但开始于不同的宽度。当圆圈到达屏幕底部时,调用可敬的方法。我遇到的问题是,随机的 x 位置有时会切掉一半的圆圈,因为它位于屏幕的一侧。如何防止圆圈剪裁屏幕的一侧?以下是当圆圈到达屏幕底部时调用的方法。

    func changeGreen()

    Green.position.y = frame.size.height * 0.9

    let PositionX = arc4random_uniform(UInt32(self.frame.width))

    Green.position.x = CGFloat(PositionX)



func changeRed()

    Red.position.y = frame.size.height * 0.9

    let PositionX = arc4random_uniform(UInt32(self.frame.width))

    Red.position.x = CGFloat(PositionX)



func changeBlue()   

    Blue.position.y = frame.size.height * 0.9

    let PositionX = arc4random_uniform(UInt32(self.frame.width))

    Blue.position.x = CGFloat(PositionX)



func changeYellow() 

    Yellow.position.y = frame.size.height * 0.9

    let PositionX = arc4random_uniform(UInt32(self.frame.width))

    Yellow.position.x = CGFloat(PositionX)



func changePurple() 

    Purple.position.y = frame.size.height * 0.9

    let PositionX = arc4random_uniform(UInt32(self.frame.width))

    Purple.position.x = CGFloat(PositionX)


【问题讨论】:

【参考方案1】:

假设 position.x 是圆的中心,我认为这样的事情可能会起作用:

let maxX = 350    // this is your frame width
let radius = 50   // radius of the circle
var positionX = Int(arc4random_uniform(UInt32(maxX - radius))) // max position of x is taken care of here


let pointsFromLeft = positionX - radius
if pointsFromLeft < 0 
    positionX -=  pointsFromLeft // move to the right if necessary

【讨论】:

【参考方案2】:

你必须从frame的两端偏移圆的radius,这样圆就不会被剪裁。

let radius = 20 // radius of your circle
let positionX = radius + arc4random_uniform(UInt32(self.frame.width - 2 * radius))

【讨论】:

您的解决方案也有效。我遇到了游戏场景宽度和高度与屏幕宽度和高度不同的问题,但我解决了这个问题。

以上是关于确保节点可见的主要内容,如果未能解决你的问题,请参考以下文章

为啥 java 5+ 中的 volatile 不能确保来自另一个线程的可见性?

如何修复确保文本在 webfont 加载期间保持可见

临界区是不是确保由一个线程修改的任何数据类型的共享变量对其他线程可见? [复制]

可见性原子性有序性

更正 MATHJAX 2.7.1 的 @font-face 以避免“确保文本在 Webfont 加载期间保持可见”错误

如何确保对象不会超出可见范围->opengl->c