`
rayln
  • 浏览: 434058 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Cocos2d与chipmunk的使用

阅读更多
新建一个cocos2d-chipmunk项目
首先AppDelegate.m中加入
- (void)applicationDidFinishLaunching:(UIApplication *)application{
    cpInitChipmunk();
}

初始化!!

然后添加类
TestWorld.h
//
//  TestWorld.h
//  TestPiking
//
//  Created by Rayln Guan on 10/3/13.
//  Copyright 2013 __MyCompanyName__. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import "chipmunk.h"
#import "TestSprite.h"
#import "TestSprite2.h"

@interface TestWorld : CCLayerColor {
    cpSpace *space;
    cpShape *wall[4];
}

+ (CCScene *)scene;
@end


//
//  TestWorld.m
//  TestPiking
//
//  Created by Rayln Guan on 10/3/13.
//  Copyright 2013 __MyCompanyName__. All rights reserved.
//

#import "TestWorld.h"


@implementation TestWorld

+ (CCScene *)scene{
    TestWorld *t = [TestWorld node];
    CCScene *s = [CCScene node];
    [s addChild: t];
    return s;
}

- (id)init{
    if(self = [self initWithColor:ccc4(166, 166, 166, 255)]){
        self.isAccelerometerEnabled = YES;
        self.isTouchEnabled = YES;
        //init physics
        [self initPhysics];
        [self initSprite];
        [self scheduleUpdate];
    }
    return self;
}
-(void) initSprite{
    TestSprite *t1 = [[TestSprite alloc] initWithSpace:space];
    [self addChild:t1 z:0 tag:1];
    TestSprite2 *t2 = [[TestSprite2 alloc] initWithSpace:space];
    [self addChild:t2 z:0 tag:1];
}
//该方法是触发chipmunk的重新渲染
-(void) update:(ccTime)time{
    // Should use a fixed size step based on the animation interval.
	int steps = 2;
	CGFloat dt = [[CCDirector sharedDirector] animationInterval]/(CGFloat)steps;
	
	for(int i=0; i<steps; i++){
		cpSpaceStep(space, dt);
	}
}
-(void) initPhysics{
    CGSize s = [[CCDirector sharedDirector] winSize];
    //创建一个space
    space = cpSpaceNew();
    //设置一个重力的x,y,即是垂直和横向的重力
    space->gravity = ccp(10, 10);
    //物理空间设定默认的碰撞回调函数,它的设置是针对全局的,也就是物理空间里任何对象的碰撞都会执行设定的回调函数
    //cpSpaceSetDefaultCollisionHandler
    //设定自定义的碰撞回调规则
    cpSpaceAddCollisionHandler(space, 1, 2, begin, NULL, NULL, NULL, NULL);
    //设置四面墙壁
    wall[0] = cpSegmentShapeNew( space->staticBody, cpv(0,0), cpv(s.width,0), 0.0f);
	// top
	wall[1] = cpSegmentShapeNew( space->staticBody, cpv(0,s.height), cpv(s.width,s.height), 0.0f);
	// left
	wall[2] = cpSegmentShapeNew( space->staticBody, cpv(0,0), cpv(0,s.height), 0.0f);
	// right
	wall[3] = cpSegmentShapeNew( space->staticBody, cpv(s.width,0), cpv(s.width,s.height), 0.0f);
	
	for( int i=0;i<4;i++) {
        //摩擦力
		cpShapeSetElasticity( wall[i], 1.0f );
        //反作用力
		cpShapeSetFriction( wall[i], 1.0f );
		cpSpaceAddStaticShape(space, wall[i] );
	}

}

static int begin(cpArbiter *arb, cpSpace *space, void *unused){
	// Get pointers to the two bodies in the collision pair and define local variables for them.
	// Their order matches the order of the collision types passed
	// to the collision handler this function was defined for
    //CP_ARBITER_GET_SHAPES取出是哪两个shape发生了碰撞,a,b是emery还是bullet,与之前设置回调函数时的第2,3参数的顺序有关
	CP_ARBITER_GET_SHAPES(arb, a, b);
	NSLog(@"begin collision p_x:%1.1f p_y:%1.1f",a->body->p.x,a->body->p.y);
    NSLog(@"%i, %i", a->collision_type, b->collision_type);
	// additions and removals can't be done in a normal callback.
	// Schedule a post step callback to do it.
	// Use the hook as t    he key and pass along the arbiter.
    //我们不能直接在begin函数里面释放刚体或者shape,要等chipmunk做完必要的计算后才能释放。cpSpaceAddPostStepCallback用来安全的完成这个步骤
	cpSpaceAddPostStepCallback(space, (cpPostStepFunc)postStepRemove, a, NULL);
	
	// The object is dead, don't process the collision further
    //返回1是物体撞击事件有效
    //返回0是物体撞击事件无效
	return 1;
}
//碰撞的处理函数
static void postStepRemove(cpSpace *space, cpShape *shape, void *unused)
{
	TestSprite *sprite = shape->data;
	assert(sprite.tag == 1);
	if( sprite ) {
		//[sprite removeFromParentAndCleanup:YES];
	}
}


@end


//
//  TestSprite.h
//  TestPiking
//
//  Created by Rayln Guan on 10/3/13.
//  Copyright 2013 __MyCompanyName__. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import "chipmunk.h"

@interface TestSprite : CCSprite {
    cpSpace *space;
    cpShape *shape;
    cpBody *body;
}
- (id)initWithSpace:(cpSpace *)space;
- (void)setShape:(cpSpace *)space;
@end


//
//  TestSprite.m
//  TestPiking
//
//  Created by Rayln Guan on 10/3/13.
//  Copyright 2013 __MyCompanyName__. All rights reserved.
//

#import "TestSprite.h"


@implementation TestSprite

- (id)initWithSpace:(cpSpace *)space_{
    if (self = [self initWithFile:@"Icon-72.png"]) {
        self.position = ccp(100, 100);
        self.tag = 1;
        int num = 4;
        CGPoint vers[4] = {
            ccp(-36, -36),
            ccp(-36, 36),
            ccp(36, 36),
            ccp(36, -36)
        };
        space = space_;
        //cpBodyNew创建一个刚体,参数如下:刚性质量,刚性惯性值。
        //惯性值的计算使用chipmunk提供的cpMomentForPoly助手函数,参数如下:刚体质量。多边形点数量。多边形点的坐标集。偏移量,会作用到每个点,设为CGPointZero会让事情简单很多。
        body = cpBodyNew(1.0f, cpMomentForPoly(1.0f, num, vers, CGPointZero));
        //设置body的位置
        body->p = ccp(100, 100);
        cpSpaceAddBody(space, body);
        
        shape = cpPolyShapeNew(body, num, vers, CGPointZero);
        //自定义一个类型,用于回调函数用,否则不会回调
        shape->collision_type = 1;
        //shape->e = .5f;shape->u = .5f;
        shape->data = self;
        cpSpaceAddShape(space, shape);
        //cpSpaceAddStaticShape(space, shape);
        //cpSpaceSetGravity( space, cpv(0, -100) );

    }
    return self;
}

- (void)setShape:(cpSpace *)space_{
    //shape = shape_;
    space = space_;
}
//重写该方法,返回YES,这样可以触发nodeToParentTransform方法
- (BOOL)dirty{
    return YES;
}
//重烩Sprite,如果不懂什么意思,可以直接用该方法
-(CGAffineTransform) nodeToParentTransform
{
	CGFloat x = body->p.x;
	CGFloat y = body->p.y;
	
	if ( ignoreAnchorPointForPosition_ ) {
		x += anchorPointInPoints_.x;
		y += anchorPointInPoints_.y;
	}
	
	// Make matrix
	CGFloat c = body->rot.x;
	CGFloat s = body->rot.y;
	
	if( ! CGPointEqualToPoint(anchorPointInPoints_, CGPointZero) ){
		x += c*-anchorPointInPoints_.x + -s*-anchorPointInPoints_.y;
		y += s*-anchorPointInPoints_.x + c*-anchorPointInPoints_.y;
	}
	
	// Translate, Rot, anchor Matrix
	transform_ = CGAffineTransformMake( c,  s,
									   -s,	c,
									   x,	y );
	
	return transform_;
}


- (void)removeFromParentAndCleanup:(BOOL)cleanup{
//    cpSpaceRemoveBody(space, shape->body);
//    cpBodyFree(shape->body);
//    
//    cpSpaceRemoveShape(space, shape);
//    cpShapeFree(shape);
    
    [super removeFromParentAndCleanup:cleanup];
}
@end
分享到:
评论

相关推荐

    IOS应用源码之基于cocos2d和chipmunk的DEMOCrayonBallDemo.rar

    【标题】"IOS应用源码之基于cocos2d和chipmunk的DEMOCrayonBallDemo.rar" 提供了一个iOS平台上的游戏开发实例,它使用了Cocos2d和Chipmunk这两个流行的游戏开发框架。这个源码库可能是为了展示如何在iOS设备上创建一...

    ios应用源码之共享一个自己做的,采用了cocos2d和chipmunk的democr

    通过研究这个源码,开发者不仅可以了解如何在iOS上使用Cocos2D和Chipmunk,还能学习到游戏开发中的基本架构设计、物理模拟以及用户交互的实现技巧。这个Demo对于初学者来说是一个很好的实践项目,而对于有经验的...

    IOS应用源码——采用了cocos2d和chipmunk的DEMOCrayonBallDemo.zip

    这个源码库为我们提供了深入学习iOS游戏开发的机会,尤其是对Cocos2d和Chipmunk这两个核心工具的使用。 Cocos2d是一个开源的2D游戏开发框架,广泛应用于iOS、Android和Mac OS X等平台。它提供了丰富的图形绘制、...

    Cocos2d-x 3.0 开发(九)使用Physicals代替Box2D和chipmunk

    通常这种事情都是交给物理引擎来做 但它们使用的过程中有个令人讨厌的地方 参数太多了 为了初始化一个简单的场景要写很多代码 在cocos2d x 3 0版本中 出现了一个新类族 physicals 它将Box2D或者chipmunk做了一层封装...

    Cocos2d-js中Chipmunk引擎

    在Cocos2d-js中,集成的Chipmunk物理引擎是一个重要的组成部分,用于实现游戏中的物理模拟效果,如重力、碰撞检测以及物体动态行为等。 Chipmunk是源自C语言的一个轻量级2D物理引擎,以其高效和易于使用而受到青睐...

    Iphone Coscos2d + Chipmunk 实例

    Cocos2d与Chipmunk的结合在iOS游戏开发中扮演着重要角色,尤其对于创建2D物理模拟游戏而言,这种组合尤为常见。Cocos2d是一款强大的2D游戏引擎,而Chipmunk则是一个高效的2D物理库,两者配合能实现复杂的物理效果,...

    Cocos2d-x实战:C++卷(2版)源代码

    1. **场景(Scene)与层(Layer)管理**:Cocos2d-x使用场景和层的概念组织游戏画面。场景是一个完整的屏幕视图,而层则是场景中的一个可独立管理的部分,多个层可以组合成一个场景。 2. **精灵(Sprite)与动画**...

    Cocos2d-JS游戏开发

    Cocos2d-JS是一款强大的2D游戏开发框架,它结合了JavaScript的灵活性与Cocos2d-x的高效性能,让开发者能够轻松地创建跨平台的游戏。本篇将深入探讨Cocos2d-JS的游戏开发知识,从基础到进阶,帮助你掌握这一利器。 ...

    Cocos2d-x实战 JS卷

    2. **JavaScript绑定**:Cocos2d-x如何将C++底层库与JavaScript结合,提供JSB(JavaScript Bindings),让开发者能够使用JavaScript编写游戏逻辑。 3. **图形渲染**:学习如何使用Cocos2d-x的绘图API,包括纹理、...

    cocos2d-html5-v2.2.3.zip

    3. **Cocos2d API**:这个版本提供了与Cocos2d-x相似的API,使得开发者可以从Cocos2d-x轻松过渡到Cocos2d-html5。这些API包括精灵(Sprite)、层(Layer)、场景(Scene)、动作(Actions)等,它们构成了游戏的基本...

    cocos2d的学习资料

    4. **物理引擎集成**:通过Box2D或Chipmunk物理引擎,cocos2d-x允许开发者创建具有真实物理行为的游戏对象,如碰撞检测和重力模拟。 5. **脚本支持**:除了使用C++,cocos2d-x还支持JavaScript(通过Cocos2d-JS)和...

    cocos2d-x源码素材

    在cocos2d-x中,我们可以利用物理引擎如Box2D或 Chipmunk进行复杂的碰撞检测,也可以使用简单的矩形碰撞检测函数如`cc.rectIntersectsRect()`来检查两个矩形是否相交。此外,cocos2d-x还支持自定义的碰撞检测算法,...

    cocos2d-x贼来了塔防

    Cocos2d-x是一个广泛使用的开源游戏开发框架,它使用C++语言,支持多平台发布,包括iOS、Android以及Windows等,具有高效、灵活和强大的特性。 塔防类游戏是一种策略游戏,玩家通过在地图上的特定位置建造防御设施...

    学习Iphone 和 Ipad cocos2d 游戏开发

    在iOS平台上进行游戏开发,Cocos2d是一个广泛使用的开源框架,特别适合创建2D游戏、演示和其他图形/交互式应用程序。本教程将带你深入学习如何利用Cocos2d为iPhone和iPad构建游戏。 首先,我们需要了解Cocos2d的...

    《Cocos2d-x实战 JS卷 Cocos2d-js开发》随书源码下

    12. **游戏保存与加载(Save & Load)**:了解如何使用Cocos2d-js的持久化存储,保存游戏进度和用户数据。 13. **性能优化(Performance Optimization)**:学习如何调试和优化JavaScript代码,提高游戏运行效率。 ...

    cocos2d-js物理引擎Demo

    cocos2d-js是一款强大的跨平台2D游戏开发框架,其中集成的物理引擎是基于Chipmunk库实现的,为开发者提供了丰富的物理模拟功能。本文将深入探讨cocos2d-js如何利用Chipmunk物理引擎制作出引人入胜的游戏Demo。 首先...

    Cocos2d-x 3.0 开发(九)使用Physicals代替Box2D和chipmunk的3.0 alpha1新版本

    Cocos2d-x 3.0 开发(九)使用Physicals代替Box2D和chipmunk的3.0 alpha1新版本 对应于Coco2d-x 3.0 alpha1 使用,更新之前3.0 alpha0 的 文件。相关博客地址:...

    cocos2d-x默认项目注释chipmunk模板注释

    在Cocos2d-x的默认项目中,你可能会看到对Chipmunk的一些注释,这些注释通常是为了帮助开发者理解如何配置和使用物理世界。例如,注释可能解释了如何初始化物理空间,设置重力,添加静态和动态物体,以及如何处理...

    Cocos2d-x for XNA 的dll文件

    3. **物理引擎集成**:Cocos2d-x通常与Box2D或Chipmunk物理引擎配合使用,为游戏添加真实的物理模拟。这些物理引擎的接口也被封装在DLL中,方便XNA开发者使用。 4. **音频支持**:Cocos2d-x提供跨平台的音频播放...

    cocos2d 资料收藏

    此外,物理引擎如Box2D或Chipmunk可与Cocos2d集成,实现物理模拟。 5. **事件处理与用户交互**: - Cocos2d提供了事件监听机制,使得游戏可以响应用户的触摸、键盘输入或其他设备事件。学习如何设置触摸和键盘监听...

Global site tag (gtag.js) - Google Analytics