IOS_Cocos2D_运行时_雷电游戏

H:/0929/01_运行时_main.m
//
//  main.m
//  02-runtime
//
//  Created by apple on 13-9-29.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "User.h"
#import "Status.h"

//#import <objc/runtime.h>
#import <objc/message.h>


// clang -rewrite-objc main.m  预编译为C++\C语言代码

int a = 20;

int main(int argc, const char * argv[])
{
    /*
     {
     idstr : "2",
     text : "今天天气真好",
     user : {
        idstr : "1",
        screen_name : "哈哈"
     },
     created_at : "1991-01-01"
     
     }
     */
    @autoreleasepool {
        int age = 10;
        
        void (^block)() = ^{
            NSLog(@"age = %d, a = %d", age, a);
        };
        
        age = 20;
        
        a = 50;
        
        block();
    }
    return 0;
}

void test2()
{
    NSData *data = [NSData dataWithContentsOfFile:@"/Users/apple/Desktop/status.txt"];
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
    
    Status *status = [[Status alloc] initWithDict:dict];
    
    NSLog(@"%@", status.user);
}

void test()
{
    Person *p = [[Person alloc] init];
    
    // p.age = 10;
    
    objc_msgSend(p, @selector(setAge:), 10);
    objc_msgSend(p, @selector(setName:), @"mj");
    
    
    NSLog(@"%d - %@", p.age, p.name);
}


H:/0929/01_运行时_NSObject+MJ.h
//
//  NSObject+MJ.h
//  02-runtime
//
//  Created by apple on 13-9-29.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSObject (MJ)
- (void)setValues:(NSDictionary *)dict;
@end

H:/0929/01_运行时_NSObject+MJ.m
//
//  NSObject+MJ.m
//  02-runtime
//
//  Created by apple on 13-9-29.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import "NSObject+MJ.h"

#import <objc/runtime.h>
#import <objc/message.h>

@implementation NSObject (MJ)
- (void)setValues:(NSDictionary *)dict
{
    unsigned int count;
    
    // 获得所有的成员变量
    Ivar *ivars = class_copyIvarList([self class], &count);
    
    for (int i = 0; i<count; i++) {
        Ivar ivar = ivars[i];
        // 获得成员变量的名称
        const char *name = ivar_getName(ivar);
        // _text
        NSMutableString *ocName = [NSMutableString stringWithUTF8String:name];
        // 删掉最前面的_
        [ocName deleteCharactersInRange:NSMakeRange(0, 1)];
        NSString *key = [ocName copy];
        
        // 首字母的大写
        NSString *capital = [ocName substringToIndex:1].uppercaseString;
        // 替换首字母
        [ocName replaceCharactersInRange:NSMakeRange(0, 1) withString:capital];
        NSString *setter = [NSString stringWithFormat:@"set%@:", ocName];
        
        id value = dict[key];
        
        // 数值类型(转成基本数据类型)
        if ([value isKindOfClass:[NSNumber class]]) {
            objc_msgSend(self, NSSelectorFromString(setter), [value intValue]);
        } else {
            objc_msgSend(self, NSSelectorFromString(setter), value);
        }
    }
}
@end

H:/0929/01_运行时_Status.h
//
//  Status.h
//  02-runtime
//
//  Created by apple on 13-9-29.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>
@class User;
@interface Status : NSObject
@property (nonatomic, copy) NSString *idstr;
@property (nonatomic, copy) NSString *text;
@property (nonatomic, copy) NSString *created_at;

@property (nonatomic, strong) User *user;

- (id)initWithDict:(NSDictionary *)dict;
@end

H:/0929/01_运行时_Status.m
//
//  Status.m
//  02-runtime
//
//  Created by apple on 13-9-29.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import "Status.h"
#import "User.h"
#import "NSObject+MJ.h"

@implementation Status
- (id)initWithDict:(NSDictionary *)dict
{
    if (self = [super init]) {
        [self setValues:dict];
    }
    return self;
}

- (void)setUser:(User *)user
{
    if ([user isKindOfClass:[NSDictionary class]]) {
        _user = [[User alloc] initWithDict:(NSDictionary *)user];
    } else {
        _user = user;
    }
}
@end

