我已经创建了一个带有精灵工具包的游戏,但是当游戏启动时,它直接进入了游戏。如何在屏幕上按标签或在游戏过程中通过联系人实现不同的场景,例如主菜单和游戏,以及如何在场景之间进行过渡。
您似乎没有研究过Apple的文档。他们为SpriteKit提供了出色的指南。此外,RayWenderlich.com上spriteKit类别内的教程也非常出色。我还没有对Swift进行过多的阅读,但是据我了解,Swift可以与Objective-C一起编写。话虽如此,我将为您提供一个起点(在Objective-C中)。
1)调用初始场景:
在主视图控制器中,您将需要将VC的view
属性强制转换为一个SKView
内部viewDidLoad
变量,如下所示:
SKView *spriteKitView = (SKView *)self.view;
一些有用的调试属性SKView
:
spriteKitView.showsFPS = YES;
spriteKitView.showsNodeCount = YES;
spriteKitView.showsPhysics = YES;
您将必须分别配置每个场景(子类SKScene
)。完成此操作后,将主场景导入到主VC的类实现中。呈现主要场景(仍在中viewDidLoad
):
MyScene *mainScene = [MyScene new];
[spriteKitView presentScene: mainScene];
2)通过标签(或任何其他SKNode
)在场景之间转换:将相关节点设置为属性,并通过以下方式呈现新场景:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInNode:self];
if ([self.playAgainButton containsPoint:touchLocation]) {
[self presentGamePlayScene];
} else if([self.mainMenuButton containsPoint:touchLocation]) {
[self presentMainMenu];
}
}
- (void)presentGamePlayScene {
gamePlayScene *newGamePlay = [[gamePlayScene alloc]init];
newGamePlay.scaleMode = SKSceneScaleModeAspectFill;
SKTransition *arbitraryTransition = [SKTransition crossFadeWithDuration:2.0]; //look into SKTransition for a plethora of different options.
[self.view presentScene:newGamePlay transition:arbitraryTransition];
}
3)要通过接触更改场景,请遵守SKPhysicsContactDelegate
任何给定协议SKScene
。在该场景的实现中:
- (void)didBeginContact:(SKPhysicsContact *)contact {
if(contact.bodyA.categoryBitMask == enemyCategory && contact.bodyB.categoryBitMask == arbitraryNodeCategory) {
[self presentGameOverScene];
}
}
一个SKPhysicsContact
有2碰撞SKPhysicsBody
s可通过属性附加到它。这些冲突节点必须对其进行SKPhysicsBody
初始化。此外,他们必须像下面这样contactBitMask
设置其属性SKPhysicsBody
:
@implementation SomeNode
- (instanceType)initCollidingNode {
if(self = [super init]) {
self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.someSize];
self.physicsBody.contactBitMask = enemyCategory | powerUpCategory;
self.physicsBody.categoryBitMask = arbitraryNodeCategory;
self.physicsBody.dynamic = YES
}
return self;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句