标签: skspritenode

在Swift中混合使用UIColors

我有两个SKSpriteNode,它们的颜色定义如下:

colorNode[0].color = UIColor(red: 255, green: 0, blue: 0, alpha: 1)
colorNode[1].color = UIColor(red: 0, green: 255, blue: 0, alpha: 1)
Run Code Online (Sandbox Code Playgroud)

我想让第三个SKSpriteNode用前两个的混合着色,结果应该是这样的:

colorNode[2].color = UIColor(red: 255, green: 255, blue: 0, alpha: 1)
Run Code Online (Sandbox Code Playgroud)

但有没有办法添加两个UIColors?像这样 :

colorNode[2].color = colorNode[0].color + colorNode[1].color
Run Code Online (Sandbox Code Playgroud)

colors color-blending sprite-kit skspritenode swift

6
推荐指数
3
解决办法
6131
查看次数

如何使用SKPhysicsBody复制SKSpriteNode?

我很好奇今天遇到的一种情况,当我试图将一个人SKSpriteNode从一个人复制SKScene到另一个人时.在下面的游乐场的输出中,您可以看到复制后都维护linearDamping和/ angularDamping或不维护(它们似乎都回退到默认值)

// PLAYGROUND_SW1.2 - SKSpriteNode Copy
import UIKit
import SpriteKit

// ORIGINAL
let spriteNode = SKSpriteNode()
spriteNode.name = "HAPPY_NODE"
let size = CGSize(width: 55.0, height: 150.0)
let physics = SKPhysicsBody(rectangleOfSize: size)
physics.linearDamping = 0.123
physics.angularDamping = 0.456
spriteNode.physicsBody = physics

// COPY
let spriteCopy = spriteNode.copy() as! SKSpriteNode

// ORIGINAL
spriteNode.name
spriteNode.physicsBody?.linearDamping
spriteNode.physicsBody?.angularDamping
spriteNode.physicsBody?.area

// COPY
spriteCopy.name
spriteCopy.physicsBody?.linearDamping
spriteCopy.physicsBody?.angularDamping
spriteCopy.physicsBody?.area
Run Code Online (Sandbox Code Playgroud)

游乐场输出 在此输入图像描述

我不确定我是否正确地复制了这两个SKSpriteNode并且SKPhysicsBody符合NSCopying如果你看看上面的输出area属性是在复制后维护的,据我所知这是基于创建size时指定的 …

copy sprite-kit skphysicsbody skspritenode swift

6
推荐指数
1
解决办法
2687
查看次数

在运行时更改SpriteNode PhysicsBody大小

我希望能够在用户向下滑动时更改节点的physicsBody高度,但除了重置整个physicsBody之外,还无法找到如何执行此操作.

当我最初加载节点时,我使用以下代码:

    nodeHero.color = UIColor .grayColor()
    nodeHero.size.width = 20
    nodeHero.size.height = 45
    nodeHero.position.x = -frame.size.width/2 + 45
    nodeHero.position.y = pointMainY + 30 + nodeHero.size.height/2
    nodeHero.zPosition = 110

    nodeHero.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(nodeHero.size.width, nodeHero.size.height))
    nodeHero.physicsBody?.mass = 1
    nodeHero.physicsBody?.angularVelocity = 0
    nodeHero.physicsBody?.allowsRotation = false
    nodeHero.physicsBody?.restitution = 0
    nodeHero.physicsBody?.categoryBitMask = bitHero

    addChild(nodeHero)
Run Code Online (Sandbox Code Playgroud)

当我向下滑动时,我希望能够做这样的事情(这不起作用):

    nodeHero.size.height = 28
    nodeHero.physicsBody?.size.height = 28
Run Code Online (Sandbox Code Playgroud)

但我必须再次使用nodeHero.physicsBody = SKPhysicsBody(),它会重置所有其他physicsBody属性,所以我必须这样做:

    nodeHero.size.height = 28

    nodeHero.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(nodeHero.size.width, nodeHero.size.height))
    nodeHero.physicsBody?.mass = 1
    nodeHero.physicsBody?.angularVelocity = 0
    nodeHero.physicsBody?.allowsRotation = false
    nodeHero.physicsBody?.restitution = 0
    nodeHero.physicsBody?.categoryBitMask = …
