注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

黄金矿工简单实现  

2013-05-25 12:37:17|  分类: ios游戏开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

@implementation HelloWorldLayer



// Helper class method that creates a Scene with the HelloWorldLayer as the only child.

+(CCScene *) scene

{

// 'scene' is an autorelease object.

CCScene *scene = [CCScene node];

// 'layer' is an autorelease object.

HelloWorldLayer *layer = [HelloWorldLayer node];

// add layer as a child to scene

[scene addChild: layer];

// return the scene

return scene;

}


// on "init" you need to initialize your instance

-(id) init

{

// always call "super" init

// Apple recommends to re-assign "self" with the "super's" return value

if( (self=[super init]) ) {

        self.isTouchEnabled = YES;

[self initData];

        [self initUi];

        [self initAction];

        

        [self prepareForRoll];

        

        //开启计时器

        [self schedule:@selector(gameUpdate) interval:0.01];

}

return self;

}


// on "dealloc" you need to release all your retained objects

- (void) dealloc

{

// in case you have something to dealloc, do it in this method

// in this particular example nothing needs to be released.

// cocos2d will automatically release all the children (Label)

// don't forget to call "super dealloc"

    worker = nil;

    hook = nil;

    [actRepeat release];

[super dealloc];

}


#pragma mark update methods

- (void) gameUpdate

{

    switch (hookStatus) {

        case Hook_roll:

            [self updateWhenRolling];

            break;

        case Hook_sendToMine:

            [self updateWhenSendingToMine];

            break;

        case Hook_back:

            [self updateWhenBack];

            break;

        default:

            break;

    }

}


- (void) updateWhenRolling

{

/**

     钩子摇晃,当点击屏幕时,摇晃结束

     

     这里的钩子摇晃采用了ccaction的方法,所以这个方法体为空,不过如果你想采用这个方法来做,也可以

     

     */

}


- (void) updateWhenSendingToMine

{

    //钩子去取黄金时的方法

    //当取到黄金或者到达最大半径的时候,进入返回状态

    //更新位置

    hook.position = ccpAdd(hook.position, ccp(speedX,-speedY));

    currentLen += currentSpeed;

    

    //检查是否碰到物体

    for (int tmpIndex = 0 ; tmpIndex < itemsArray.count ; tmpIndex ++)

    {

        ItemUnit *tmpSprite = (ItemUnit*)[itemsArray objectAtIndex:tmpIndex];

        if ([Tools isCollisionBetweenSprite1:tmpSprite andSprite2:hook])

        {

            activeItem = tmpSprite;

            [self prepareForBack];

            break;

        }

    }

    

    //检查是否到达最远边界

    float len = [Tools getLengthBetweenPoint1:ccp(240,280) andPoint2:hook.position];

    if (len > 240)

    {

        activeItem = NULL;

        [self prepareForBack];

    }

}


- (void) updateWhenBack

{

    //不管是否取到黄金,返回

    //返回结束后,自动进入roll状态

    hook.position = ccpAdd(hook.position, ccp(-speedX,speedY));

    if (activeItem != NULL)

    {

        activeItem.position = ccpAdd(activeItem.position, ccp(-speedX,speedY));

    }

    

    currentLen -= currentSpeed;

    

    if (currentLen <= 0) {

        if (activeItem != NULL) {

            /**进入Hook_roll状态之前

             更新分数显示

             从数组中移除刚才勾住的金子

             从显示层中移除

             置空activeItem

             */

            

            [refOperationLayer updateScore:activeItem.score];

            [self addChild:[OperationLayer node]];

            

            [itemsArray removeObject:activeItem];

            [self removeChild:activeItem cleanup:YES];

            activeItem = NULL;

        }

        

        [self prepareForRoll];

    }

}


-(void)prepareForRoll{

hookStatus = Hook_roll;

    

hook.position = ccp(240,280);

    hook.rotation = 0;

    

    [hook runAction:actRepeat];

}

-(void)prepareForSending{

    [self stopAction:actRepeat];

    

hookStatus = Hook_sendToMine;

    currentSpeed = SPEED_NORMAL;

    

    currentLen = 0;

    

    

    /**速度计算

     

     这里主要是设计一个角度问题

     oc里面内置的三角函数,参数都是弧度,而CCSpriterotate属性则是角度,所以需要做一个简单的角度弧度变换

     

     弧度 = 角度 * PI / 180

     

     

     */

    float currentRotate = hook.rotation*PI/180;

    speedX = currentSpeed * cos(currentRotate);

    speedY = currentSpeed * sin(currentRotate);

    

    

    CCLOG(@"rotate ====== %f",currentRotate);

    CCLOG(@"speedX = %f | speedY = %f",speedX,speedY);

}

