iOS Dev (49) 蘋果官方 SpriteKit Game 模版 – iPhone手機開發技術文章 iPhone軟體開發教學課程

iOS Dev (49) 蘋果官方 SpriteKit Game 模版

  •  
  • 基本架構

    - AppDelegate - ViewController:基礎的 VC。 - MyScene:動畫場景,處理動作等等。

    在 AppDelegate 中實例化一個 ViewController,在 ViewController 中實例化一個 MyScene。

    AppDelegate

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        self.window.rootViewController = [[ViewController alloc] init];   
        [self.window makeKeyAndVisible];
        return YES;
    }
    

    ViewController

    - (void)loadView
    {
        self.view = [[SKView alloc] initWithFrame:CGRectMake(0, 0, 320, 568)];
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        SKView * skView = (SKView *)self.view;
        SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
        scene.scaleMode = SKSceneScaleModeAspectFill;
    
        [skView presentScene:scene];
    }
    

    上面這個很好看懂。loadView 裡面初始化 view,這個一定要記住,不能在 init 中做,也不能在 viewDidLoad 中做。

    viewDidLoad 中,先實例化一個 MyScene,設置這個 MyScene 帶 scaleMode 為 SKSceneScaleModeAspectFill。最後再在 view 上 present 這個 scene。

    以上步驟,都是常規做法。

    MyScene

    -(id)initWithSize:(CGSize)size {    
        if (self = [super initWithSize:size]) {
            self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];
    
            SKLabelNode *myLabel = [SKLabelNode labelNodeWithFontNamed:@Chalkduster];
    
            myLabel.text = @Hello, World!;
            myLabel.fontSize = 30;
            myLabel.position = CGPointMake(CGRectGetMidX(self.frame),
                                           CGRectGetMidY(self.frame));
    
            [self addChild:myLabel];
        }
        return self;
    }
    
    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        /* Called when a touch begins */
    
        for (UITouch *touch in touches) {
            CGPoint location = [touch locationInNode:self];
    
            SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@Spaceship];
    
            sprite.position = location;
    
            SKAction *action = [SKAction rotateByAngle:M_PI duration:1];
    
            [sprite runAction:[SKAction repeatActionForever:action]];
    
            [self addChild:sprite];
    
            NSLog(@for loop);
        }
    
        NSLog(@touchesBegan);
    }
    

    實現 touchesBegan 方法,這個方法是 MyScene 從 UIResponder 繼承來的,其定義為:

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

    這個繼承關系是這樣帶:

    MyScene -> SKScene -> SKEffectNode -> SKNode -> UIResponder
    

    回頭來說這個 touchesBegan 吧。

    1. 先獲取到 touch 的點 location。
    2. 創建一個 sprite,用的是 spriteNodeWithImageNamed 這個 API。
    3. 設置這個 sprite 帶位置。
    4. 創立一個 SKAction,讓 sprite 來 repeat 這個 action。
    5. 最後呢,把這個 sprite 加到 scene 上吧。

      轉載請註明來自大銳哥的博客:https://prevention.iteye.com

發佈留言