Run Code Online (Sandbox Code Playgroud)

size skphysicsbody skspritenode swift

6
推荐指数
1
解决办法
1200
查看次数

创建一个划分的地图Swift

我正在使用Swift在SpriteKit中创建一个游戏.游戏要求玩家能够使用这样的地图在美国选择某个州. 在此输入图像描述

是否有一个程序或技术可用于绘制状态的轮廓,并将每个状态转换为地图中自己的唯一节点?例如,我希望能够点击Illinois节点,然后让我的应用程序认识到我已经使用了伊利诺伊州.我不知道从哪里开始并理解这不是一件容易的事.任何帮助,将不胜感激.

image ios sprite-kit skspritenode swift

6
推荐指数
1
解决办法
199
查看次数

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
查看次数

如何在没有 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 SKPhysicsBody with Inner Edges

我创建了一个SKSpriteNode名为let的说Map,它具有我定义的边缘路径(一些简单的多边形形状).

我想弄清楚的是如何添加几个其他边缘路径作为Map的内部边缘.好像整个"地图"确实有漏洞.某种内部边界形状可以与Map作为一个整体起作用:一条边缘路径(如下所示)

在此输入图像描述 ©

我知道有一种方法可以创建一个SKPhysicsBodywith body(一些NSArray),就像这样

Map.physicsBody = [SKPhysicsBody bodyWithBodies:bodiesArray];
Run Code Online (Sandbox Code Playgroud)

这种方法实际上是否产生了我在图像中显示的内容?假设bodiesArray包含3 SKSpriteNode的每个都有一个使用这种方法的定义路径:

+ (SKPhysicsBody *)bodyWithEdgeChainFromPath:(CGPathRef)path
Run Code Online (Sandbox Code Playgroud)

,创造这样的道路

        SKSpriteNode *innerNode1 = [SKSpriteNode spriteNodeWithImageNamed:@"map"];

        CGMutablePathRef innerNode1Path = CGPathCreateMutable();

        CGPathMoveToPoint(mapPath, NULL, 1110, 1110);
        CGPathAddLineToPoint(mapPath, NULL, <some x1>, <some y1>);
        CGPathAddLineToPoint(mapPath, NULL, <some x2>, <some y2>);
        CGPathAddLineToPoint(mapPath, NULL, <some x3>, <some y3>);
        . 
        .
        .
        CGPathCloseSubpath(mapPath);

        innerNode1.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:innerNode1Path];
        [bodiesArray addObject:innerNode1];

        // Repeat for other 2 nodes
Run Code Online (Sandbox Code Playgroud)

我知道另一种方法是创建3个单独的节点,其中包含预期"洞"的位置和形状,但我想要避免创建比我需要的节点更多的节点.如果有人能够确认我想要做的是正确的,或者可能提出一个我不知道的替代方案. …

game-physics ios sprite-kit skphysicsbody skspritenode

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

为 SKLabelNode 中的单个角色设置动画

有没有一种更有效的方法来在一个 sklabelnode 中通过打字来为颤抖的文本制作动画?我正在尝试在一些游戏中实现这种效果,比如传说中的文字,当它们同时颤抖时,它们会出现打字机的风格。

到目前为止,我只能实现它,但幸运的是:

class TextEffectScene: SKScene {

    var typeWriterLabel : SKLabelNode?
    var shiveringText_L : SKLabelNode?
    var shiveringText_O : SKLabelNode?
    var shiveringText_S : SKLabelNode?
    var shiveringText_E : SKLabelNode?
    var shiveringText_R : SKLabelNode?

    var button : SKSpriteNode?


    override func sceneDidLoad() {
        button = self.childNode(withName: "//button") as? SKSpriteNode

        self.scaleMode = .aspectFill //Very important for ensuring that the screen sizes do not change after transitioning to other scenes

        typeWriterLabel = self.childNode(withName: "//typeWriterLabel") as? SKLabelNode
        shiveringText_L = self.childNode(withName: "//L") as? SKLabelNode
        shiveringText_O = self.childNode(withName: …
Run Code Online (Sandbox Code Playgroud)

sprite-kit skspritenode swift3

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

如何在 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
查看次数