手把手教你制作一款Box2D小游戏(三)

原创 2017年01月03日 21:33:53


接着我们先来重写ContactListener:

类声明:

#import "Box2D.h"

 

class ContactListener : public b2ContactListener

{

public:

      voidBeginContact(b2Contact* contact);

      voidPreSolve(b2Contact* contact, const b2Manifold* oldManifold);

      voidPostSolve(b2Contact* contact, const b2ContactImpulse* impulse);

      voidEndContact(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 = [userDataintValue];

    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){

        [GameLayergameLayer].lastScoredStep = tag;

        return;

    } else if (lastScoredStep!= tag) {

        [GameLayergameLayer].lastScoredStep = tag;

        [[GameLayergameLayer] 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]) {

        //screendimensions

        CGSizescreenSize = [[CCDirector sharedDirector] winSize];

        screenHeight= screenSize.height;

        screenWidth= screenSize.width;

       

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

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

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

        b2BodyDefbodyDef;

        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);

        [[GB2ShapeCachesharedShapeCache] addFixturesToBody:body forShapeName:@"ball"];

        [shapesetPTMRatio:PTM_RATIO];

        [shapesetB2Body:body];

        [shapesetPosition:position];

       

        [selfaddChild: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);

    [shapesetPosition:position];

}

 

- (CGPoint)position{

    return shape.position;

}

 

@end

小球的图片素材:


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

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

 

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


版权声明:本文为博主原创文章,未经博主允许不得转载。

手把手教你制作一款Box2D小游戏(一)

利用Box2D物理引擎来制作一款类似于下楼梯的小游戏
  • qwertyupoiuytr
  • qwertyupoiuytr
  • 2017年01月03日 21:32
  • 222

手把手教你制作一款Box2D小游戏(二)

利用Box2D物理引擎来制作一款类似于下楼梯的小游戏
  • qwertyupoiuytr
  • qwertyupoiuytr
  • 2017年01月03日 21:33
  • 179

手把手教你安卓入门(二)

我们就开始正式开发“计算器”应用
  • anddlecn
  • anddlecn
  • 2016年05月23日 20:59
  • 9704

【汇编】手把手教你打造自己的第一个操作系统

将操作系统写入软盘,并以软盘启动的方式开启操作系统。实现重启计算机,引导现有操作系统,显示及设置时钟(即所谓的操作系统)。调试阶段在vmware+msdos下完成。   实验提示: 1、为了方便...
  • xiaodao1986
  • xiaodao1986
  • 2011年09月07日 11:59
  • 2440

Qt小游戏开发:连连看

继续更新~ 原来csdn博客用底部的批量导入图片就不会失真 预览 步骤 项目结构 包括:游戏逻辑类,界面类,资源 1 定义游戏数据结构 // ------------ 全局...
  • u012234115
  • u012234115
  • 2016年12月16日 19:28
  • 1368

手把手教你打造一个Material Design风格的App(四)

——接上文。 3.3实现导航抽屉菜单项的选择 尽管导航抽屉已经实现了,但是你会发现选择抽屉列表项并没有反应,这是因为我们还没有实现RecycleView items的点击监听。 因为我们在导航抽屉里...
  • u014738140
  • u014738140
  • 2015年05月27日 00:04
  • 2327

《手把手教你读财报》- 读书总结

本书的特色 以贵州茅台2013年财报为线索,引领全书,读起来不至于太枯燥。 理论+实践,很好的典范! 贵州茅台,业务比较单一,财报比较好理解。...
  • FansUnion
  • FansUnion
  • 2016年08月10日 17:17
  • 2503

手把手教你架构3D游戏引擎

在这里将多年游戏研发经验的积累写成一本书奉献给读者,目前已经开始预售,网址: http://www.broadview.com.cn/article/70 该书主要是将游戏中经常使用的技术给大家做了...
  • jxw167
  • jxw167
  • 2016年12月08日 10:16
  • 5257

手把手教你学Ztree

https://note.wiz.cn/pages/manage/biz/payRead.html?kb=3fe9d146-6498-4882-b75c-f533442aba5b
  • huaweitman
  • huaweitman
  • 2017年06月21日 17:51
  • 679

《手把手教你学C语言》学习笔记(1)---C语言的特点

C语言的两个知识点库和指针
  • guochaoxxl
  • guochaoxxl
  • 2017年04月22日 08:18
  • 717
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:手把手教你制作一款Box2D小游戏(三)
举报原因:
原因补充:

(最多只允许输入30个字)