我想知道是否可以使用 spritekit 缩放父节点而不缩放其子节点?因为在游戏过程中我只想对节点的一部分(在我的例子中是其父节点)运行缩放操作。因此,如果有人可以提供帮助,我会很高兴。
Sprite Kit依赖于zRotation,xScale和yScale,而不仅仅是转换属性.是因为Apple需要旋转和缩放值来计算具有更高性能的物理?
或者为什么他们不会简单地公开转换属性而不是单个属性进行旋转和缩放?
我使用以下代码定期生成SKNodes.有没有办法使这些SKNode的生成周期随机.具体来说,如何使下面的代码中的"delayFish"成为一个随机延迟的动作?
[self removeActionForKey:@"fishSpawn"];
SKAction* spawnFish = [SKAction performSelector:@selector(spawnLittleFishes) onTarget:self];
SKAction* delayFish = [SKAction waitForDuration:3.0/_moving.speed];
SKAction* spawnThenDelayFish = [SKAction sequence:@[spawnFish, delayFish]];
SKAction* spawnThenDelayFishForever = [SKAction repeatActionForever:spawnThenDelayFish];
[self runAction:spawnThenDelayFishForever withKey:@"fishSpawn"];
Run Code Online (Sandbox Code Playgroud) 我在SKScene中有这个代码:
override func touchesBegan(touches: NSSet!, withEvent event: UIEvent!) {
var touch: AnyObject = touches.anyObject()
var point = getPoint(touch.locationInNode(self))
var name = NSStringFromCGPoint(point)
for children in self.children {
if (children as SKSpriteNode).name == name {
println("exist!")
}
}
var tempNode = self.childNodeWithName(name)
}
Run Code Online (Sandbox Code Playgroud)
我看到"存在!" 在日志中,所以在children数组中有一个具有此名称的节点,但 tempNode为nil.该self.childNodeWithName("//" + name)呼叫也返回零.
for child in platformGroupNode.children {
CGPoint p = [child.superview convertPoint:child.center toNode:self.view ]
println(p)
}
Run Code Online (Sandbox Code Playgroud)
但是我不确定如何与SKSpriteNode孩子和SKNode父母一起使用。
我也没有运气尝试过
for child in platformGroupNode.children {
var pos = child.position
var viewPos = convertPoint(pos, toNode: self.parent!)
if viewPos.x < 0 {
println("Out of screen")
}
}
Run Code Online (Sandbox Code Playgroud) 我的问题是 HUD 没有保持在同一位置,而是随相机移动。
我正在尝试使用 Github 上找到的swift_boxxle代码创建一个 Sokoban 版本,
我添加了一个名为 mazeWorld 的新 SKNode、一个相机节点和一个 HUD 节点。
var mazeWorld: SKNode?
let cam = SKCameraNode()
var HUD: SKNode?
Run Code Online (Sandbox Code Playgroud)
在我的 didMoveToView 中,我将 mazeWorld 和 HUD 添加到场景中。
override func didMoveToView(view: SKView) {
HUD = SKNode()
addChild(HUD!)
mazeWorld = SKNode()
addChild(mazeWorld!)
self.camera = cam
...
initMenu()
}
Run Code Online (Sandbox Code Playgroud)
我正在使用更新函数将相机位置设置为玩家位置:
override func update(currentTime: CFTimeInterval) {
cam.position = player.sprite.position
}
Run Code Online (Sandbox Code Playgroud)
我还有另一个功能来设置菜单
func initMenu() {
menuReset.text = "[reset]"
menuReset.fontSize = 20
menuReset.fontColor = SKColor.whiteColor()
menuReset.position = CGPoint(x: self.size.width/2, y: self.size.height/2 …Run Code Online (Sandbox Code Playgroud) 我很惊讶 SKScene 类中的 update 方法实际上并不是从 SKNode 继承的。对我来说,所有 SKNode 都能够自我更新(例如,当场景不再显示时将其自身从场景中删除等)似乎是合乎逻辑的。我认为这将有助于使实例分离独立的实体(没有依赖性,没有意外行为)如果仅在场景中保留更新背后有其他逻辑,请解释。
所以我想知道是否值得使用计时器(以 1/60 时间间隔重复)来向我的自定义 SKNode 添加自定义更新(甚至可能是一个将其添加到所有 SKNode 的扩展)。然而,我想这将是相当内存密集型的。所以我想问是否有一些关于此的“最佳实践”。如果计时器在每一帧上触发而不是强制每秒触发 60 次,也许计时器会起作用。
如何停止此枚举?我有以下代码和Xcode抱怨我不能分配值让常量.停止可能是一件简单的事情,但我对Swift非常不满意,所以请耐心等待.
self.enumerateChildNodesWithName("//*") {
spaceshipNode, stop in
if (( spaceshipNode.name?.hasSuffix("ship") ) != nil) {
for enemyNode in self.children {
if (enemyNode.name == "enemy"){
if(enemyNode.containsPoint(spaceshipNode.position)){
self.gotoGameOverScene(spaceshipNode)
stop = true // Error: Cannot assign to value: 'stop' is a 'let' constant
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud) sknode ×8
sprite-kit ×8
swift ×4
ios ×3
enumeration ×1
hud ×1
iphone ×1
performance ×1
random ×1
scale ×1
skaction ×1
skspritenode ×1
swift2 ×1
treenode ×1