首先,最近加入了一家做2D游戏公司(ps.我其实之前一直没接触过这一块的内容o(╯□╰)o)!于是就网上查了一下相关资料,说实话这方面的资料很少,而且初学者可能很难接受,于是我花了半天研究了一下spriteKit!关于spriteKit的介绍我就不多废话了,自己百度!于是把自己的一些心得写一下!入门级小白可以过来看看,大佬们就当看看笑话了!
好的,我们废话不多说 直接进入正题!
我们这里直接借助一个经典案例如题吧!
创建工程:
这里需要说明一下,SpriteKit是基于场景(Scene)来组织的,每个SKView(专门用来呈现SpriteKit的View)中可以渲染和管理一个SKScene,每个Scene中可以装载多个精灵(或者其他Node,之后会详细说明),并管理它们的行为。
打开创建的工程,系统已经默认为我们创建好了GameScene场景,为了大家容易理解,我们创建一个自己的myScene(ps.需要继承SKScene) 替换掉viewController的代码!
替换之后如下:
好了,接下来就进入正题了!
到MyScene创建出我们主角:
然后运行一下。
OK!主角已经登场!这个时候需要一些怪物!
好的,接下来我们创建一群小怪物!
这个时候 怪物也已经跑起来了!这里简单说明一下Action就是用来控制精灵的行为,可以看到runAction的是一个重复类型的action,sequence这里设置了顺序,也就是输怪物创建出来了 然后一秒之后 继续创建 然后重复!
创建怪物的代码在这里(注意看注释)
- (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