当我运行我的SpriteKit游戏时,我在控制台中多次收到此错误.据我所知(尽管我不完全确定),游戏本身并未受到影响,但错误可能会产生一些其他影响,同时拥挤调试控制台.
我对错误进行了一些研究,并找到了一些可能的解决方案,其中没有一个似乎完全有效.这些解决方案包括转向ignoresSiblingOrder
到false
,并指定纹理作为SKTextureAtlas(named: "atlasName").textureNamed("textureName")
,但这些并没有工作.
我认为错误来自于资产目录中纹理和纹理图集的使用,尽管我并不完全确定.以下是我如何实现其中一些纹理/图像:
let Texture = SKTextureAtlas(named: "character").textureNamed("\character1")
character = SKSpriteNode(texture: Texture)
Run Code Online (Sandbox Code Playgroud)
也:
let Atlas = SKTextureAtlas(named: "character")
var Frames = [SKTexture]()
let numImages = Atlas.textureNames.count
for var i=1; i<=numImages; i++ {
let textureName = "character(i)"
Frames.append(Atlas.textureNamed(textureName))
}
for var i=numImages; i>=1; i-- {
let TextureName = "character(i)"
Frames.append(Atlas.textureNamed(textureName))
}
let firstFrame = Frames[0]
character = SKSpriteNode(texture: firstFrame)
Run Code Online (Sandbox Code Playgroud)
上面的代码仅用于创建一个数组,从中可以为角色设置动画,动画运行完全正常.
对于我所有的其他精灵节点,我使用SKSpriteNode(imageNamed: "imageName")
资产目录中的图像名称初始化,但不在纹理图集中.所有图像都有@ 1x,@ 2x和@ 3x版本.
我不确定错误消息是否还有其他可能的来源,或者上述示例是否是错误的来源.
这只是精灵套件的错误,还是我的代码或资产的合法错误?
谢谢!
如何获得UIImage
的SKTexture
?
我试图让UIImage
从SKTextureAtlas
,但似乎不是工作压力太大:
// p40_prop1 is a part of SKTextureAtlas
UIImage *image = [UIImage imageNamed:@"p40_prop1"];
Run Code Online (Sandbox Code Playgroud)
image
没有.
我正在使用Xcode在Spritekit中构建游戏.更新到Xcode 9后,我发现每次通过.sks文件设置纹理时,Xcode会立即崩溃.我重新启动了计算机,更新了应用程序,重新加载了纹理,没有任何改变.我有2017年的Macbook Prof 13"w/touch bar.这是诊断:
Process: Xcode [577]
Path: /Applications/Xcode.app/Contents/MacOS/Xcode
Identifier: com.apple.dt.Xcode
Version: 9.0.1 (13249)
Build Info: IDEFrameworks-13249000000000000~2
App Item ID: 497799835
App External ID: 823984564
Code Type: X86-64 (Native)
Parent Process: ??? [1]
Responsible: Xcode [577]
User ID: 501
Date/Time: 2017-10-22 17:30:06.029 -0400
OS Version: Mac OS X 10.12.6 (16G29)
Report Version: 12
Anonymous UUID: 0537A8C3-9FB2-836A-088B-E5D2B7FEB3EB
Time Awake Since Boot: 100 seconds
System Integrity Protection: enabled
Crashed Thread: 0 Dispatch queue: SKCRenderer_resource_queue
Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE …
Run Code Online (Sandbox Code Playgroud) 在StackOverflow上经常提到SpriteKit自己进行内部缓存和重用.
如果我不再努力重用纹理或地图集,我可以从SpriteKit中获得什么样的缓存和重用行为?
我尝试使用XCode的新PDF功能,基本上将图像缩放到1x,2x和3x.不幸的是我也在使用Spritekit,所以我宁愿使用SKTextureAtlases而不是资产目录.
我的问题是,pdf的栅格化版本看起来比Adobe Illustrator(或使用智能对象的Photoshop)的任何导出更好.
这是一个带有示例的Imgur专辑的链接.
具体来说,从Illustrator导出的图像有2个方形尺寸:60px和90px.Xcode中的图像都具有相同的名称,但有两个不同的地图集:atlas@2x.atlas和atlas@3x.atlas.PDF从Illustrator以30px的平方导出,然后Xcode将其缩放到2x和3x版本.
那么为什么Xcode版本看起来更清晰(特别是在圆角和平面之间的连接处)?
我现在已经为下面的问题提交了一个错误。有人有好的解决方法吗?
我尝试保存一个SKTexture
文件,然后再次加载它,但我没有成功。可以将以下代码片段复制到Xcode 启动项目中的GameScene.m。
我使用textureFromNode
in generateTexture
,这似乎是我问题的根本原因。如果我使用精灵的纹理,则代码有效,并且可以看到两艘宇宙飞船。
此代码在 iOS 8 中有效,但在 Xcode7 和 iOS 9 中停止工作。我只想在提交错误报告之前验证这是一个错误。我担心的是我做错了什么NSKeyedArchiver
。
它发生在模拟器和设备上。
#import "GameScene.h"
@implementation GameScene
// Generates a texture
- (SKTexture *)generateTexture
{
SKScene *scene = [[SKScene alloc] initWithSize:CGSizeMake(100, 100)];
SKShapeNode *shapeNode = [SKShapeNode shapeNodeWithRectOfSize:CGSizeMake(50, 50)];
shapeNode.position = CGPointMake(50, 50);
shapeNode.strokeColor = SKColor.redColor;
shapeNode.lineWidth = 10;
[scene addChild:shapeNode];
SKTexture *texture = [self.view textureFromNode:scene];
//SKTexture *texture = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"].texture; // This works!
return texture;
}
// Just generate …
Run Code Online (Sandbox Code Playgroud) 我刚刚更新到iOS 9,却发现我的应用程序中的多个图像不再显示.由于某种原因,所有SpriteKit文本都是黄色的(以前是白色的).
有问题的图像是2D精灵,用精灵套件渲染,但在哪个显示和哪个不显示之间似乎没有很大的一致性.当然,没有背景显示,有些图像显示为白色框(但不是红色X).
其他精灵是颠倒的,或在Y中翻转,就像坐标系已经颠倒一样.并且似乎不再显示粒子效果.
我应该在不久前尝试过测试版,因为这会破坏我的实时应用程序(我现在已经删除了).但有没有其他人经历过类似的事情?或者可能知道什么是错的?在我看来主要是一个SpriteKit问题,然而,纹理地图集的所有精灵似乎都运行良好.
更新:
我意识到这是我的所有精灵都不在纹理地图集中.我在这里找到了一个论坛帖子:https://forums.developer.apple.com/thread/13358,说iOS9要么代码中的每个资产名称都需要".png"扩展名,要么你可以删除并重新添加所有资产目录中的资产.难以置信的!
这篇文章遇到了类似的问题,显然解决方案是将所有地图集添加到XCAssets,然后将目标设置为最新的iOS.但是你失去了与iOS8的向后兼容性.
我想创建一个内容为图像(.png)的圆,并且基于SKShapeNode类引用,我认为我可以使用SKShapeNode.filltexture()函数来设置图像的纹理.但是当我运行下面的代码时,我得到了圆圈,但是我试图加载的"猫黑"的图像没有显示.我检查了我的Image.Assets是否有正确名称的图像,所以其他东西就出现了.有任何想法吗?我附上以下输出:
func newCircle(photo:String, position:CGPoint) -> SKShapeNode {
let circle = SKShapeNode.init(circleOfRadius: 27)
circle.fillTexture = SKTexture.init(image: UIImage(named: "cat-black")!)
circle.strokeColor = UIColor.greenColor()
circle.lineWidth = 4
circle.name = "aggroNode"
circle.position = position
return circle
}
Run Code Online (Sandbox Code Playgroud)
我正在测试OS X版本的Sprite Kit上的游戏,并发现一些纹理不正确地报告它们的大小.我想知道是否有其他人看到这个问题以及是否有解释?
在我将此报告为错误之前,只是为了排除任何其他问题.如果这是一个已知错误,请说出来.
我正在加载这个纹理,它的大小是256x256像素:
当我记录从这个图像创建的SKTexture时,SKTexture描述给了我正确的大小,但size
属性没有,它说图像是204.8 x 204.8.
tex = <SKTexture> 'Tileset_GeometryB.png' (256 x 256)
tex.size = {204.80000000000001, 204.80000000000001} // Huh? WTF?!?
tex.textureRect = {{0, 0}, {1, 1}}
Run Code Online (Sandbox Code Playgroud)
我在iOS模拟器和设备上使用相同的代码加载完全相同的纹理 - 大小属性始终是正确的:256x256.
我还尝试在其他任何事情之前加载此纹理,以避免任何可能的副作用.纹理大小仍然是错误的.
值得注意的是,所有纹理都不会发生这种情况,但是在我加载的所有256x256纹理上都会发生这种情况.128x256纹理正确报告其大小.
我也做了一个干净的构建,我正在使用Xcode 5.0.1(5A2053)测试Mavericks(13A603).
我有一个使用精灵套件的iOS应用程序,我准备添加我的作品.艺术品是像素艺术,本质上非常小.我试图找到最好的方式来显示这种方式:
所有这些技术都具有相同的尺寸,这意味着一个图像像素恰好占据了所有其他图像中的真实世界像素的数量.
在尝试使纹理看起来更平滑时没有模糊,这通常在缩放图像时发生.
我试过像这样解决第二个问题:
self = [super init];
if(self){
self.size=size;
self.texture = [SKTexture textureWithImageNamed:@"ForestTree1.png"];
self.texture.filteringMode = SKTextureFilteringNearest;
[self.texture size];
}
return self;
Run Code Online (Sandbox Code Playgroud)
上面的代码是在具有纹理的SKSpriteNode的初始化中.
这是我的原始图像(按比例放大以便于参考):
问题是我的结果总是如下:
(被忽略的行李箱底部不是这个问题的一部分.)我没有使用任何运动模糊或任何类似的东西.我不确定它为什么显示不正确.
编辑1: 我没有在上面提到,在截图时,树木一直在动画.当它们仍然是这样的时候:
上面的图像是由于稍后要修复的错误导致的两个树重叠而导致的.我现在的问题是如何在动画发生时防止图像模糊?
编辑2:
我正在添加树的多个实例,每个实例加载相同的纹理.我知道它与动画无关,因为我改变了代码只添加一棵树并为其制作动画,并且它完全按像素化.
sktexture ×10
sprite-kit ×10
objective-c ×4
ios ×2
ios9 ×2
xcode ×2
macos ×1
pdf ×1
size ×1
skshapenode ×1
swift ×1
uiimage ×1
upgrade ×1
xcode9 ×1