zoukankan      html  css  js  c++  java
  • IOS学习之路五(SpriteKit 开发飞机大战小游戏一)

    参考SpriteKit 创建游戏的教程今天自己动手做了一下,现在记录一下自己怎么做的,今天之做了第一步,一共有三个部分。

    第一步,项目搭建。

    项目所用图片资源:点击打开链接

    1.在Xcode打开之后,选择File Menu > New > Project,然后你可能会看到下面的示意图所显示的内容:

    iOS-7-SDK_SpriteKit-Airplane_Image1.png

    随便起个名字,我就叫它:2014airplane了。


    2.创建成功后,点击运行如果模板运行成功后接着来。

    3.复制这些图片到你项目中的指定目录并且要确保你的“Copy Items into destination group's folder(如果需要)”被选上。

    4.代码修改如下:

    MyScene.h中的代码:

    //
    //  MyScene.h
    //  2014airplane
    //
    
    //  Copyright (c) 2014年 com.wildcat. All rights reserved.
    //
    
    #import <SpriteKit/SpriteKit.h>
    #import <CoreMotion/CoreMotion.h>
    
    @interface MyScene : SKScene<UIAccelerometerDelegate>{
        CGRect screenRect;
        CGFloat screenHeight;
        CGFloat screenWidth;
        double currentMaxAccelX;
        double currentMaxAccelY;
    
    }
    //声明变量
    //声明运动管理器
    @property (strong,nonatomic)CMMotionManager *motionManager;
    @property SKSpriteNode *plane;           //飞机
    @property SKSpriteNode *planeShadow;     //飞机倒影
    @property SKSpriteNode *propeller;       //螺旋桨
    
    @end

    MyScene.m中的代码:

    //
    //  MyScene.m
    //  2014airplane
    //
    //  Created by wildcat on 14-2-13.
    //  Copyright (c) 2014年 com.wildcat. All rights reserved.
    //
    
    #import "MyScene.h"
    
    @implementation MyScene
    
    -(id)initWithSize:(CGSize)size {    
        if (self = [super initWithSize:size]) {
            //设置场景大小
            screenRect=[[UIScreen mainScreen] bounds];
            screenHeight=screenRect.size.height;
            screenWidth=screenRect.size.width;
            //设置飞机图片
            _plane=[SKSpriteNode spriteNodeWithImageNamed:@"PLANE 8 N.png"];
            _plane.scale=0.6;   //缩放比例
            _plane.zPosition=2; //纵坐标
            _plane.position=CGPointMake(screenWidth/2, 15+_plane.size.height/2); //设置飞机的初始位置
            [self addChild:_plane];
            //添加背景
            SKSpriteNode *backgroud=[SKSpriteNode spriteNodeWithImageNamed:@"airPlanesBackground.png"];
            backgroud.position=CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
            [self addChild:backgroud];
            //添加飞机背景
            _planeShadow=[SKSpriteNode spriteNodeWithImageNamed:@"PLANE 8 SHADOW.png"];
            _planeShadow.scale=0.6;
            _planeShadow.zPosition=1;
            _planeShadow.position=CGPointMake(screenWidth/2+15, _planeShadow.size.height/2);
            [self addChild:_planeShadow];
            //添加螺旋桨
            _propeller=[SKSpriteNode spriteNodeWithImageNamed:@"PLANE PROPELLER 1.png"];
            _propeller.scale=0.2;
            _propeller.position=CGPointMake(screenWidth/2, _plane.size.height+10);
            SKTexture *propeller1=[SKTexture textureWithImageNamed:@"PLANE PROPELLER 1.png"];
            SKTexture *propeller2=[SKTexture textureWithImageNamed:@"PLANE PROPELLER 2.png"];
            SKAction *spin=[SKAction animateWithTextures:@[propeller1,propeller2] timePerFrame:0.1];
            SKAction *spinForever=[SKAction repeatActionForever:spin];
            [_propeller runAction:spinForever];
            [self addChild:_propeller];
            //设置运动管理器
            self.motionManager=[[CMMotionManager alloc] init];
            self.motionManager.accelerometerUpdateInterval=0.2;
            [self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
                [self outputAccelertionData:accelerometerData.acceleration];
                if (error) {
                    NSLog(@"%@",error);
                }
            }];
            
            
            
            
        }
        return self;
    }
    -(void)outputAccelertionData:(CMAcceleration)acceleration{
        currentMaxAccelX=0;
        currentMaxAccelY=0;
        if (fabs(acceleration.x>fabs(currentMaxAccelX))) {
            currentMaxAccelX=acceleration.x;
        }
        if (fabs(acceleration.y>fabs(currentMaxAccelY))) {
            currentMaxAccelY=acceleration.y;
        }
    
    }
    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        /* Called when a touch begins */
        
    }
    
    
    
    //Update现在主要处理两件事情:更新你的位置和交换不同的sprite
    -(void)update:(CFTimeInterval)currentTime {
        /* Called before each frame is rendered */
        //NSLog(@"one second");
        float maxY = screenWidth - _plane.size.width/2;
        float minY = _plane.size.width/2;
        float maxX = screenHeight - _plane.size.height/2;
        float minX = _plane.size.height/2;
        float newY = 0;
        float newX = 0;
        if(currentMaxAccelX > 0.05){
            newX = currentMaxAccelX * 10;
            _plane.texture = [SKTexture textureWithImageNamed:@"PLANE 8 R.png"];
        }
        else if(currentMaxAccelX < -0.05){
            newX = currentMaxAccelX*10;
            _plane.texture = [SKTexture textureWithImageNamed:@"PLANE 8 L.png"];
        }
        else{
            newX = currentMaxAccelX*10;
            _plane.texture = [SKTexture textureWithImageNamed:@"PLANE 8 N.png"];
        }
        newY = 6.0 + currentMaxAccelY *10;
        float newXshadow = newX+_planeShadow.position.x;
        float newYshadow = newY+_planeShadow.position.y;
        newXshadow = MIN(MAX(newXshadow,minY+15),maxY+15);
        newYshadow = MIN(MAX(newYshadow,minX-15),maxX-15);
        float newXpropeller = newX+_propeller.position.x;
        float newYpropeller = newY+_propeller.position.y;
        newXpropeller = MIN(MAX(newXpropeller,minY),maxY);
        newYpropeller = MIN(MAX(newYpropeller,minX+(_plane.size.height/2)-5),maxX+(_plane.size.height/2)-5);
        newX = MIN(MAX(newX+_plane.position.x,minY),maxY);
        newY = MIN(MAX(newY+_plane.position.y,minX),maxX);
        _plane.position = CGPointMake(newX, newY);
        _planeShadow.position = CGPointMake(newXshadow, newYshadow);
        _propeller.position = CGPointMake(newXpropeller, newYpropeller);
        
        
    }
    
    @end
    

    运行结果如下:



    转载请说明:本文转自http://blog.csdn.net/wildcatlele












  • 相关阅读:
    https://blog.csdn.net/nameofcsdn/article/details/53164652
    洛谷
    模板
    模板
    Gym 101911E "Painting the Fence"(线段树区间更新+双端队列)
    Gym 101911F “Tickets”
    图论:最小瓶颈生成树
    图论:次小生成树
    图论:费用流-SPFA+EK
    图论:Dinic算法
  • 原文地址:https://www.cnblogs.com/lixingle/p/3707706.html
Copyright © 2011-2022 走看看