spritKit(2D动画)

一.概念东西
这里写图片描述
这里写图片描述
这里写图片描述
1.skView是显示动画的视图
2.scene是创建动画的场景
3.SKSpriteNode是精灵(相当于UIImage).
4.position是位置.
5.scale是缩放.
6.SKTexture是添加的纹理(也可以暂时理解为图片).
7.SKAction是动作.
二.执行顺序
1.创建一个Game工程->Game Technology 中选择SpriteKit,并填写工程名->在GameViewController中的ViewDidLoad中创建一个自定义的场景,代码如下

/**1.创建自己的场景*/
    Start *scene = [Start sceneWithSize:skView.frame.size];
/**2.添加到skView上*/
    [skView presentScene:scene];

2.在自己创建的场景中写上如下代码创建场景中精灵,必须在这个方法里写.

#import "Start.h"
#import "MyScene.h"
@interface Start()
{
    /**创建一个精灵*/
    SKSpriteNode *_planeSp;
}
@end
@implementation Start
- (instancetype)initWithSize:(CGSize)size{
    if (self = [super initWithSize:size]){
        [self makeScene];//创建场景
    }
    return self;
}

3.创建场景里面的精灵及跳转到另一个场景和创建颗粒,代码如下

- (void)makeScene{

------------------------创建一个label

    /**1.创建一个label*/
    SKLabelNode *label = [[SKLabelNode alloc] init];
    /**2.设置文字*/
    label.text = @"飞机大战";
    /**3.设置label中心点*/
    label.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    /**4.添加到场景上*/
    [self addChild:label];

-------------------------创建一个固定精灵
    /**1.实例化一个精灵*/
    _planeSp = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
    /**2.位置*/
    _planeSp.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)-250);
    /**3.缩放*/
    [_planeSp setScale:0.4];
    /**4.锚点,即坐标点*/
    _planeSp.anchorPoint = CGPointMake(0.5, 0);
    /**5.添加到场景上*/
    [self addChild:_planeSp];
----------------创建一个移动的精灵
  /**1.创建一个精灵*/
    SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"loading_01"];
  /**2.设置精灵的位置*/
    sprite.position = CGPointMake(CGRectGetMidY(self.frame)-100, CGRectGetMidY(self.frame));
  /**3.添加到场景上*/
    [self addChild:sprite];
  /**4.动作跑步动画*/
    NSMutableArray *array = [NSMutableArray array];
    for (int i = 1; i <= 12; i++) { 
        NSString *name = [NSString stringWithFormat:@"loading_%02d.png",i];
/**4.添加纹理,也就是图片*/
        SKTexture *texture = [SKTexture textureWithImageNamed:name];
        [array addObject:texture];
    }
 /**5.跑步动作,只会执行一次*/
    SKAction *runAction = [SKAction animateWithTextures:array timePerFrame:0.04];
 /**6.重复动作*/
    SKAction *repeatAction = [SKAction repeatActionForever:runAction];
/**7.精灵上添加动作*/
    [sprite runAction:repeatAction];
#pragma mark--moveBy
//    /**8移动动作,动作中MoveBy是以你当前,增加某个坐标,如移动到100,100,当前位置加坐标*/
//    SKAction *moveBy = [SKAction moveByX:150 y:0 duration:2];
//    /**9.往回移动*/
//    SKAction *moveBy2 = [SKAction moveByX:-200 y:0 duration:1];
//    
#pragma mark--moveTo
 /**10,不管你的当前位置在那,都会移动到指定的固定位置*/
    SKAction *moveTo = [SKAction moveToX:300 duration:2];
    SKAction *moveTo2 = [SKAction moveToX:1 duration:2];

/**11.缩放,-1表示x轴返转过来,1代表往回旋转的位置,duration移动的时间*/
    SKAction *scale = [SKAction scaleXBy:-1 y:1 duration:0];
 /**12.队列动作,做完一个再做下一个,可以添加许多动作*/
    SKAction *sequence = [SKAction sequence:@[moveTo,scale,moveTo2,scale]];
/**13.添加一个移动动作*/
//    [sprite runAction:moveBy];
//    [sprite runAction:sequence];
    [sprite runAction:[SKAction repeatActionForever:sequence]];

}
/**触摸事件*/
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

    CGPoint point = [[touches anyObject] locationInNode:self];
