标签: skspritenode

iOS SpriteKit如何使用app bundle中的文件夹创建一个带有图像的节点?

我正在尝试创建一个随机怪物的精灵,我的图像存储在主束中引用的文件夹中.

NSString* bundlePath = [[NSBundle mainBundle] bundlePath];
NSString* resourceFolderPath = [NSString stringWithFormat:@"%@/monsters", bundlePath];

NSArray* resourceFiles = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:resourceFolderPath  error:nil];

NSInteger randomFileIndex = arc4random() % [resourceFiles count];
NSString* randomFile = [resourceFiles objectAtIndex:randomFileIndex];

SKSpriteNode* tile = [SKSpriteNode spriteNodeWithImageNamed:randomFile];
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码时,我收到此错误

SKTexture: Error loading image resource: "random_monster.png"
Run Code Online (Sandbox Code Playgroud)

如果我从主包中引用图像,则代码有效.如何使用应用程序包中的文件夹中的随机图像并将其传递给SKSpriteNode?

objective-c ios ios7 sprite-kit skspritenode

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

为什么SKSpriteNode node.frame.size.width小于node.size.width?

为什么SKSpriteNode node.frame.size.width小于node.size.width?
这是示例代码,可能您需要插入自己的图像

- (void)DrawRect:(SKSpriteNode *)node
{
SKShapeNode *rect = [[SKShapeNode alloc] init];

CGMutablePathRef myPath = CGPathCreateMutable();
CGPathAddRect(myPath, nil, node.frame);
rect.path = myPath;
rect.lineWidth = 1;

rect.strokeColor = [SKColor whiteColor];
rect.glowWidth = 0;
[self addChild:rect];
}
Run Code Online (Sandbox Code Playgroud)

//这里绘制精灵

