gpt4 book ai didi

swift - 将一个 SKSpritenode 移向另一个 SKSpriteNode(磁铁)

转载 作者:搜寻专家 更新时间:2023-10-31 19:29:12 26 4
gpt4 key购买 nike

我的目标:让一个 SKSpriteNode 移动到另一个 SKSpriteNodes 的位置。 (为我的 sprite kit 游戏创建磁铁)

嗨,我正在尝试让多个同名的 SKSpriteNode 移动并与一个我将称之为磁铁的 Sprite 节点发生碰撞我只是不明白我将在哪里或如何去做这件事,我已经尝试过使用这段代码,但我不知道该怎么做:

func update(_ currentTime: TimeInterval) {

let node = childNode(withName: "specialObstacle")

let magnetLocation = magnet.position
let specialObjectLocation = node?.position

let x = node?.position.x - magnetLocation.x
let y = node?.position.y - magnetLocation.y

}

注意:我的磁铁的位置会发生变化,因为用户将在屏幕上移动磁铁并希望它继续朝向磁铁移动,但我不知道如何做到这一点。

编辑 1

我尝试使用你的旋风代码,它似乎适用于 x 轴,但它似乎不适用于 y 轴,出于某种原因,它看起来像是试图下降但失败了,只是在一个轴上振动点。我在下面添加了我的代码和一张图片

whirlwind

这是我正在使用的代码:

 let playerLocation:CGPoint = self.convert(thePlayer.position, from: worldNode)

let location = playerLocation
let nodeSpeed:CGFloat = 3.5

worldNode.enumerateChildNodes(withName: "levelUnit"){
node, stop in

let levelUnit:LevelUnit = node as! LevelUnit //cast as an actual LevelUnit class


levelUnit.enumerateChildNodes(withName: "specialObstacle"){
node, stop in

//Aim
let dx = location.x - (node.position.x)
let dy = location.y - (node.position.y)
let angle = atan2(dy, dx)

node.zRotation = angle

//Seek
let vx = cos(angle) * nodeSpeed
let vy = sin(angle) * nodeSpeed

node.position.x += vx
node.position.y += vy

}
}

最佳答案

是这样的吗?

enter image description here

代码

首先是代码

import SpriteKit

class GameScene: SKScene {

let magnet = SKFieldNode.linearGravityField(withVector: vector_float3(0, 9.8 * 2, 0))
let circle = SKShapeNode(circleOfRadius: 30)
override func didMove(to view: SKView) {
circle.fillColor = .white
circle.position.x = 0
circle.position.y = frame.maxY
addChild(circle)

magnet.region = SKRegion(size: self.frame.size)
magnet.isEnabled = false
magnet.categoryBitMask = 0x1
circle.addChild(magnet)

self.physicsBody = SKPhysicsBody(edgeLoopFrom: frame)

for i in 0..<20 {
let ball = SKShapeNode(circleOfRadius: 30)
ball.fillColor = .yellow
ball.physicsBody = SKPhysicsBody(circleOfRadius: 30)
ball.position.x = CGFloat(i) * 10
ball.physicsBody!.fieldBitMask = 0x1
addChild(ball)
}

let ball = SKShapeNode(circleOfRadius: 30)
ball.fillColor = .green
ball.physicsBody = SKPhysicsBody(circleOfRadius: 30)
ball.position.y = 40
ball.physicsBody!.fieldBitMask = 0x2
addChild(ball)
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
circle.fillColor = .red
magnet.isEnabled = true
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
circle.fillColor = .white
magnet.isEnabled = false
}
}

它是如何工作的?

这里有核心概念

  1. 屏幕上方有一个SKFieldNode,其categoryBitMask为0x1
  2. 黄色球有一个物理体,fieldBitMask = 0x1(这将与 FieldNode 交互)
  3. 绿球有一个 fieldBitMask = 0x2 的物理体(这使得它不受 SKFieldNode 的影响)

最后,我只是在您触摸/取消触摸屏幕时打开/关闭 SKFieldNode。

哦,还有一个红色 Sprite 正好位于 SKFieldNode 的相同位置,但这只是出于 UI 原因。

关于swift - 将一个 SKSpritenode 移向另一个 SKSpriteNode(磁铁),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40667199/

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