spriteKit入门,我的一些理解

首先,最近加入了一家做2D游戏公司(ps.我其实之前一直没接触过这一块的内容o(╯□╰)o)!于是就网上查了一下相关资料,说实话这方面的资料很少,而且初学者可能很难接受,于是我花了半天研究了一下spriteKit!关于spriteKit的介绍我就不多废话了,自己百度!于是把自己的一些心得写一下!入门级小白可以过来看看,大佬们就当看看笑话了!

好的,我们废话不多说 直接进入正题!

我们这里直接借助一个经典案例如题吧!

创建工程:


spriteKit入门,我的一些理解_第1张图片

这里需要说明一下,SpriteKit是基于场景(Scene)来组织的,每个SKView(专门用来呈现SpriteKit的View)中可以渲染和管理一个SKScene,每个Scene中可以装载多个精灵(或者其他Node,之后会详细说明),并管理它们的行为。

打开创建的工程,系统已经默认为我们创建好了GameScene场景,为了大家容易理解,我们创建一个自己的myScene(ps.需要继承SKScene) 替换掉viewController的代码!

spriteKit入门,我的一些理解_第2张图片

替换之后如下:


spriteKit入门,我的一些理解_第3张图片

好了,接下来就进入正题了!

到MyScene创建出我们主角:


spriteKit入门,我的一些理解_第4张图片
创建马里奥

然后运行一下。


spriteKit入门,我的一些理解_第5张图片
主角登场

OK!主角已经登场!这个时候需要一些怪物!

好的,接下来我们创建一群小怪物!


spriteKit入门,我的一些理解_第6张图片
创建怪物

这个时候 怪物也已经跑起来了!这里简单说明一下Action就是用来控制精灵的行为,可以看到runAction的是一个重复类型的action,sequence这里设置了顺序,也就是输怪物创建出来了 然后一秒之后 继续创建 然后重复!


spriteKit入门,我的一些理解_第7张图片

创建怪物的代码在这里(注意看注释)

- (void) addNewMonster {

SKSpriteNode *monster = [SKSpriteNode spriteNodeWithImageNamed:@"monster"];

//1 让怪物随机出现在某一个位置(y)

CGSize winSize = self.size;

int minY = monster.size.height / 2;

int maxY = winSize.height - monster.size.height/2;

int rangeY = maxY - minY;

int actualY = (arc4random() % rangeY) + minY;

monster.position = CGPointMake(winSize.width + monster.size.width/2, actualY);

[self addChild:monster];

//速度

int minDuration = 2.0;

int maxDuration = 4.0;

int rangeDuration = maxDuration - minDuration;

int actualDuration = (arc4random() % rangeDuration) + minDuration;

//这里创建一个行为,让怪物跑到最左边,并设置跑的时间

SKAction *actionMove = [SKAction moveTo:CGPointMake(-monster.size.width/2, actualY)

duration:actualDuration];

//然后 如果已经跑到了左边 执行移除方法

SKAction *actionMoveDone = [SKAction runBlock:^{

[monster removeFromParent];

[self.monsters removeObject:monster];

//在这里你可以做一些逻辑 比如怪物没被杀死 跑出屏幕 游戏结束什么的

}];

//跑起来

[monster runAction:[SKAction sequence:@[actionMove,actionMoveDone]]];

[self.monsters addObject:monster];

}

如果写到这里你估计会想,只有怪物跑来跑去显然差点东西。那我们让英雄拥有一项技能 那就是发射飞镖!飞镖怎么发射呢,我们想到了touchBegan,没错 点击屏幕的时候 我们就发射一把飞镖 跟当前英雄的位置两点连城一条直线!就是飞镖的飞行轨迹!然后再飞行过程中与怪物做碰撞检测!判断怪物是否被打死!

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

//点击屏幕 就发射飞镖

for (UITouch *touch in touches) {

//

CGSize winSize = self.size;

SKSpriteNode *projectile = [SKSpriteNode spriteNodeWithImageNamed:@"projectile.png"];

projectile.position = CGPointMake(projectile.size.width/2, winSize.height/2);

//2 Get the touch location tn the scene and calculate offset

CGPoint location = [touch locationInNode:self];

CGPoint offset = CGPointMake(location.x - projectile.position.x, location.y - projectile.position.y);

// 一些基本的判断与加速度

if (offset.x <= 0) return;

[self addChild:projectile];

int realX = winSize.width + (projectile.size.width/2);

float ratio = (float) offset.y / (float) offset.x;

int realY = (realX * ratio) + projectile.position.y;

CGPoint realDest = CGPointMake(realX, realY);

int offRealX = realX - projectile.position.x;

int offRealY = realY - projectile.position.y;

float length = sqrtf((offRealX*offRealX)+(offRealY*offRealY));

float velocity = self.size.width/1; // projectile speed.

float realMoveDuration = length/velocity;

//让子弹飞吧

SKAction *moveAction = [SKAction moveTo:realDest duration:realMoveDuration];

SKAction *projectileCastAction = [SKAction group:@[moveAction]];

[projectile runAction:projectileCastAction completion:^{

[projectile removeFromParent];

[self.projectiles removeObject:projectile];

}];

[self.projectiles addObject:projectile];

}

}

接下来就是碰撞检测了!我们知道,在spriteKit中,每一帧的渲染都会有自己的刷新回调!对,没错 就是-(void)update:(CFTimeInterval)currentTime方法

下面是碰撞检测的代码!

-(void)update:(CFTimeInterval)currentTime {

//场景的每一帧渲染时候都会走这么回调---在这里来做飞镖和怪物的碰撞检测吧

NSMutableArray *projectilesToDelete = [[NSMutableArray alloc] init];

for (SKSpriteNode *projectile in self.projectiles) {

NSMutableArray *monstersToDelete = [[NSMutableArray alloc] init];

for (SKSpriteNode *monster in self.monsters) {

if (CGRectIntersectsRect(projectile.frame, monster.frame)) {

[monstersToDelete addObject:monster];

}

}

for (SKSpriteNode *monster in monstersToDelete) {

[self.monsters removeObject:monster];

[monster removeFromParent];

//这里可以做一些逻辑 比如通关判定

}

if (monstersToDelete.count > 0) {

[projectilesToDelete addObject:projectile];

}

}

for (SKSpriteNode *projectile in projectilesToDelete) {

[self.projectiles removeObject:projectile];

[projectile removeFromParent];

}

}

好了,到这里基本小功能成型了!

还可以加入比如背景音乐呀,击杀时候的音乐呀什么的!都非常方便!或者丰富一下,加入一些关卡,切换场景!



谢谢各位大佬阅读!,写的不完善还请见谅!附上demo地址:spriteKitDemo

你可能感兴趣的:(spriteKit入门,我的一些理解)