【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第二十七课:Cocos2D-X物理引擎之chipmunk

原创 2015年07月07日 23:00:21

【麦可网】Cocos2d-X跨平台游戏开发---学习笔记

第二十六课:Cocos2D-X物理引擎之Box2D11-12

=======================================================================================================================================================================

课程目标:

 - 学习chipmunk

课程重点:

 - chipmuk概念

 - chipmukBOX2D

 - chipmunk常用操作

考核目标:

 - 能够使用chipmuk常用操作,完成游戏需求

=======================================================================================================================================================================

一、chipmukBOX2D对比

语音方面:

chipmunkC语言写的

BOX2DC++写的

功能上:

BOX2D更丰富

删除对象的方式:

chipmunk:调用函数cpSpaceAddPostStepCallback

BOX2D:设置标记


二、实例

HelloChipmunk.h
--------------------------------------------
#pragma once
#include "cocos2d.h"
#include "cocos-ext.h"
#include "chipmunk.h"
using namespace cocos2d::extension;
using namespace cocos2d;

class HelloChipmunk : public cocos2d::CCLayer
{
public:
	HelloChipmunk();
	~HelloChipmunk();
	// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
	virtual bool init();  

	// there's no 'id' in cpp, so we recommend returning the class instance pointer
	static cocos2d::CCScene* scene();

	// a selector callback
	void menuCallback(CCObject* pSender);

	// implement the "static node()" method manually
	CREATE_FUNC(HelloChipmunk);
	void onEnter();
	void initPhysics();

	void addNewSpriteAtPosition(CCPoint p);
	void update(float dt);
	virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);

private:
	CCTexture2D* m_pSpriteTexture;		//精灵贴图
	CCPhysicsDebugNode* m_pDebugLayer;	//物理引擎DEBUG
	cpSpace* m_pSpace;					//物理空间
	cpShape* m_pWalls[4];				//形状数组(四边)
};


HelloChipmunk.cpp
--------------------------------
#include "HelloChipmunk.h"
USING_NS_CC;

enum{
	kTagParentNode = 1,
};
enum{
	Z_PHYSICS_DEBUG = 100,
};

CCScene* HelloChipmunk::scene()
{
	// 'scene' is an autorelease object
	CCScene *scene = CCScene::create();

	// 'layer' is an autorelease object
	HelloChipmunk *layer = HelloChipmunk::create();

	// add layer as a child to scene
	scene->addChild(layer);

	// return the scene
	return scene;
}

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

HelloChipmunk::HelloChipmunk()
{

}

HelloChipmunk::~HelloChipmunk()
{
	for (int i=0; i<4; i++)
	{
		cpShapeFree(m_pWalls[i]);
	}

	cpSpaceFree( m_pSpace );
}

bool HelloChipmunk::init()
{
	//////////////////////////////
	// 1. super init first
	if ( !CCLayer::init() )
	{
		return false;
	}

	//使能触摸
	setTouchEnabled(true);
	setAccelerometerEnabled(true);

	//初始化物理引擎
	initPhysics();

	CCSpriteBatchNode* parent = CCSpriteBatchNode::create("blocks.png");
	m_pSpriteTexture = parent->getTexture();

	addChild(parent, 0, kTagParentNode);

//添加新精灵
	addNewSpriteAtPosition(ccp(200, 200));
	//更新
scheduleUpdate();

	return true;
}


void HelloChipmunk::menuCallback(CCObject* pSender)
{

}

static void postStepRemove(cpSpace* space, cpShape *shape, void* unused)
{
	int* spriteType = (int*)shape->data;
	if (*spriteType == 1)
	{
		//delete
	}

}

static int begin(cpArbiter* arb, cpSpace* space, void* unused)
{
	cpShape* a;
	cpShape* b;
	cpArbiterGetShapes(arb, &a, &b);
	cpSpaceAddPostStepCallback(space, (cpPostStepFunc)postStepRemove, a, NULL);
	return 1;	//return 0,不发生碰撞
}