H:/0929/01_运行时_User.h
//
//  User.h
//  02-runtime
//
//  Created by apple on 13-9-29.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface User : NSObject
@property (nonatomic, copy) NSString *idstr;
@property (nonatomic, copy) NSString *screen_name;
@property (nonatomic, assign) int age;

- (id)initWithDict:(NSDictionary *)dict;
@end

H:/0929/01_运行时_User.m
//
//  User.m
//  02-runtime
//
//  Created by apple on 13-9-29.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import "User.h"
#import "NSObject+MJ.h"

@implementation User
- (id)initWithDict:(NSDictionary *)dict
{
    if (self = [super init]) {
        [self setValues:dict];
    }
    return self;
}
@end

H:/0929/02_雷电_Bullet.h
//
//  Bullet.h
//  06-飞机
//
//  Created by apple on 13-9-29.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import "CCSprite.h"

typedef enum {
    kBulletTypeSmall,
    kBulletTypeBig
} BulletType;

@interface Bullet : CCSprite

@property (nonatomic, assign) BulletType type; // 子弹类型

@property (nonatomic, assign) CGPoint velocity; // 速度

- (void)showFrom:(CGPoint)from velocity:(CGPoint)velocity;
- (void)hide;

@end

H:/0929/02_雷电_Bullet.m
//
//  Bullet.m
//  06-飞机
//
//  Created by apple on 13-9-29.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import "Bullet.h"
#import "cocos2d.h"
#import "SimpleAudioEngine.h"
@implementation Bullet

- (void)setType:(BulletType)type
{
    _type = type;
    
    // 更换图片
    NSString *name = _type == kBulletTypeSmall ? @"bullet1.png" : @"bullet2.png";
    [self setDisplayFrame:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:name]];
}

- (void)showFrom:(CGPoint)from velocity:(CGPoint)velocity{
    self.visible = YES;
    
    // 设置位置
    self.position = from;
    
    // 设置速度
    self.velocity = velocity;
    
    // 开始消息调度
    [self scheduleUpdate];
    
//    [[SimpleAudioEngine sharedEngine] playEffect:@"bullet.mp3"];
}

- (void)hide
{
    self.visible = NO;
    
    [self unscheduleAllSelectors];
}

- (void)update:(ccTime)delta
{
    // 飞行一段距离
    CGPoint distance = ccpMult(self.velocity, delta);
    self.position = ccpAdd(self.position, distance);
}

@end

H:/0929/02_雷电_Enemy.h
//
//  Enemy.h
//  06-飞机
//
//  Created by apple on 13-9-29.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import "CCSprite.h"

typedef enum {
    kEnemyTypeBoss = 3,
    kEnemyTypeMini = 1,
    kEnemyTypeMiddle = 2
} EnemyType;

@interface Enemy : CCSprite

@property (nonatomic, assign) EnemyType type;
- (void)show;
- (void)hide;
- (void)gotHit;
@end

H:/0929/02_雷电_Enemy.m
//
//  Enemy.m
//  06-飞机
//
//  Created by apple on 13-9-29.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import "Enemy.h"
#import "cocos2d.h"
#import "SimpleAudioEngine.h"

@interface Enemy()
{
    int _maxHp;
    int _hp; // 生命值
}
@end

@implementation Enemy

- (void)show
{
    _hp = _maxHp;
    
    self.visible = YES;
    
    self.anchorPoint = ccp(0.5, 0);
    
    CGSize winSize = [CCDirector sharedDirector].winSize;
    self.position = ccp(winSize.width * CCRANDOM_0_1(), winSize.height - 1);
    
    [self scheduleUpdate];
}

- (void)hide
{
    self.visible = NO;
    
    [self unscheduleAllSelectors];
}

- (void)update:(ccTime)delta
{
    self.position = ccpAdd(self.position, ccp( 0, -100 * delta));
}

- (void)setCurrentFrame
{
    NSString *name = [NSString stringWithFormat:@"enemy%d_fly_1.png", _type];
    [self setDisplayFrame:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:name]];
}

- (void)setType:(EnemyType)type
{
    _type = type;
    
    // 飞机的图片
    [self setCurrentFrame];
    
    // 设置最大生命值
    switch (type) {
        case kEnemyTypeMini:
            _maxHp = 1;
            break;
        case kEnemyTypeMiddle:
            _maxHp = 3;
            break;
        case kEnemyTypeBoss:
            _maxHp = 10;
            break;
        default:
            break;
    }
}

