ios 7 SKScene尺寸vs可见面积?

时间:2014-07-15 18:57:05

标签: ios iphone objective-c sprite-kit

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时,节点将在屏幕的右上角绘制,而不是在中间。

为什么会这样?

1 个答案:

答案 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