#pragma mark--判断触摸的点是否在飞机上
    /**判断触摸的点是否在飞机上*/
    if (CGRectContainsPoint(_planeSp.frame, point)) {
  /**1.旋转*/
        SKAction *rotate = [SKAction rotateByAngle:M_PI duration:1];
 /**2.重复次数*/
        SKAction *repeat = [SKAction repeatAction:rotate count:1];
        [_planeSp runAction:repeat];
 /**3.移动*/
        SKAction *moveBy = [SKAction moveByX:0 y:self.size.height duration:2];
 /**4.组,可以让多个动作一块移动*/
//        SKAction *group = [SKAction group:@[repeat,moveBy]];
//        [_planeSp runAction:group];

#pragma mark--切换场景,跳转到另一个场景
 /**4.block动作*/
        SKAction *blockAt = [SKAction runBlock:^{
 /**4.1切换场景*/
            MyScene *scene = [MyScene sceneWithSize:self.size];
  /**4.2过渡效果*/
            SKTransition *transition = [SKTransition doorwayWithDuration:1];
            [self.view presentScene:scene transition:transition];
        }];
  /**5.添加粒子效果,飞机喷火的效果*/
        SKAction *blockAction = [SKAction runBlock:^{
            SKEmitterNode *emitter = [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle] pathForResource:@"fire" ofType:@"sks"]];
 /**6.颗粒的位置*/
            emitter.position = CGPointMake(0,0);
            /**7.添加到飞机上*/
            [_planeSp addChild:emitter];
        }];
 /**8.队列,先重复旋转,再添加火焰,再移动飞机,最后切换到另一个场景(另一个控制器页面)*/
        SKAction *sequence = [SKAction sequence:@[repeat,blockAction,moveBy,blockAt]];
/**9.队列添加到飞机上*/
        [_planeSp runAction:sequence]; 
    }
}
@end

4.跳转到另一个(第二个)场景

#import "MyScene.h"
@interface MyScene()
{/**创建精灵*/
    SKSpriteNode *_sprite;
}

@end
@implementation MyScene
/**设置场景必须调用这个方法*/
- (instancetype)initWithSize:(CGSize)size{

    if (self = [super initWithSize:size]) {

        [self makeScene];
    }
    return self;
}

- (void)makeScene{
-------------创建一个固定的场景,并添加一个背景
 /**1.创建一个场景*/
    SKSpriteNode *bgSprite = [SKSpriteNode spriteNodeWithImageNamed:@"10_0.jpg"];
 /**2.设置位置*/
    bgSprite.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
  /**3.设置大小是当前场景的尺寸*/
    bgSprite.size = self.size;
  /**4.系统默认的Z轴坐标是0,如果是这样话会遮挡住添加的那个图片,这里设置成-1*/
    bgSprite.zPosition = -1;
 /**5.添加到场景*/
    [self addChild:bgSprite];

---------------------设置浮动效果
    _sprite = [SKSpriteNode spriteNodeWithImageNamed:@"1"];
    _sprite.position = CGPointMake(100, 100);
    [self addChild:_sprite];
    _sprite.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:self.frame.size.width/2];
    self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
--------------设置引力,可以理解为地理引力
 /**物理世界,设置向下的引力*/
    self.physicsWorld.gravity = CGVectorMake(0, -100);
    self.physicsWorld.gravity = CGVectorMake(0, 10);
}
/**触摸屏幕事件*/
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

 /**精灵上添加图片,或者说添加一个精灵*/
    CGPoint point = [[touches anyObject] locationInNode:self];

    _sprite = [SKSpriteNode spriteNodeWithImageNamed:@"1"];
    _sprite.position = point;
    [self addChild:_sprite];

  //添加物理
  /**刚体的半径*/
    _sprite.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:_sprite.size.width/2 -4];
 /**方形效果*/
//    sprite.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:sprite.size];
/**设置场景的边缘,屏幕的边缘,不会移出去*/
   self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];

/**外界给一个外力给力,推力*/
    _sprite.physicsBody.velocity = CGVectorMake(0, 200);
}
@end
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值