- (void)gotHit
{
    _hp--;
    
    if (_hp == 0) {
        // 停止消息调度
        [self unscheduleAllSelectors];
        
        // 播放音效
        [[SimpleAudioEngine sharedEngine] playEffect:[NSString stringWithFormat:@"enemy%d_down.mp3", _type]];
        
        // 爆炸
        NSMutableArray *frames = [NSMutableArray array];
        for (int i = 1; i<=4; i++) {
            NSString *name = [NSString stringWithFormat:@"enemy1_blowup_%d.png", i];
            CCSpriteFrame *f = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:name];
            [frames addObject:f];
        }
        
        CCAnimation *animation = [CCAnimation animationWithSpriteFrames:frames delay:0.1];
        CCAnimate *explosion = [CCAnimate actionWithAnimation:animation];
        [self runAction:[CCSequence actions:explosion, [CCHide action], [CCCallFunc actionWithTarget:self selector:@selector(setCurrentFrame)], nil]];
    }
}

@end

H:/0929/02_雷电_GameLayer.h
//
//  GameLayer.h
//  06-飞机
//
//  Created by apple on 13-9-28.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import "CCLayer.h"
#import "cocos2d.h"

@interface GameLayer : CCLayer
+ (CCScene *)scene;
@end

H:/0929/02_雷电_GameLayer.m
//
//  GameLayer.m
//  06-飞机
//
//  Created by apple on 13-9-28.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import "GameLayer.h"
#import "Player.h"
#import "Enemy.h"
#import "Bullet.h"
#import "SimpleAudioEngine.h"

// 子弹出现的时间间隔
#define kBulletShowStepTime 0.3
// 子弹的最大数量
#define kBulletMaxCount 10
// 敌机的最大数量
#define kMiniEnemyMaxCount 5

@interface GameLayer()
{
    CCSpriteBatchNode *_batch;
    
    CCSprite *_bg1, *_bg2;
    
    Player *_player;
    
    BOOL _isGameRuning;
    
    CGFloat _bulletShowTime; // 子弹出现的累积时间
    
    CCArray *_bullets; // 子弹缓存
    CCArray *_miniEnemies; // 敌机
}
@end

@implementation GameLayer
+ (CCScene *)scene
{
    CCScene *scene = [CCScene node];
    
    GameLayer *layer = [GameLayer node];
    [scene addChild:layer];
    
    return scene;
}

- (id)init
{
    if (self = [super init]) {
        // 1.基本初始化
        [self setupBasic];
        
        // 2.初始化背景
        [self setupBg];
        
        // 3.初始化玩家
        [self setupPlayer];
        
        // 4.初始化子弹
        [self setupBullets];
        
        // 5.初始化敌机
        [self setupEnemies];
        
        // 6.开始游戏
        [self beginGame];
    }
    return self;
}

- (void)dealloc
{
    [_bullets release];
    [_miniEnemies release];
    
    [super dealloc];
}

#pragma mark - 游戏控制
#pragma mark 暂停游戏
- (void)pauseGame
{
    _isGameRuning = NO;
    
    // 1.停止消息调度
    [self unscheduleAllSelectors];
    [_batch.children makeObjectsPerformSelector:@selector(unscheduleAllSelectors)];
    
    // 2.暂停背景音乐
//    [[SimpleAudioEngine sharedEngine] pauseBackgroundMusic];
    
    self.touchEnabled = NO;
}

#pragma mark 开始游戏
- (void)beginGame
{
    _isGameRuning = YES;
    
    // 1.开始消息调度
    [self scheduleUpdate];
    
    // 2.播放背景音乐
//    [[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"game_music.mp3"];
    
    // 3.子弹出现时间
    _bulletShowTime = kBulletShowStepTime;
    
    self.touchEnabled = YES;
}

#pragma mark 结束游戏
- (void)endGame
{
    _isGameRuning = NO;
    
    // 1.停止消息调度
    [self unscheduleAllSelectors];
    [_batch.children makeObjectsPerformSelector:@selector(unscheduleAllSelectors)];
    
    // 2.停止背景音乐
    [[SimpleAudioEngine sharedEngine] stopBackgroundMusic];
    [[SimpleAudioEngine sharedEngine] playEffect:@"game_over.mp3"];
    
    
    self.touchEnabled = NO;
}