-(void)prepareForBack{

hookStatus = Hook_back;

    

    currentSpeed = SPEED_NORMAL;

    if (activeItem != NULL) {

        

        currentSpeed = currentSpeed/(activeItem.weight/10);

        

        float currentRotate = hook.rotation*PI/180;

        speedX = currentSpeed * cos(currentRotate);

        speedY = currentSpeed * sin(currentRotate);

    }

    

    

}


#pragma mark private methods


-(void)initData{

    maxLength = 240;

    

}


-(void)initUi{

    //bg,worker,pobe,golds

    

    worker = [CCSprite spriteWithFile:@"miner.png"];

    worker.position = ccp(240,280);

    [self addChild:worker];

    

    

    //初始化金矿的位置

    //5050   240100   350120

    

itemsArray = [[NSMutableArray alloc]init];

    

ItemUnit* tmpGold1 = [ItemUnit createUnitByType:Item_largeGold];

tmpGold1.position = ccp(50,50);

[self addChild:tmpGold1];

ItemUnit* tmpGold2 = [ItemUnit createUnitByType:Item_middleGold];

tmpGold2.position = ccp(240,100);

[self addChild:tmpGold2];

ItemUnit* tmpGold3 = [ItemUnit createUnitByType:Item_smallGold];

tmpGold3.position = ccp(350,120);

[self addChild:tmpGold3];

[itemsArray addObject:tmpGold1];

[itemsArray addObject:tmpGold2];

[itemsArray addObject:tmpGold3];

    

    

    hook = [CCSprite spriteWithFile:@"hook.png"];

    hook.position = ccp(240,280);

    [self addChild:hook];


}


-(void)initAction{

    /**动作序列

     1,暂停0.2ms

     2,顺时针转180

     3,暂停0.2ms

     4,逆时针转180

     5,重复第一步骤

     

     这里介绍下[actRepeat retain];

     作用是使得actRepeat的引用计数(retainCount+1,不会在过程中被清掉

     因为actRepeat是通过类方法创建的,是autorelease的,而我们是希望能够多次使用这个引用。

     如果不retain一下,在使用一次之后,我们需要暂时停止这个动作,使用[self stopAction:actRepeat]方法

     这个方法会把actRepeat的引用计数降到1,然后就会被自动释放池 释放掉了

     

     当然,这里retain一下,在dealloc里面,需要release一下

     

     

     */

    

    id actHold1 = [CCDelayTime actionWithDuration:0.2f];

    id act1 = [CCRotateBy actionWithDuration:5 angle:180];

    id actHold2 = [CCDelayTime actionWithDuration:0.2f];

    id act2 = [CCRotateBy actionWithDuration:5 angle:-180];

    id seq = [CCSequence actions:actHold1,act1,actHold2,act2, nil];

    actRepeat = [CCRepeatForever actionWithAction:seq];

    

    

    [actRepeat retain];

}


#pragma mark public methods


-(void)setRefOperationLayer:(OperationLayer*)tmpLayer{

    refOperationLayer = tmpLayer;

    

}


#pragma mark draw method


/**

 所有CCNode都有这个方法

 

 CCNodedraw方法是这么注释的

 // override me

 // Only use this function to draw your staff.

 // DON'T draw your stuff outside this method

 

 画你自己的东西,点,线,圆圈的时候,用draw方法

 

 是一个按帧绘制的函数,在绘制当前帧的时候会把前面帧的内容刷新掉。对于我们这个程序来说,这是个好事,呵呵,不用手动清屏了

 */


-(void)draw{

    /*

     设置颜色

     设置线的宽度

     

     */

    

    

    glColorMask(1, 1, 1, 1);

    glLineWidth(2.0f);

    glEnable(GL_LINEAR);

    

    

    //此方法必须放在draw方法中使用

    ccDrawLine(hook.position, ccp(240,280));

}


- (void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{

    switch (hookStatus) {

case Hook_roll:

[self prepareForSending];

break;

case Hook_back:

//什么都不做,如果要做炸弹功能,在这里写

break;

case Hook_sendToMine:

//这里没有需求,什么都不做,将来可以加个 加速的功能,比如说快速去取某个东西啊之类的

default:

break;

}

}


#pragma mark GameKit delegate


-(void) achievementViewControllerDidFinish:(GKAchievementViewController *)viewController

{

AppController *app = (AppController*) [[UIApplication sharedApplication] delegate];

[[app navController] dismissModalViewControllerAnimated:YES];

}


-(void) leaderboardViewControllerDidFinish:(GKLeaderboardViewController *)viewController

{

AppController *app = (AppController*) [[UIApplication sharedApplication] delegate];

[[app navController] dismissModalViewControllerAnimated:YES];

}

@end


  评论这张
 
阅读(49)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017