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

风的驿站

一徐清风,半指烛光,觥筹已净,只余茶香。残卷一章,妙趣非常,忽闻帘响,愿闻其详?

 
 
 

日志

 
 
关于我

喜欢写生 编程 音乐 设计 喜欢把自己的想法变成实实在在的东西 喜欢安静的做一些事情 CSDN博客:http://blog.csdn.net/qwertyupoiuytr

网易考拉推荐

【原创】手把手教你制作一款Box2D小游戏(三)  

2014-06-23 13:44:45|  分类: Box2D |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

接着我们先来重写ContactListener

类声明:

#import "Box2D.h"

 

class ContactListener : public b2ContactListener

{

public:

      void BeginContact(b2Contact* contact);

      void PreSolve(b2Contact* contact, const b2Manifold* oldManifold);

      void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse);

      void EndContact(b2Contact* contact);

};

类定义:

#import "ContactListener.h"

#import "cocos2d.h"

#import "GameLayer.h"

 

void ContactListener::BeginContact(b2Contact* contact)

{

    b2Body* body = contact->GetFixtureA()->GetBody();

    NSNumber* userData = (NSNumber*)(body->GetUserData());

    if (userData == nil) {

        return;

    }

    int tag = [userData intValue];

    if (tag == -1) {

        body = contact->GetFixtureB()->GetBody();

        userData = (NSNumber*)(body->GetUserData());

        if (userData == nil) {

            return;

        }

        tag = [userData intValue];

        if (tag == -2) {

            return;

        }

    }

   

    int lastScoredStep = [[GameLayer gameLayer] lastScoredStep];

    if (lastScoredStep == -1) {

        [GameLayer gameLayer].lastScoredStep = tag;

        return;

    } else if (lastScoredStep != tag) {

        [GameLayer gameLayer].lastScoredStep = tag;

        [[GameLayer gameLayer] addScore];

    }

}

void ContactListener::PreSolve(b2Contact* contact, const b2Manifold* oldManifold){}

void ContactListener::PostSolve(b2Contact* contact, const b2ContactImpulse* impulse){}

void ContactListener::EndContact(b2Contact* contact){}

这里我们重写了BeginContact方法,当有刚体之间的碰撞发生时,我们通过判断两个刚体的类型来判断是否得分,刚体类型的判断就用的是我们前面的tag,注意这里我们做了判断,由于我们没有为墙体指定tag,所以当墙体的userData转换为NSNumber指针时为nil,这时候就没有必要再做判断了,并且我们为了防止重复记分,例如小球连续两次碰到当前Block(例如小球碰撞之后弹起又碰撞,或者遇到高矮台阶的那种Block),这时候就通过lastScoredStep来比较,lastScoredStep始终记录前一次得分的StepBlock

最后我们来定义Ball类:

声明如下:

#import "CCNode.h"

#import "cocos2d.h"

#import "Box2D.h"

 

@interface Ball : CCNode{

    float screenWidth;

    float screenHeight;

    b2Body* body;

    CCSprite* shape;

}

 

+ (Ball*)ball;

 

- (void)reset;

- (void)pushLeft;

- (void)pushRight;

 

@end

定义:

#import "Ball.h"

#import "cocos2d.h"

#import "GB2ShapeCache.h"

#import "TagDefinitions.h"

#import "GameLayer.h"

 

@implementation Ball

 

+ (Ball*)ball{

    return [[[Ball alloc] init] autorelease];

}

 

- (id)init{

    if (self = [super init]) {

        //screen dimensions

        CGSize screenSize = [[CCDirector sharedDirector] winSize];

        screenHeight = screenSize.height;

        screenWidth = screenSize.width;

       

        shape = [CCPhysicsSprite spriteWithFile:@"ball.png"];

        shape.anchorPoint = ccp(0.5f, 0.5f);

        CGPoint position = ccp(screenWidth*0.5f, screenHeight*0.5f+50);

        b2BodyDef bodyDef;

        bodyDef.type = b2_dynamicBody;

        bodyDef.userData = [NSNumber numberWithInteger:-1];

        bodyDef.position.Set(position.x/PTM_RATIO, position.y/PTM_RATIO);

        body = [[GameLayer gameLayer] sharedWorld]->CreateBody(&bodyDef);

        [[GB2ShapeCache sharedShapeCache] addFixturesToBody:body forShapeName:@"ball"];

        [shape setPTMRatio:PTM_RATIO];

        [shape setB2Body:body];

        [shape setPosition:position];

       

        [self addChild:shape];

    }

   

    return self;

}

 

- (void)pushLeft{

    b2Vec2 force;

    force.Set(-4.0f, 0);

    body->ApplyForceToCenter(force);

}

 

- (void)pushRight{

    b2Vec2 force;

    force.Set(4.0f, 0);

    body->ApplyForceToCenter(force);

}

 

- (void)reset{

    CGPoint position = ccp(screenWidth*0.5f, screenHeight*0.5f+50);

    b2Vec2 pos;

    pos.Set(position.x/PTM_RATIO, position.y/PTM_RATIO);

    body->SetTransform(pos, 0);

    [shape setPosition:position];

}

 

- (CGPoint)position{

    return shape.position;

}

 

@end

小球的图片素材:

【原创】手把手教你制作一款Box2D小游戏(三) - 远行的风 - 风的驿站

小球类比较简单,通过ApplyForceToCenter来对小球施力即可。

这样我们的游戏就基本制作完成了,限于篇幅,我们没有列出各个类的dealloc方法,请读者补充完成,释放资源。此外,还可以添加一些音效,添加开始界面和GameOver界面等等。

 

教程就到这里,如果有问题,欢迎留言~

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

历史上的今天

评论

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

页脚

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