#pragma mark - 消息调度
- (void)update:(ccTime)delta
{
    // 1.滚动背景
    [self scrollBg];
    
    // 2.补充子弹
    [self showBullets:delta];
    
    // 3.补充敌机
    [self showEnemies:delta];
    
    // 4.碰撞\边界检测
    [self collsionAndBoundCheck];
}

#pragma mark 补充敌机
- (void)showEnemies:(ccTime)delta
{
    Enemy *enemy;
    CCARRAY_FOREACH(_miniEnemies, enemy)
    {
        if (enemy.visible == NO) { // 有可用的敌机
            [enemy show];
            break;
        }
    }
}

#pragma mark 补充子弹
- (void)showBullets:(ccTime)delta
{
    _bulletShowTime += delta;
    
    if (_bulletShowTime >= kBulletShowStepTime) {
        Bullet *bullet;
        CCARRAY_FOREACH(_bullets, bullet)
        {
            if (bullet.visible == NO) { // 有可用的子弹
                CGPoint from = ccp(_player.position.x,
								CGRectGetMaxY(_player.boundingBox));
                [bullet showFrom:from velocity:ccp(0, 200)];
                break;
            }
            
            bullet = nil;
        }
        
        // 没有可循环利用的子弹
        if (bullet == nil) {
            Bullet *b = [Bullet node];
            b.type = kBulletTypeBig;
            b.visible = NO;
            // 添加到数组中
            [_bullets addObject:b];
            
            // 添加到屏幕
            [_batch addChild:b];
            
            // 射出新子弹
            CGPoint from = ccp(_player.position.x,
							CGRectGetMaxY(_player.boundingBox));
            [b showFrom:from velocity:ccp(0, 200)];
        }
        
        _bulletShowTime = 0;
    }
}

#pragma mark 碰撞\边界检测
- (void)collsionAndBoundCheck
{
    // 子弹检测
    Bullet *bullet;
    CCARRAY_FOREACH(_bullets, bullet)
    {
        if (bullet.visible == NO) continue;
        
        if (!CGRectIntersectsRect(self.boundingBox,bullet.boundingBox)) { // 1.边界检测
            [bullet hide];
            CCLOG(@"子弹离开屏幕");
        } else { // 2.碰撞检测
            // 敌机检测
            Enemy *enemy;
            CCARRAY_FOREACH(_miniEnemies, enemy)
            {
                // 如果不可见,不需要检测
                if (enemy.visible == NO) continue;
                
                if (!CGRectIntersectsRect(self.boundingBox,
											enemy.boundingBox)) {
                    [enemy hide];
                    CCLOG(@"敌机离开屏幕"); 
                } else if (CGRectIntersectsRect(bullet.boundingBox,
							enemy.boundingBox)) {
                    // 隐藏子弹
                    [bullet hide];
                    
                    // 敌机中弹
                    [enemy gotHit];
                } else {
                    if (CGRectContainsRect(_player.boundingBox,
											enemy.boundingBox)) {
                        [_player gotHit];
                        
                        // over
                        [self endGame];
                    }
                }
            }
        }
    }
    
    // 敌机检测
//    Enemy *enemy;
//    CCARRAY_FOREACH(_miniEnemies, enemy)
//    {
//        // 如果不可见,不需要检测
//        if (enemy.visible == NO) continue;
//        
//        // 1.边界检测
//        if (!CGRectIntersectsRect(self.boundingBox, enemy.boundingBox)) {
//            [enemy hide];
//            CCLOG(@"敌机离开屏幕");
//        } else {
//            if (CGRectContainsRect(_player.boundingBox, enemy.boundingBox)) {
//                [_player gotHit];
//                
//                // over
//                [self endGame];
//            }
//        }
//    }
}

#pragma mark 滚动背景
- (void)scrollBg
{
    CGFloat height = _bg1.contentSize.height;
    
    CGFloat bg1Y = _bg1.position.y;
    bg1Y --;
    
    if (bg1Y <= -height) {
        bg1Y = 0;
    }
    
    _bg1.position = ccp(0, bg1Y);
    _bg2.position = ccp(0, bg1Y + height);
}

