我正在尝试创建一个随机怪物的精灵,我的图像存储在主束中引用的文件夹中.
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?
为什么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) 我想使用我的自定义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) 我在使用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,那将是很好的.
我感谢任何帮助.谢谢.
我有一个非常基本的多边形,它是我游戏中精灵的纹理,但是当我尝试从这个纹理为精灵创建一个 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)
这是纹理:
在以前版本的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:
我有2个SKSpriteNode:
我需要随时检查另一个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],该方法是关于节点而不是帧,那么为什么它不起作用?
我想创建一个比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) 在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) 我真的需要知道如何锁定SKSpriteNode的x轴及其physicsBody.我需要保留SKSpriteNode dynamic和affectedByGravity.节点在斜坡上,因此这就是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) skspritenode ×10
sprite-kit ×9
swift ×8
ios ×5
xcode ×2
ios7 ×1
objective-c ×1
paintcode ×1
skscene ×1
subclass ×1
uiimage ×1
xcode8 ×1