我对SKNode
方法convertPoint:fromNode:
和convertPoint:ToNode:
工作方式感到有些困惑,我看过文档,但不是很明显他们做了什么.例如,这个(见下图)是我用过的一个小测试convertPoint:fromNode:
.黑色区域是SKScene
背景,蓝色区域是一个SKSpriteNode
父级SKScene
,红色区域是另一个SKSpriteNode
蓝色精灵的父级.两个精灵的锚点由小绿点表示.我想要做的是获取红色精灵的场景位置,我使用以下代码完成:
CGPoint positionInScene = [self convertPoint:[self position]
fromNode:[self redSprite]];
Run Code Online (Sandbox Code Playgroud)
结果是这样的
positionInScene = [105, 205]
Run Code Online (Sandbox Code Playgroud)
这是我所期望的,因为那将是场景空间中红色方块的起源.我很困惑的是争论.根据我的猜测:
[SKNode_A convertPoint: CGPoint_B toNode: SKScene_C]
Run Code Online (Sandbox Code Playgroud)
我最初的尝试是[self convertPoint:[redSprite position] fromNode:redSprite]
因为我想将红色精灵原点转换为场景.如果有人能在这个和它的朋友身上投入一点点光明和逻辑,convertPoint:toNode:
那将会非常感激,这似乎有点笨拙.
我的tvOS应用程序使用如下所示的SKNodes生成游戏板:
每个由线条分隔的形状是可聚焦的SKNode(例如,每个彩色楔形由5个SKNode组成,其尺寸逐渐减小,更接近中心).
我的问题是焦点引擎没有聚焦下一个焦点项(SKNode),它会感觉像是一个逻辑的,最自然的下一个节点.这个问题是因为焦点引擎逻辑是矩形的,而我的SKNode是弯曲的.正如您在下面看到的那样,当从最外面的黄色SKNode向下滑动时尝试找出下一个可聚焦项目时存在固有问题:
在上面的示例中,焦点引擎根据节点的边缘推断出当前聚焦区域是红色阴影矩形内的区域.由于该逻辑,聚焦矩形与不是当前聚焦节点的一部分的区域重叠,包括第二黄色SKNode的整个宽度.因此,当向下滑动时,焦点引擎会将焦点跳到第三个(中间)黄色SKNode.
如何解决这个焦点问题,以便我的圆形游戏板SKNodes的纵向和横向焦点更自然,而不是看起来如此零星?这可能吗?也许有UIFocusGuides?
(这适用于XCode 6和iOS 8 beta 4)
喜欢新的SceneKit编辑器.我成功地将.sks文件中的场景加载到自定义SKScene类中.但是,它内部的对象被实例化为默认类(SKNode,SKSpriteNode等),我不知道如何绑定它们以实例化为自定义子类.
目前,我正在通过创建自定义类并链接到sprite节点作为属性来解决这个问题,这样就可以了
只是玩SpriteKit,我试图弄清楚如何捕获SKNode的'抓取'到UIImage.
使用UIView(或UIView子类),我使用layer
视图的属性渲染到图形上下文中.
例如.
#import <QuartzCore/QuartzCore.h>
+ (UIImage *)imageOfView:(UIView *)view {
UIGraphicsBeginImageContextWithOptions(view.frame.size, YES, 0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
[view.layer renderInContext:context];
UIImage *viewShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return viewShot;
}
Run Code Online (Sandbox Code Playgroud)
SKNode不是UIView的子类,因此似乎没有图层支持.
关于如何将给定的SKNode呈现给UIImage的任何想法?
我创建了一个SKView,它提供了一个像这样的SKScene子类:
SKView *skv = [[SKView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:skv];
self.skScene = [[TestScene alloc] initWithSize:v.bounds.size];
[skv presentScene:_skScene];
Run Code Online (Sandbox Code Playgroud)
然后,为了查看坐标系原点,我在场景中添加了一个小的10x10彩色方块.
SKSpriteNode *ori = [SKSpriteNode spriteNodeWithColor:[UIColor greenColor] size:CGSizeMake(10,10)];
[self addChild:ori];
Run Code Online (Sandbox Code Playgroud)
你可以在左下角看到绿色方块:
从我的想法来看,SpriteKit坐标系是这样的,原点总是在中心.但在场景中,原点位于左下角.当我将子节点添加到{0,0}时,它也出现在左下角.
当我添加SKSpriteNode并将其在场景中定位{0,0}时,它会显示在左下角.但它以左下角的场景原点为中心(从左到右,从一半到左下).
但现在它变得更加混乱.当我将SKSpriteNode添加到另一个SKSpriteNode时,子精灵在父级中是CENTERED.
那么它是否意味着场景坐标系与精灵坐标系不同?
概括:
我的场景配置错误或者它的工作方式是什么?
我已将UIPinchGestureRecognizer添加到我的scene.view中以扩展我的内容.我实际上缩放了所有可见内容所在的父节点.但是我的问题虽然有缩放点.东西是从左下角开始的节点比例.这绝对不是我想要的.我是否必须编写大量代码才能从发生挤压的位置进行扩展?您能否提供一些关于如何遵循的提示.
我试图让它变成这样一个粒子,只要玩家被移动,我就会跟随玩家.我试图复制的效果就像你在网站上,并且他们有一些跟随你的鼠标的对象.我尝试通过使粒子移动玩家所做的数量来做到这一点,但它没有再现预期的效果.有什么建议?我的代码:
声明粒子
NSString *myParticlePath = [[NSBundle mainBundle] pathForResource:@"trail" ofType:@"sks"];
self.trailParticle = [NSKeyedUnarchiver unarchiveObjectWithFile:myParticlePath];
self.trailParticle.position = CGPointMake(0,0);
[self.player addChild:self.trailParticle];
Run Code Online (Sandbox Code Playgroud)
移动方法
-(void)dragPlayer: (UIPanGestureRecognizer *)gesture {
if (gesture.state == UIGestureRecognizerStateChanged) {
//Get the (x,y) translation coordinate
CGPoint translation = [gesture translationInView:self.view];
//Move by -y because moving positive is right and down, we want right and up
//so that we can match the user's drag location (SKView rectangle y is opp UIView)
CGPoint newLocation = CGPointMake(self.player.position.x + translation.x, self.player.position.y - translation.y);
CGPoint newLocPart = …
Run Code Online (Sandbox Code Playgroud) 有了SKLabelNode
,当你突破多行时,
结果总是如此
abcde
fg
Run Code Online (Sandbox Code Playgroud)
而不是
abcde
fg
Run Code Online (Sandbox Code Playgroud)
真的,似乎SKLabelNode只是左对齐,就是这样.
有没有解决方案 - 如何使多线SKLabelNode居中对齐?
注意 - horizontalAlignmentMode完全不相关.它只是允许您选择整个标签区域的锚点是位于位置的左侧,右侧还是中心.
我对iOS,Objective C和使用Xcode都很陌生.我只做了一个简单的新闻类型的应用程序,但现在我想创建一个我在另一个平台上发布的游戏.
基本上,我有一个对象随机出现然后淡出,目的是点击对象使其消失.
然而,即使我设置,我似乎无法点击该对象 mySKSpriteNode.userInteractionEnabled = YES;
这是我的touchesBegan
方法中的内容:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
/* Called when a touch begins */
NSLog(@"Something was touched");
UITouch *touch = [touches anyObject];
NSLog(@"%@", touch);
CGPoint location = [touch locationInNode:self];
SKNode *node = [self nodeAtPoint:location];
if(node == mySKSpriteNode)
[node runAction:[SKAction fadeOutWithDuration:0]];
}
Run Code Online (Sandbox Code Playgroud)
在我的日志中,当我点击屏幕时(不是我有对象的地方),我得到了这个:
2014-02-17 23:18:30.870 BubbleChallenge[48541:70b] Something was touched
2014-02-17 23:18:30.875 BubbleChallenge[48541:70b] <UITouch: 0x1130ea530> phase: Began tap count: 1 window: <UIWindow: 0x109c2ab60; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = …
Run Code Online (Sandbox Code Playgroud) 我一直收到来自GA和用户的崩溃报告...但是我不能通过ios7和ios8测试iphone5,5s,6来重现这个例外.当应用程序进入后台时,此问题无处可去.奇怪的是游戏中心会调用spritekit来显示成就横幅?
有没有人有同样的问题?
Last Exception Backtrace:
0 CoreFoundation 0x23c99e3f __exceptionPreprocess + 127
1 libobjc.A.dylib 0x31371c8b objc_exception_throw + 38
2 CoreFoundation 0x23c9f189 -[NSObject(NSObject) doesNotRecognizeSelector:] + 188
3 CoreFoundation 0x23c9d0a7 ___forwarding___ + 714
4 CoreFoundation 0x23bcf208 _CF_forwarding_prep_0 + 24
5 SpriteKit 0x26fe9689 -[SKNode isEqual:] + 164
6 Foundation 0x248ec9ff +[NSObject(NSDelayedPerforming) cancelPreviousPerformRequestsWithTarget:] + 358
7 GameCenterFoundation 0x2a945873 -[GKPlayer postChangeNotification] + 38
8 GameCenterFoundation 0x2a958d21 __52-[GKDaemonProxy setLocalPlayer:authenticated:reply:]_block_invoke + 848
9 libdispatch.dylib 0x318d18cb _dispatch_call_block_and_release + 10
10 libdispatch.dylib 0x318d18b7 _dispatch_client_callout + 22
11 libdispatch.dylib 0x318d50bf _dispatch_main_queue_callback_4CF …
Run Code Online (Sandbox Code Playgroud) sknode ×10
sprite-kit ×10
ios ×5
skspritenode ×3
ios7 ×2
objective-c ×2
game-center ×1
ios8 ×1
particles ×1
pinchzoom ×1
scaling ×1
swift ×1
tvos ×1
uiimage ×1