void HelloChipmunk::initPhysics()
{
	cpInitChipmunk();

	m_pSpace = cpSpaceNew();

	m_pSpace->gravity = cpv(0, -100);

	m_pWalls[0] = cpSegmentShapeNew( m_pSpace->staticBody,//静态对象
		cpv(0, 0),
		cpv(480, 0),
		0.0f);
	m_pWalls[1] = cpSegmentShapeNew( m_pSpace->staticBody,//静态对象
		cpv(0, 320),
		cpv(480, 320),
		0.0f);
	m_pWalls[2] = cpSegmentShapeNew( m_pSpace->staticBody,//静态对象
		cpv(0, 320),
		cpv(0, 0),
		0.0f);
	m_pWalls[3] = cpSegmentShapeNew( m_pSpace->staticBody,//静态对象
		cpv(480, 320),
		cpv(480, 0),
		0.0f);

	for (int i=0; i<4; i++)
	{
		m_pWalls[i]->e = 1.0f;		//摩擦系数等属性
		m_pWalls[i]->u = 1.0f;
		cpSpaceAddStaticShape(m_pSpace, m_pWalls[i]);
	}

	//创建debuglayer
	m_pDebugLayer = CCPhysicsDebugNode::create(m_pSpace);
	this->addChild(m_pDebugLayer, Z_PHYSICS_DEBUG);

	//碰撞检测参数2和3指定碰撞类型
	cpSpaceAddCollisionHandler(m_pSpace, 1, 1, begin, NULL, NULL, NULL, NULL);
}

void HelloChipmunk::update(float delta)
{
	//不使用传进来的参数,因为传进来的参数会根据运行时间而变动
	//采用固定每帧计算2次
	int steps = 2;
	float dt = CCDirector::sharedDirector()->getAnimationInterval()/(float)steps;
	
	for (int i=0; i<steps; i++)
	{
		cpSpaceStep(m_pSpace, dt);
	}
	

}

void HelloChipmunk::addNewSpriteAtPosition(CCPoint p)
{
	int posx, posy;
	
	CCNode* parent = getChildByTag(kTagParentNode);
	posx = CCRANDOM_0_1() * 64.0f;
	posy = CCRANDOM_0_1() * 64.0f;

	posx = (posx % 2) * 32;
	posy = (posy % 2) * 32;

	int num = 4;
	cpVect verts[] = {
		cpv(-16,-16),
		cpv(-16, 16),
		cpv( 16, 16),
		cpv( 16,-16),
	};

	//创建刚体
	cpBody *body = cpBodyNew(1.0f, cpMomentForPoly(1.0f, num, verts, cpvzero));

	body->p = cpv(p.x, p.y);
	cpSpaceAddBody(m_pSpace, body);

	//创建形状
	cpShape* shape = cpPolyShapeNew(body, num, verts, cpvzero);
	shape->e =0.5f; shape->u = 0.5f;

	int* tmp = new int;
	*tmp = 1;
	shape->data = tmp;
	shape->collision_type = 1;
	cpSpaceAddShape(m_pSpace, shape);

	CCPhysicsSprite* sprite = CCPhysicsSprite::createWithTexture(m_pSpriteTexture, CCRectMake(posx, posy, 32, 32));
	parent->addChild(sprite);

	sprite->setCPBody(body);
	sprite->setPosition(p);
}

void HelloChipmunk::onEnter()
{
	CCLayer::onEnter();
}

void HelloChipmunk::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
{
	CCSetIterator it;
	CCTouch* touch;

	for (it=pTouches->begin(); it!=pTouches->end	(); it++)
	{
		touch = (CCTouch*)(*it);
		if (!touch)
		{
			break;
		}
		
		CCPoint location = touch->getLocation();
		addNewSpriteAtPosition( location );
	}
	
}


===================================================================

总结:

总算把初级教程学习完了,接下来做个简单的游戏。

 

开心一刻:

毕业后七年,总算接了个大工程,造一根三十米烟囱,工期两个月,造价三十万,不过要垫资。总算在去年年底搞完了。今天人家去验收,被人骂得要死,还没有钱拿!图纸看反了,人家是要挖一口井!

 

 

【麦可网】Cocos2d-X跨平台游戏开发---教程下载:http://pan.baidu.com/s/1kTio1Av

【麦可网】Cocos2d-X跨平台游戏开发---笔记系列:http://blog.csdn.net/qiulanzhu



【备忘】麦可网-Cocos2D-X跨平台游戏开发 完整4G下载

教程目录 1、Cocos2d-X引擎概要01 - Lesson1_游戏原理与机制  02 - Lesson2_游戏开发技术  03 - Lesson3_认识Cocos2D-X引擎  04 - ...
  • luanluanxiyang
  • luanluanxiyang
  • 2017年01月09日 17:41
  • 221

麦可网-Cocos2D-X跨平台游戏开发

├─1、Cocos2d-X引擎概要 │ –不列出【网盘里面有】 ├─2、Cocos2d-X跨平台游戏开发基础 –不列出【网盘里面有】 │ ├─3、Cocos2d-X跨平台...
  • yangan2002
  • yangan2002
  • 2017年03月25日 12:39
  • 97

物理引擎比较:Box2D 对比 Chipmunk

Cocos2d 自带了两套物理引擎:Box2D 和 Chipmunk。那么我们应该选择哪一个呢? 很多情况下,这个选择取决于个人口味。很多游戏开发者对这两个物理引擎的 争论集中于它们所用的编程语言:...
  • benbenxiongyuan
  • benbenxiongyuan
  • 2014年08月29日 22:03
  • 3248

Cocos2d-js中Chipmunk引擎

我们先介绍轻量级的物理引擎——Chipmunk。Chipmunk物理引擎,由Howling Moon Software的Scott Lebcke开发,用纯C编写。Chipmunk的下载地址是http:...
  • tonny_guan
  • tonny_guan
  • 2015年04月10日 11:07
  • 12505

【麦可网】Cocos2d-X跨平台游戏开发---下载地址

【麦可网】Cocos2d-X跨平台游戏开发---下载地址  一直想在自己的博客上写点东西,可总是找不到写什么。趁学习Cocos2D-X之际,把自己学习的笔记整理出来,以博客的形式展现给大家。一来...
  • QIULANZHU
  • QIULANZHU
  • 2014年12月23日 14:45
  • 656

实例介绍Cocos2d-x物理引擎:HelloPhysicsWorld

我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用物理引擎的开发过程,熟悉这些API的使用。这个实例的运行后的场景,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触摸点生成一个新的...
  • tonny_guan
  • tonny_guan
  • 2014年09月22日 21:41
  • 5544

【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第四课:Cocos2D-X跨平台开发环境搭建(win32)

【麦可网】Cocos2d-X跨平台游戏开发---学习笔记 第四课:Cocos2D-X跨平台开发环境搭建(win32) ====================================...
  • QIULANZHU
  • QIULANZHU
  • 2015年06月15日 22:33
  • 443

【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第三课:认识Cocos2D-X引擎

【麦可网】Cocos2d-X跨平台游戏开发---学习笔记 第三课:认识Cocos2D-X引擎 =================================================...
  • QIULANZHU
  • QIULANZHU
  • 2015年06月15日 21:34
  • 569

【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第十三课:Cocos2D-X内存管理4-6

【麦可网】Cocos2d-X跨平台游戏开发---学习笔记 第十二课:Cocos2D-X内存管理4-6 =====================================...
  • QIULANZHU
  • QIULANZHU
  • 2015年06月21日 11:47
  • 578

【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第九课: Cocos2D-X引擎框架4

【麦可网】Cocos2d-X跨平台游戏开发---学习笔记 第九课: Cocos2D-X引擎框架4 =============================...
  • QIULANZHU
  • QIULANZHU
  • 2015年06月20日 16:22
  • 607
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第二十七课:Cocos2D-X物理引擎之chipmunk
举报原因:
原因补充:

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