-(void) DrawSpriteNode
{
SKTextureAtlas *atlas = [SKTextureAtlas atlasNamed:@"character"];
SKSpriteNode* node = (SKSpriteNode *)[SKSpriteNode spriteNodeWithTexture:[atlas         textureNamed:@"testimage.png"]];

node.position = CGPointMake(self.anchorPoint.x, self.anchorPoint.y);
NSLog(@"node frame width x :%f",node.frame.size.width);
NSLog(@"node frame height y :%f",node.frame.size.height);
NSLog(@"node width y :%f",node.size.width);
NSLog(@"node height y :%f",node.size.height);

node.anchorPoint = CGPointMake(0.5, 0.5);
[self DrawRect: …
Run Code Online (Sandbox Code Playgroud)

ios sprite-kit skspritenode

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

在spritekit场景编辑器中使用自定义SKNode

我想使用我的自定义SKNode子类创建一个级别.我尝试将SKNode添加到场景编辑器中,并使用"自定义类"选项卡给出我想要它的类,但绝对没有.该节点仍然是空的,当我运行模拟器时没有任何显示.此外,为了确保该类实际工作,我以编程方式将它的一个实例添加到场景中,以查看它是否显示.

如何通过场景编辑器将自定义节点添加到场景中?

这是我的自定义类代码:

class Player: SKSpriteNode {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        print("Test")
        self.addChild(SKSpriteNode(imageNamed: "Player.png"))
    }
}
Run Code Online (Sandbox Code Playgroud)

xcode sprite-kit skspritenode skscene swift

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

带有UIImage的Swift SKSpriteNode

我在使用UIImage创建SKSpriteNode时遇到问题.我正在使用PaintCode创建我用于App的资源(PaintCode使用绘图方法和图像方法创建一个Swift文件,允许我显示创建的图像).

我现在的问题是我想使用我的PaintCode图像创建一个简单的SKSpriteNode,但我不知道如何将它们添加到SpriteNode.

我试过这样的事情(第18行):

let Bottom = SKSpriteNode(texture: SKTexture(image: StyleKitName.drawBottom(frame: CGRect(x: 50, y: 50, width: 50, height: 50), isWinter: false)))
Run Code Online (Sandbox Code Playgroud)

但它返回以下错误:

/Users/myMacName/Documents/App Development/AppName/AppName/GlobalFunctions.swift:18:44: Cannot find an initializer for type 'SKTexture' that accepts an argument list of type '(image: ())'
Run Code Online (Sandbox Code Playgroud)

StyleKitName.drawBottom函数返回一个UIImage.如果有人能告诉我如何用UIImage创建一个SKSpriteNode,那将是很好的.

我感谢任何帮助.谢谢.

uiimage ios skspritenode paintcode swift

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

SpriteKit PhysicsBody:无法为基本形状创建物理体

我有一个非常基本的多边形,它是我游戏中精灵的纹理,但是当我尝试从这个纹理为精灵创建一个 PhysicsBody 时,我得到了这个错误:

2016-06-19 08:25:21.707 Space Escape[14677:5651144] PhysicsBody: Could not create physics body.
Run Code Online (Sandbox Code Playgroud)

此外,游戏使用了许多不同的简单多边形,并且对于某些可以创建物理体,但对于其他的它会出错。

func setPhysics(size: CGSize) {

    self.physicsBody = SKPhysicsBody(texture: asteroidTexture, size: size)
    self.physicsBody?.angularDamping = 0
    self.physicsBody?.angularVelocity = 2

}
Run Code Online (Sandbox Code Playgroud)

这是纹理:

简单的七边形精灵纹理

xcode sprite-kit skphysicsbody skspritenode swift

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

SpriteKit的坐标系在Xcode 8中有变化吗?

在以前版本的SpriteKit中,原点(0,0)始终位于左下角.此外,默认情况下,Node已添加到其父级.

似乎从Xcode 8开始,新的默认原点位于屏幕的中心.

这是正确的行为,测试版中的错误,还是我根本不了解SpriteKit?

两者都使用相同的代码

import SpriteKit
import GameplayKit

class GameScene: SKScene {   
    override func didMove(to view: SKView) {
        let ship = SKSpriteNode(imageNamed: "Spaceship")
        addChild(ship)
    }
}
Run Code Online (Sandbox Code Playgroud)

Xcode 7:

在此输入图像描述

Xcode 8:

在此输入图像描述

ios sprite-kit skspritenode swift xcode8

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

检测CGPoint是否在正方形(菱形)内的麻烦

我有2个SKSpriteNode:

  • 一个简单的方块(A)
  • 相同的方形旋转(-45°)(B)

我需要随时检查另一个SKSpriteNode(一个球)的中心是否位于其中一个方格内.球和方块具有相同的父级(主场景).

override func update(_ currentTime: TimeInterval) {

    let spriteArray = self.nodes(at: ball.position)

    let arr = spriteArray.filter {$0.name == "square"}

    for square in arr {
        print(square.letter)

        if(square.contains(self.puck.position)) {
             print("INSIDE")
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

使用简单的方形(A),我的代码可以正常工作.数据是对的.我知道,在任何时候,如果CGPoint中心位于广场内部或外部.

但是对于具有旋转(B)的正方形,数据不是所希望的.CGPoint在包含钻石形状的正方形中被检测到.

演示

SKSpriteNode方块通过关卡编辑器创建.

如何才能获得钻石形状的正确结果?

编辑1

运用

view.showsPhysics = true
Run Code Online (Sandbox Code Playgroud)

我可以看到所有SKSpriteNode与physicsBody的界限.我的钻石方形的边界是菱形方形而不是灰色方形区域.

 square.frame.size -> return the grey area
 square.size -> return the diamond-square
Run Code Online (Sandbox Code Playgroud)

在Apple文档中,func节点(在p:CGPoint) - > [SKNode],该方法是关于节点而不是帧,那么为什么它不起作用?

collision-detection ios sprite-kit skspritenode swift

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

绕过子类中的Initialization:Swift和SpriteKit

我想创建一个比SpriteNode的touchesBe更高级别的SKShapeNode,所以当我想从这个sprite上的touchesBegun事件将SKShapeNode添加到屏幕时,形状已经存在,我只是从内部将它添加到屏幕touchesBegan覆盖.

TL; DR,在我的SKSpriteNode中,我正在尝试预先构建SKShapeNode,当触摸Sprite时,该SKShapeNode将用作动画环.

我想用变量/常量创建SKShapeNode,这样我就可以轻松编辑它的值了......

因此,在子类的根目录中,我有颜色,大小和线宽的变量,可以在创建SKShapeNode时使用...

class Balls: SKSpriteNode {

    var ringSize: CGFloat = 64
    var ringColor: SKColor = SKColor.white
    var ringWidth: CGFloat = 16

....
Run Code Online (Sandbox Code Playgroud)

再往下,但仍然是班级的根,我创建我的戒指:

 let ring = SKShapeNode(circleOfRadius: ringSize)
Run Code Online (Sandbox Code Playgroud)

我立即受到了深情的怀疑:

无法在属性初始化程序中使用实例成员'ringSize',属性初始化程序在'self'可用之前运行.

精细.好.我知道了.您希望在将值分配给self之前,应该在创建属性时对类进行函数调用.无论是在这里还是在那里,我认为我变得狡猾,并且可以通过将所有内容包装在函数中来解决这个问题:

class Balls: SKSpriteNode {

        var ringSize: CGFloat = 64
        var ringColor: SKColor = SKColor.white
        var ringWidth: CGFloat = 16

        var myRing = SKShapeNode()    

    func createRing() -> SKShapeNode{
            let ring = SKShapeNode(circleOfRadius: ringSize)
                ring.strokeColor = ringColor
                ring.lineWidth = ringWidth
            return ring
        }
Run Code Online (Sandbox Code Playgroud)

这不会产生任何错误,我的兴奋也会增加.

所以我添加另一行,创建实际的戒指:....

 myRing = createRing() …
Run Code Online (Sandbox Code Playgroud)

initialization subclass sprite-kit skspritenode swift

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

SpriteKit:当此类别从未分配给节点时,为什么碰撞中的节点具有类别位掩码4294967295

didBegin下面的函数中,其中一个节点的类别位掩码为4294967295.但是,此类别永远不会分配给任何节点.

以下是使用中的所有位掩码:

struct PhysicsCategory {
    static let None                 : UInt32 = 0
    static let All                  : UInt32 = UInt32.max
    static let Player               : UInt32 = 0b1       // 1
    static let WorldBorder          : UInt32 = 0b10      // 2
    static let TopWorldBorder       : UInt32 = 0b100     // 4
    static let RightWorldBorder     : UInt32 = 0b1000    // 8
    static let Pellet               : UInt32 = 0b10000
}
Run Code Online (Sandbox Code Playgroud)

要重复,All对应于4294967295 的类别永远不会分配给任何节点.那么为什么有一个物理体具有这种类别的掩码呢?此类别位掩码是否隐式分配给物理主体?

func didBegin(_ contact: SKPhysicsContact) {
    print("Collision was detected: \(contact.bodyA.categoryBitMask). \(contact.bodyB.categoryBitMask).")
}
Run Code Online (Sandbox Code Playgroud)

sprite-kit skphysicsbody skspritenode swift

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

Swift 3(SpriteKit):锁定SKSpriteNode的x轴及其physicsBody

我真的需要知道如何锁定SKSpriteNode的x轴及其physicsBody.我需要保留SKSpriteNode dynamicaffectedByGravity.节点在斜坡上,因此这就是x轴因重力而移动的原因.但是,我不希望此SKSpriteNode的x轴因重力而移动.有没有办法锁定x轴以实现这一目标?谢谢你的帮助:D

编辑:我试图将约束应用于x值,如下所示:

let xConstraint = SKConstraint.positionX(SKRange(constantValue: 195))
node.constraints?.append(xConstraint)
Run Code Online (Sandbox Code Playgroud)

然而,这不起作用,我不知道为什么以及如何解决它.有人知道解决方案吗?

编辑2: SKPhysicsJointPin实际上看起来更有前途.在对这个问题的第一个回答/回答的评论中,我一直试图想出如何在我的情况下正确使用它.

我的代码示例:

let node = SKSpriteNode(imageNamed: "node")

enum collisionType: UInt32 {
    case node = 1
    case ground = 2
    case other = 4 //the other node is unrelated to the ground and node
}

class GameScene: SKScene, SKPhysicsContactDelegate {

override func didMove(to view: SKView) {
    //Setup node physicsBody
    node.physicsBody = SKPhysicsBody(rectangleOf: node.size)
    node.physicsBody?.categoryBitMask = collisionType.node.rawValue
    node.physicsBody?.collisionBitMask = //[other node that isn't the ground …
Run Code Online (Sandbox Code Playgroud)

sprite-kit skphysicsbody skspritenode swift

6
推荐指数
2
解决办法
785
查看次数