标签: skspritenode

有没有办法检测2个SKSpriteNodes之间的碰撞,但允许它们重叠

我认为没有办法做到这一点,但有没有办法检测2个SKSpriteNodes何时相互交叉,但仍然允许它们重叠,所以它们实际上并没有相互反弹?

我知道我可以只有一个没有物理体,然后写一些代码来检查他们的坐标,但我想也许我可能会在Sprite Kit中遗漏一些东西,我可以用SK方法检测到它.

objective-c ios sprite-kit skspritenode

5
推荐指数
1
解决办法
2105
查看次数

在Sprite-Kit中更改精灵图像

有没有办法改变已经用另一个图像初始化的精灵的图像?

我试过了:

if ([node.name isEqualToString:@"NameX"]) {
        SKAction *fadeOut = [SKAction fadeOutWithDuration:0.3];
        SKAction *fadeIn = [SKAction fadeInWithDuration:0.3];

       [self.sprite runAction:fadeOut];

       [self runAction:fadeOut completion:^{

             self.sprite = [SKSpriteNode spriteNodeWithImageNamed:@"NameY"];

             [self.sprite runAction:fadeIn]

            }];
Run Code Online (Sandbox Code Playgroud)

}

objective-c sprite-kit skspritenode

5
推荐指数
1
解决办法
5080
查看次数

Swift SKSpriteNode:检测Tap/DoubleTap/LongPress

我正在尝试创建SKSpriteNode的子类,它可以检测用户交互(点按,双击并按住),然后按照委托.在我看来,这似乎是一个相对普遍的需求,但是:

  1. 该代码无法在不触发单击的情况下检测到双击.
  2. 我还没有找到一种检测保持/长按动作的方法.

我错了吗?我不禁觉得SpriteKit应该有一些标准来处理这么基本的东西.我知道有UIGestureRecognizer,但它似乎与特定的SKNode而不是UIViews非常兼容.

这就是我目前所拥有的.基于Apple的示例,我在主类文件中包含了所有非设备特定的代码:

import SpriteKit

enum ActionType: Int {
    case Single
    case Double
    case Hold
}

protocol EnvironmentElementDelegate {
    func handleActionOnElement(element: EnvironmentElement, actionType: ActionType)
}

class EnvironmentElement: SKSpriteNode {

    let delegate: EnvironmentElementDelegate!

    init(imageNamed: String, elementNamed: String, delegate: EnvironmentElementDelegate) {
        self.delegate = delegate
        let texture = SKTexture(imageNamed: imageNamed)
        super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())
        self.name = elementNamed
        userInteractionEnabled = true
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}
Run Code Online (Sandbox Code Playgroud)

...然后将所有特定于iOS的代码放在单独的扩展文件中:

import SpriteKit

extension EnvironmentElement {