#pragma mark - 初始化
#pragma mark 基本初始化
- (void)setupBasic
{
    // 1.加载纹理相册
    [[CCSpriteFrameCache sharedSpriteFrameCache]
					addSpriteFramesWithFile:@"gameArts.plist"];
    
    // 2.创建批处理
    _batch = [CCSpriteBatchNode batchNodeWithFile:@"gameArts.png"];
    [self addChild:_batch];
}

#pragma mark 初始化背景
- (void)setupBg
{
    _bg1 = [CCSprite spriteWithSpriteFrameName:@"background_2.png"];
    _bg1.anchorPoint = CGPointZero;
    
    _bg2 = [CCSprite spriteWithSpriteFrameName:@"background_2.png"];
    _bg2.anchorPoint = CGPointZero;
    
    [_batch addChild:_bg1];
    [_batch addChild:_bg2];
}

#pragma mark 初始化玩家
- (void)setupPlayer
{
    _player = [Player node];
    [_batch addChild:_player];
}

#pragma mark 初始化子弹
- (void)setupBullets
{
    _bullets = [[CCArray alloc] init];
    
    for (int i = 0; i<kBulletMaxCount; i++) {
        Bullet *b = [Bullet node];
        b.type = kBulletTypeBig;
        b.visible = NO;
        // 添加到数组中
        [_bullets addObject:b];
        
        // 添加到屏幕
        [_batch addChild:b];
    }
}

#pragma mark 初始化敌机
- (void)setupEnemies
{
    // 1.初始化mini敌机
    _miniEnemies = [[CCArray alloc] init];
    
    for (int i = 0; i<kMiniEnemyMaxCount; i++) {
        Enemy *e = [Enemy node];
        e.type = kEnemyTypeMini;
        e.visible = NO;
        // 添加到数组中
        [_miniEnemies addObject:e];
        
        // 添加到屏幕
        [_batch addChild:e];
    }
}

#pragma mark - 触摸监听
- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    
    // 1.当前点
    CGPoint curP = [[CCDirector sharedDirector]
					convertToGL:[touch locationInView:touch.view]];
    
    // 2.上一个点
    CGPoint lastP = [[CCDirector sharedDirector]
					convertToGL:[touch previousLocationInView:touch.view]];
    
    // 3.设置飞机的位置
    _player.position = ccpAdd(_player.position, ccpSub(curP, lastP));
}
@end

H:/0929/02_雷电_Player.h
//
//  Player.h
//  06-飞机
//
//  Created by apple on 13-9-28.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import "CCSprite.h"

@interface Player : CCSprite
 - (void)gotHit;
@end

H:/0929/02_雷电_Player.m
//
//  Player.m
//  06-飞机
//
//  Created by apple on 13-9-28.
//  Copyright (c) 2013年 itcast. All rights reserved.
//

#import "Player.h"
#import "cocos2d.h"

@implementation Player

- (id)init
{
    if (self = [super initWithSpriteFrameName:@"hero_fly_1.png"]) {
        // 1.初始化位置
        self.anchorPoint = ccp(0.5, 0);
        self.position = ccp([CCDirector sharedDirector].winSize.width * 0.5, 0);
        
        // 2.播放帧动画
        CCSpriteFrameCache *cache = [CCSpriteFrameCache sharedSpriteFrameCache];
        CCSpriteFrame *frame1 = [cache spriteFrameByName:@"hero_fly_1.png"];
        CCSpriteFrame *frame2 = [cache spriteFrameByName:@"hero_fly_2.png"];
        CCAnimation *animation = [CCAnimation animationWithSpriteFrames:@[frame1, frame2] delay:0.1];
        [self runAction:[CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:animation]]];
    }
    return self;
}

- (void)gotHit
{
    // 停止之前的帧动画
    [self stopAllActions];
    
    // 直接爆炸
    NSMutableArray *frames = [NSMutableArray array];
    
    for (int i = 1; i<=4; i++) {
        NSString *name = [NSString stringWithFormat:@"hero_blowup_%d.png", i];
        CCSpriteFrame *f = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:name];
        [frames addObject:f];
    }
    
    CCAnimation *animation = [CCAnimation animationWithSpriteFrames:frames delay:0.1];
    [self runAction:[CCAnimate actionWithAnimation:animation]];
}

@end

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值