Apple的文档让我有些困惑。
根据文档页面:https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Nodes/Nodes.html根据句子,点的场景可见区域与场景大小之间的关系应该相同:
“场景的大小指定了可见部分的大小 点的场景“。
我创建了一个自定义场景,其大小从设备屏幕的大小开始(在我的情况下,我一直在以纵向模式测试iPad,因此大小应为768宽,1024高)。
在场景的createContent
方法
NSLog(@"self.size : %f %f", self.size.width, self.size.height);
返回
2014-07-15 14:53:28.844 SpriteWalkthrough[15888:90b] self.size : 768.000000 1024.000000
正如所料。
但是,当我尝试在位置(self.size.width/2,self.size.height/2)
处绘制SKSpriteNode时,节点将在屏幕的右上角绘制,而不是在中间。
为什么会这样?
答案 0 :(得分:0)
对于可能会将SpriteNodes绘制到场景中的类似错误的其他人,请查看我的场景源代码,特别注意//self.sCar.car.position = self.sCar.position;
行。
FoolAroundScene.h
#import <SpriteKit/SpriteKit.h>
@interface FoolAroundScene : SKScene
@end
FoolAroundScene.m
#import "FoolAroundScene.h"
#import "ScrollingBackground.h"
#import "SpriteCar.h"
#define BACKGROUND_NAME @"clouds.jpg"
@interface FoolAroundScene ()
@property BOOL contentCreated;
@property (strong, nonatomic) ScrollingBackground * sbg;
@property (strong, nonatomic) SpriteCar * sCar;
@end
@implementation FoolAroundScene
-(void) didMoveToView:(SKView *)view
{
if (!self.contentCreated) {
[self createContent];
self.contentCreated = !self.contentCreated;
}
}
-(void)createContent
{
self.sbg = [[ScrollingBackground alloc] initWithBackgroundImage:BACKGROUND_NAME size:self.size speed:2.0];
self.sCar = [[SpriteCar alloc] init];
[self addChild:self.sbg];
[self addChild:self.sCar];
self.sCar.position = CGPointMake(self.size.width/2, self.size.height/2);
//self.sCar.car.position = self.sCar.position;
SKSpriteNode * spriteCar = [self.sCar makeCarSprite];
spriteCar.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
NSLog(@"anchor point : %f %f", self.anchorPoint.x, self.anchorPoint.y);
NSLog(@"self.size : %f %f", self.size.width, self.size.height);
NSLog(@"self.scalemode : %d", self.scaleMode);
}
-(void) update:(NSTimeInterval)currentTime
{
[self.sbg update:currentTime];
}
@end
即使我已经将sCar的位置属性设置为场景的中间位置,但通过将其子节点(sCar的汽车属性)位置设置为相同的值,孩子们可以职位与其父母的职位不同。这是因为孩子的位置相对到其父母的位置。
另一种说法:父母在场景背景中的位置是(384,512),孩子在父母的背景中的位置是(384,512)。然而,这意味着孩子在场景中的位置实际上是(768,1024),这就是为什么汽车被绘制在屏幕的右上角。
另外,如果有人想要精灵汽车的实现,这里就是。一辆破旧的汽车,可以用来掌握Sprite Kit的工作原理。
SpriteCar.h
#import <SpriteKit/SpriteKit.h>
@interface SpriteCar : SKNode
-(id)init;
-(SKSpriteNode *)makeCarSprite;
@end
SpriteCar.m
#import "SpriteCar.h"
@interface SpriteCar ()
@property (nonatomic, strong) SKSpriteNode * car;
@end
@implementation SpriteCar
-(id) init
{
self = [super init];
if (self) {
self.car = [self makeCarSprite];
[self addChild:self.car];
}
return self;
}
-(SKSpriteNode *) makeCarSprite
{
SKSpriteNode * carBody1 = [[SKSpriteNode alloc] initWithColor:[SKColor redColor] size:CGSizeMake(64.0, 24.0)];
SKSpriteNode * carBody2 = [[SKSpriteNode alloc] initWithColor:[SKColor redColor] size:CGSizeMake(32.0, 32.0)];
SKSpriteNode * wheel1 = [[SKSpriteNode alloc] initWithColor:[SKColor blackColor] size:CGSizeMake(8.0, 8.0)];
SKSpriteNode * wheel2 = [wheel1 copy];
SKSpriteNode * light = [[SKSpriteNode alloc] initWithColor:[SKColor yellowColor] size:CGSizeMake(6.0, 6.0)];
carBody2.position = carBody1.position;
wheel1.position = CGPointMake(30.0, -30);
wheel2.position = CGPointMake(-30.0, -30.0);
light.position = CGPointMake(32.0, 11.0);
[carBody1 addChild:carBody2];
[carBody1 addChild:wheel1];
[carBody1 addChild:wheel2];
[carBody1 addChild:light];
SKAction * hover = [SKAction sequence:@[[SKAction moveByX:0.0 y:5.0 duration:0.1],
[SKAction waitForDuration:0.05],
[SKAction moveByX:0.0 y:-5.0 duration:0.1],
[SKAction waitForDuration:0.05]]];
[carBody1 runAction:[SKAction repeatActionForever:hover]];
return carBody1;
}
@end