H:/0929/01_运行时_main.m
H:/0929/01_运行时_NSObject+MJ.h
H:/0929/01_运行时_NSObject+MJ.m
H:/0929/01_运行时_Status.h
H:/0929/01_运行时_Status.m
H:/0929/01_运行时_User.h
H:/0929/01_运行时_User.m
H:/0929/02_雷电_Bullet.h
H:/0929/02_雷电_Bullet.m
H:/0929/02_雷电_Enemy.h
H:/0929/02_雷电_Enemy.m
H:/0929/02_雷电_GameLayer.h
H:/0929/02_雷电_GameLayer.m
H:/0929/02_雷电_Player.h
H:/0929/02_雷电_Player.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