gpt4 book ai didi

ios - 在 Swift 3 中删除与 SKPhysicsWorld 边界接触的 SKNode

转载 作者:行者123 更新时间:2023-11-30 13:16:51 25 4
gpt4 key购买 nike

我希望为 IOS 应用程序创建一个独特的打开屏幕,并且我希望有一个球落下的背景来创造视觉兴趣。我正在 didMove() 函数中创建球,它们工作正常,但只是在某些时候。我认为框架对于显示器来说太大,这使得随机 X 和 Y 坐标有时出现在屏幕之外。

self.physicsWorld.gravity = CGVector.init(dx: 0, dy: -9.8)

let sceneBody = SKPhysicsBody(edgeLoopFrom: self.frame)
sceneBody.friction = 0
self.physicsBody = sceneBody

let minXValue: CGFloat = 0
let maxXValue: CGFloat = self.frame.size.width

let minYValue: CGFloat = 0
let maxYValue: CGFloat = self.frame.size.height

let wait = SKAction.wait(forDuration: 0.4)
let run = SKAction.run {


let randomXNumber = (CGFloat(arc4random()).truncatingRemainder(dividingBy: maxXValue)) + minXValue
let randomYNumber = (CGFloat(arc4random()).truncatingRemainder(dividingBy: maxYValue)) + minYValue

print("Random Y Number: \(randomYNumber)")
print("Random X Number: \(randomXNumber)")

let ball = SKShapeNode(circleOfRadius: 20)
ball.fillColor = SKColor(colorLiteralRed: 212.0, green: 217.0, blue: 128.0, alpha: 1)
ball.position = CGPoint.init(x: randomXNumber, y: randomYNumber)
ball.physicsBody = SKPhysicsBody(circleOfRadius: 20)
ball.physicsBody?.affectedByGravity = true
self.addChild(ball)

}

self.run(SKAction.repeatForever(SKAction.sequence([wait, run])))

这是我的随机球代码。

我还希望这些球在撞击容器底部时从 View 中移除,以便提高所有设备上的性能并且没有冗余节点。

我需要哪个函数或代码块来实现这个概念?

最佳答案

设置场景大小
在 GameViewController.swift 中找到函数 viewDidLoad 并在 skView.presentScene(scene) 上方添加以下行

scene.size  = skView.bounds.size 

从 View 中移除球
要从场景中移除球,您可以检测场景周围的 EdgeLoop 与球之间何时发生碰撞。然后在球上调用removeFromParent。

首先,像这样更改类声明:
GameScene 类:SKScene、SKPhysicsContactDelegate
然后添加didMoveToView 中的
physicalsWorld.contactDelegate = self

其次,在 GameScene.swift 中的类声明上方,创建物理类别:

enum PhysicsCategory:UInt32
{
case edge = 1
case ball = 2
}

接下来,将这些类别分配给边缘和球。 (在 sceneBody 下添加前两行,并在定义其他球物理属性的位置插入第三行):

self.physicsBody?.categoryBitMask = PhysicsCategory.edge.rawValue
self.physicsBody?.contactTestBitMask = PhysicsCategory.ball.rawValue
ball.physicsBody?.categoryBitMask = PhysicsCategory.ball.rawValue

最后,检查是否有冲突:

func didBeginContact(contact: SKPhysicsContact) {
let firstBody = contact.bodyA
let secondBody = contact.bodyB

if firstBody.categoryBitMask == PhysicsCategory.edge.rawValue && secondBody.categoryBitMask == PhysicsCategory.ball.rawValue || firstBody.categoryBitMask == PhysicsCategory.ball.rawValue && secondBody.categoryBitMask == PhysicsCategory.edge.rawValue
{
if firstBody.categoryBitMask == PhysicsCategory.ball.rawValue {
firstBody.node?.removeFromParent()
} else {
secondBody.node?.removeFromParent()
}
}

关于ios - 在 Swift 3 中删除与 SKPhysicsWorld 边界接触的 SKNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38129175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com