    override func touchesBegan(touches: …
Run Code Online (Sandbox Code Playgroud)

user-interface ios sprite-kit skspritenode swift

5
推荐指数
1
解决办法
3097
查看次数

使用Sprite Kit的辅助功能(配音)

我试图在具有固定板的益智游戏中添加对Voice Over accessibility的支持.但是,我很难UIAccessibilityElements出现.

现在我重写accessibilityElementAtIndex,accessibilityElementCountindexOfAccessibilityElement在我的SKScene.

他们返回一组可访问的元素:

func loadAccessibleElements()
{
    self.isAccessibilityElement = false

    let pieces = getAllPieces()

    accessibleElements.removeAll(keepCapacity: false)
    for piece in pieces
    {
        let element = UIAccessibilityElement(accessibilityContainer: self.usableView!)

        element.accessibilityFrame = piece.getAccessibilityFrame()
        element.accessibilityLabel = piece.getText()
        element.accessibilityTraits = UIAccessibilityTraitButton
        accessibleElements.append(element)
    }
}
Run Code Online (Sandbox Code Playgroud)

其中piece是子类,SKSpriteNodegetAccessibilityFrame定义为:

func getAccessibilityFrame() -> CGRect
{
    return parentView!.convertRect(frame, toView: nil)
}
Run Code Online (Sandbox Code Playgroud)

现在,一个(尺寸错误的)accessibility元素似乎出现在错误的地方.

有人能指出我正确的方向吗?

非常感谢

编辑:
我已经尝试了一个hack-ish工作,将UIView放在SKView上,UIButton元素放在与SKSpriteNodes相同的位置.但是,可访问性仍然不希望工作.视图按如下方式加载:

func loadAccessibilityView()
{
    view.isAccessibilityElement = false
    view.accessibilityElementsHidden = false
    skView.accessibilityElementsHidden = …
Run Code Online (Sandbox Code Playgroud)

uiaccessibility sprite-kit skspritenode swift

5
推荐指数
1
解决办法
1850
查看次数

如何在没有 SKTexture 的情况下更改 didBeginContact 中的 SKSpriteNode 大小和颜色?

我一直在使用 SKTexture 按以下方式更改 didBeginContact 中的 SKSpriteNode 颜色和大小。

if firstBody.categoryBitMask == spriteCategory && secondBody.categoryBitMask == enemyCategory    {
     var newSprite = firstBody.node
     let newImage = SKTexture(imageNamed: "newSprite.png")
     (newSprite as? SKSpriteNode)?.size = newImage.size() //magic
     oldToNewSpriteAction = SKAction.setTexture(newImage)
     newSprite!.runAction(oldToNewSpriteAction)
 }
Run Code Online (Sandbox Code Playgroud)

现在我正在创建一个没有 SKTextures 的示例代码,按以下方式设置我的 SKSpriteNodes:

oldSprite = SKSpriteNode(color: SKColor.blueColor(), size: oldSpriteSize)
newSprite = SKSpriteNode(color: SKColor.BrownColor(), size: newSpriteSize)
Run Code Online (Sandbox Code Playgroud)

如何在没有 SKTextures 的情况下更改 didBeginContact 中的精灵颜色和大小?

sprite-kit skspritenode swift swift2

5
推荐指数
1
解决办法
4550
查看次数

在SpriteKit SWIFT中获取SKReferenceNode的子节点

我在一个SKSpriteNode(名称:square)和一个SKLabel(name:label)中创建了一个场景Case.sks(使用Level Editor).在我的主场景GameScene.sks中,我使用带有"Case"的SKReferenceNode作为参考.

我需要从我的主场景中访问"方形"精灵.

我的第一个想法是直接调用子节点:

 let firstSquare = childNode(withName: "square") as! SKSpriteNode
Run Code Online (Sandbox Code Playgroud)

但我得到了:

 Fatal error: unexpectedly found nil while unwrapping an Optional value
Run Code Online (Sandbox Code Playgroud)

所以我尝试过:

 let caseRef = childNode(withName: "Case") as! SKReferenceNode
 let firstSquare = caseRef.childNode(withName: "square") as! SKSpriteNode
Run Code Online (Sandbox Code Playgroud)

但我得到了第一个广场线:

 Fatal error: unexpectedly found nil while unwrapping an Optional value
Run Code Online (Sandbox Code Playgroud)

如何获取参考场景的子节点?

sprite-kit skspritenode swift skreferencenode xcode8-beta2

5
推荐指数
1
解决办法
2323
查看次数

在Swift 3中获取SKSpriteNode的文件名

如何从SKSpriteNode?访问图像文件名?我一直试图谷歌这个,但似乎没有答案可用.这是我的代码中无用的部分:

current_ingredient?.name = String(describing: current_ingredient?.texture)

print("Filename: \(current_ingredient?.name)")
Run Code Online (Sandbox Code Playgroud)

print命令返回:

Filename: Optional("Optional(<SKTexture> \'ingredient14\' (110 x 148))")
Run Code Online (Sandbox Code Playgroud)

所以,问题是,我怎么才得到"ingredient14"?

sprite-kit skspritenode swift swift3

5
推荐指数
2
解决办法
879
查看次数

iOS:如何设置SKSpriteNode的程序化alpha掩码

我能够在项目的.sks文件中设置我自己的自定义对象的alpha掩码,但我不知道如何以编程方式进行.

xcode ios sprite-kit skspritenode swift

5
推荐指数
1
解决办法
941
查看次数

如何在 SpriteKit 中创建图像节点?斯威夫特 4

有人在我的其他问题之一中告诉我SpriteKitUI. 我在网上搜索了如何开始使用SpriteKit,我得到了这个:https : //www.raywenderlich.com/145318/spritekit-swift-3-tutorial-beginners。我把图片和所有东西都放进去了,我把这段代码放在了:

import SpriteKit

class GameScene: SKScene {

  // 1
  let player = SKSpriteNode(imageNamed: "player")
  override func didMove(to view: SKView) {
     // 2
     backgroundColor = SKColor.white
     // 3
     player.position = CGPoint(x: size.width * 0.1, y: size.height * 0.5)
     // 4
     addChild(player)
  }
}
Run Code Online (Sandbox Code Playgroud)

(他们让我输入的代码),当我运行它时,我只看到一个空白屏幕。在教程中,它有一个忍者,但我的只是一个空白屏幕。

有人能帮忙吗?

sprite-kit skspritenode swift

5
推荐指数
1
解决办法
3929
查看次数

如何用一根手指“触摸并拖动”旋转 SpriteNode

如何用一根手指“触摸并拖动”旋转 SpriteNode,以便:

  • 它不会晃来晃去
  • 它围成一圈(我已经成功地完成了这部分几次 - 仅使用代码解决方案和使用 SKS 文件)
  • 它产生一个有意义的值(就像物理控制旋钮一样)
  • 当我的手指在它上面时它会移动但当我的手指离开时它不会

我尝试过的事情:

使用 CGAffineTransform 的 CGAffineTransformMakeRotation来影响 SpriteKit 中旋钮的旋转。但我无法弄清楚如何在 SpriteNode 上使用 CGAffineTransformMakeRotation。我可以将不同类型的对象放入我的场景中或在它上面,但这是不对的。

例如,Matthijs Hollemans 的 MHRotaryKnob https://github.com/hollance/MHRotaryKnob 。我将 Hollemans 旋钮从 Objective C 转换为 Swift 4,但在尝试在 SpriteKit 中使用它来旋转精灵时遇到了麻烦。我不明白,因为我不知道如何knobImageView.transform = CGAffineTransformMakeRotation (newAngle * M_PI/180.0);在 Swift 中使用 SpriteKit。我知道我可以使用 Hollemans Objective C 类并将 UIImage 推送到我的场景顶部,但这似乎不是最好也最优雅的解决方案。

我还将Wex的解决方案从 Objective C 翻译成 Swift Rotate image on center using a finger touch Using Allan Weir的关于处理代码中 CGAffineTransform 部分的建议/sf/answers/2920685281/ 但是那不起作用。

我试过直接在我的精灵上设置zRotation而不使用 .physicalBody …

ios sprite-kit skspritenode swift swift4.1

5
推荐指数
1
解决办法
871
查看次数