gpt4 book ai didi

ios - 来自关卡编辑器的 SpriteKit 引用节点

转载 作者:搜寻专家 更新时间:2023-11-01 06:38:57 24 4
gpt4 key购买 nike

我正在使用 SpriteKit 中的场景编辑器来放置彩色 Sprite 并使用属性检查器为它们分配纹理。我的问题是试图找出如何从我的 GameScene 文件中引用这些 Sprite 。例如,我想知道 Sprite 何时与我的主角有一定距离。

编辑 - 添加代码
我添加代码是因为出于某种原因,appzYourLife 的答案在一个简单的测试项目中效果很好,但在我的代码中却不行。我能够使用 Ron Myschuk 的答案,我也将其包含在下面的代码中以供引用。 (不过,在我现在看来,我认为元组数组对我来说太过分了。)如您所见,我有一个带有一些简单动画的 Satellite 类。有一个 LevelManager 类用正确的对象替换场景编辑器中的节点。最后,所有内容都添加到 GameScene.swift 中的世界节点。

卫星类

func spawn(parentNode:SKNode, position: CGPoint, size: CGSize = CGSize(width: 50, height: 50)) {
parentNode.addChild(self)
createAnimations()
self.size = size
self.position = position
self.name = "satellite"
self.runAction(satAnimation)
self.physicsBody = SKPhysicsBody(circleOfRadius: size.width / 2)
self.physicsBody?.affectedByGravity = false
self.physicsBody?.categoryBitMask = PhysicsCategory.satellite.rawValue
self.physicsBody?.contactTestBitMask = PhysicsCategory.laser.rawValue
self.physicsBody?.collisionBitMask = 0
}

func createAnimations() {
let flyFrames:[SKTexture] = [textureAtlas.textureNamed("sat1.png"),
textureAtlas.textureNamed("sat2.png")]
let flyAction = SKAction.animateWithTextures(flyFrames, timePerFrame: 0.14)
satAnimation = SKAction.repeatActionForever(flyAction)

let warningFrames:[SKTexture] = [textureAtlas.textureNamed("sat8.png"),
textureAtlas.textureNamed("sat1.png")]
let warningAction = SKAction.animateWithTextures(warningFrames, timePerFrame: 0.14)
warningAnimation = SKAction.repeatActionForever(warningAction)
}

func warning() {
self.runAction(warningAnimation)
}

层级管理类

import SpriteKit

class LevelManager
{
let levelNames:[String] = ["Level1"]
var levels:[SKNode] = []

init()
{
for levelFileName in levelNames {
let level = SKNode()
if let levelScene = SKScene(fileNamed: levelFileName) {
for node in levelScene.children {
switch node.name! {
case "satellite":
let satellite = Satellite()
satellite.spawn(level, position: node.position)
default: print("Name error: \(node.name)")
}
}
}
levels.append(level)
}
}

func addLevelsToWorld(world: SKNode)
{
for index in 0...levels.count - 1 {
levels[index].position = CGPoint(x: -2000, y: index * 1000)
world.addChild(levels[index])
}
}
}

GameScene.swift - didMoveToView

world = SKNode()
world.name = "world"
addChild(world)

physicsWorld.contactDelegate = self

levelManager.addLevelsToWorld(self.world)
levelManager.levels[0].position = CGPoint(x:0, y: 0)

//This does not find the satellite nodes
let satellites = children.flatMap { $0 as? Satellite }

//This does work
self.enumerateChildNodesWithName("//*") {
node, stop in
if (node.name == "satellite") {
self.satTuple.0 = node.position
self.satTuple.1 = (node as? SKSpriteNode)!
self.currentSatellite.append(self.satTuple)
}
}

最佳答案

障碍类

首先,您应该像这样创建一个 Obstacle 类。

class Obstacle: SKSpriteNode { }

现在进入场景编辑器,将 Obstacle 类关联到您的障碍物图像

enter image description here

玩家类

对Player做同样的事情,创建一个类

class Player: SKSpriteNode { }

并将其关联到您的玩家 Sprite 。

检查碰撞

现在进入 GameScene.swift 像这样更改 updated 方法

override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */

let obstacles = children.flatMap { $0 as? Obstacle }
let player = childNodeWithName("player") as! Player

let obstacleNearSprite = obstacles.contains { (obstacle) -> Bool in
let distance = hypotf(Float(player.position.x) - Float(obstacle.position.x), Float(player.position.y) - Float(obstacle.position.y))
return distance < 100
}

if obstacleNearSprite {
print("Oh boy!")
}

}

它有什么作用?

第一行检索场景中的所有障碍物。第二行检索播放器(如果不存在则崩溃)。

接下来,如果距离 Player 不超过 100 点处有至少一个障碍物,它会将真值放入 obstacleNearSprite 常量。

最后使用obstacleNearSprite 打印一些东西。

优化

更新后的方法每秒被调用 60 次。我们把这两行放进去

let obstacles = children.flatMap { $0 as? Obstacle }
let player = childNodeWithName("player") as! Player

为了检索我们需要的 Sprite 。对于现代硬件,这不是问题,但您应该保存对 Obstacle 和 Player 的引用,而不是在每一帧中搜索它们。

构建一个不错的游戏;)

关于ios - 来自关卡编辑器的 SpriteKit 引用节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37931191/

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