当前位置:编程学习 > C/C++ >>

Sprite Kit编程指南(1)-深入Sprite Kit

深入Sprite Kit


学习Sprite Kit最好的方法是在实践中观察它。此示例创建一对场景和各自的动画内容。通过这个例子,你将学习使用Sprite Kit内容的一些基础技术,包括:

·      场景在一个基于Sprite Kit的游戏中的角色。

·      如何组织节点树来绘制内容。

·      使用动作让场景内容动起来。

·      如何添加交互到场景。

·      场景之间的过渡。

·      在一个场景里模拟物理。

一旦你完成这个项目,你可以用它来试验其他Sprite Kit概念。你可以在这个例子的结尾找到一些建议。

你应该已经熟悉创建iOS应用程序之前通过这个项目工作。欲了解更多信息,请参阅今天开始开发iOS应用程序的。大多数Sprite Kit在这个例子中的代码是相同的OS X。

 


让我们开始吧


本次练习需要Xcode 5.0。使用的单一视图的应用程序模板创建一个新的iOS应用程序的Xcode项目。

在创建项目时,请使用以下值:

·      产品名称:SpriteWalkthrough

·      ClassPrefix:Sprite

·      设备:iPad

添加Sprite Kit框架到项目中。

 


创建你的第一个场景


Sprite Kit内容被放置在一个窗口中,就像其他可视化内容那样。Sprite Kit内容由SKView类渲染呈现。SKView对象渲染的内容称为一个场景,它是一个SKScene对象。场景参与响应链,还有其他使它们适合于游戏的功能。

因为Sprite Kit内容由视图对象渲染,你可以在视图层次组合这个视图与其他视图。例如,你可以使用标准的按钮控件,并把它们放在你的Sprite Kit视图上面。或者,你可以添加交互到精灵来实现自己的按钮,选择权在你。在这个例子中,稍候你会看到如何实现场景交互。

 


配置视图控制器来使用Sprite Kit

 


1.    打开项目的storyboard。它有一个单一的视图控制器(SpriteViewController)。选择视图控制器的view对象并把它的类改成SKView。

2.    在视图控制器的实现文件添加一个导入行。

[cpp]
#import <SpriteKit/SpriteKit.h> 

#import <SpriteKit/SpriteKit.h>3.    实现视图控制器的viewDidLoad方法来配置视图。


[cpp]
- (void)viewDidLoad 

    [super viewDidLoad]; 
    SKView * spriteView =(SKView *)self.view; 
    spriteView.showsDrawCount = YES; 
    spriteView.showsNodeCount = YES; 
    spriteView.showsFPS = YES; 

- (void)viewDidLoad
{
    [super viewDidLoad];
    SKView * spriteView =(SKView *)self.view;
    spriteView.showsDrawCount = YES;
    spriteView.showsNodeCount = YES;
    spriteView.showsFPS = YES;
}
4.    代码开启了描述场景如何渲染视图的诊断信息。最重要的一块信息是帧率(spriteView.showsFPS),你希望你的游戏尽可能在一个恒定的帧率下运行。其他行展示了在视图中显示了多少个节点,以及使用多少绘画传递来渲染内容(越少越好)的详情。
接下来,添加第一个场景。

 


创建Hello场景

 


1.    创建一个名为HelloScene新类并让它作为SKScene类的子类。

2.    在你的视图控制器导入场景的头文件。


[cpp]
#import “HelloScene.h” 

#import “HelloScene.h”
3.    修改视图控制器来创建场景,并在视图中呈现场景。


[cpp]
- (void)viewWillAppear:(BOOL)animated 
 
   HelloScene *hello = [[HelloScene alloc] initWithSize:CGSizeMake(768,1024)]; 
   SKView *spriteView =(SKView *)self.view; 
   [spriteView presentScene:hello]; 

 - (void)viewWillAppear:(BOOL)animated
{
    HelloScene *hello = [[HelloScene alloc] initWithSize:CGSizeMake(768,1024)];
    SKView *spriteView =(SKView *)self.view;
    [spriteView presentScene:hello];
}
现在,构建并运行项目。该应用程序应该启动并显示一个只有诊断信息的空白屏幕。

 


将内容添加到场景


当设计一个基于Sprite Kit的游戏,你要为你的游戏界面各主要大块(chuck)设计不同的场景类。例如,你可以为主菜单创建一个场景而为游戏设置创建另一个单独的场景。在这里,你会遵循类​​似的设计。这第一个场景显示了传统的“Hello World”文本。

大多数情况下,你可以配置一个场景在它被视图首次呈现时的内容。这跟视图控制器只在视图属性被引用时加载他们的视图的方式是类似的。在这个例子中,代码在didMoveToView:方法内部,每当场景在视图中显示时该方易做图被调用。

 


在场景中显示Hello文本

 


1.    添加一个新的属性到场景的实现文件中来跟踪场景是否已创建其内容。


[cpp]
@inte易做图ce HelloScene() 
@property BOOL contentCreated; 
@end 

@inte易做图ce HelloScene()
@property BOOL contentCreated;
@end
该属性跟踪并不需要向客户端公开的状态,所以,在实现文件中它一个私有接口声明里实现。

2.    实现场景的didMoveToView:方法。


[cpp]
- (self)didMoveToView:(SKView *)view 

    if(!self.contentCreated) 
    { 
        [self createSceneContents]; 
        self.contentCreated = YES; 
    } 

- (self)didMoveToView:(SKView *)view
{
    if(!self.contentCreated)
    {
        [self createSceneContents];
        self.contentCreated = YES;
    }
}每当视图呈现场景时,didMoveToView:方法都会被调用。但是,在这种情况下,场景的内容应只在场景第一次呈现时进行配置。因此,这段代码使用先前定义的属性(contentCreated)来跟踪场景的内容是否已经被初始化。

3.    实现场景的createSceneContents方法。


[cpp]
- (void)createSceneContents 
 
   self.backgroundColor = [SKColor blueColor]; 
   self.scaleMode = SKSceneScaleModeAspectFit; 
   [self AddChild:[self newHelloNode]; 

 - (void)createSceneContents
{
    self.backgroundColor = [SKColor blueColor];
    self.scaleMode = SKSceneScaleModeAspectFit;
    [self AddChild:[self newHelloNode];
}
场景在绘制它的子元素之前用背景色绘制视图的区域。注意使用SKColor类创建color对象。事实上,SKColor不是一个类,它是一个宏,在iOS上映射为UIColor而在OS X上它映射为NSColor。它的存在是为了使创建跨平台的代码更容易。

场景的缩放(scale)模式决定如何进行缩放以适应视图。在这个例子中,代码缩放视图,以便你可以看到场景的所有内容,如果需要使用宽屏(letterboxing)。

4.    实现场景的newHelloNode方法。


[cpp]

- (SKLabelNode *)newHelloNode 

    SKLabelNode * helloNode = [SKLabelNode labelNodeWithFontNamed:@“Chalkduster”]; 
    @helloNode.text =“Hello, World!” 
    helloNode.fontSize = 42; 
helloNode.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame)); 
    return helloNode; 

- (SKLabelNode *)newHelloNode
{
    SKLabelNode * helloNode = [SKLabelNode labelNodeWithFontNamed:@“Chalkduster”];
    @helloNode.text =“Hello, Wo

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,