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

【麦可网】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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
程 序 文 件 文件编号:MQL—QP-2019 文件版本:第2版 受控状态: 受 控 号: 持 有 人: 陕西麦可罗生物科技有限公司实验室发布 2019年12月01日 批准令 根据第1版《质量手册》的要求,为确保管理体系各质量管理和技术运作过程质量,质 量主管组织管理人员和技术人员编制了本《程序文件》。 本《程序文件》中各程序文件规定了管理体系各项重要质量活动和技术活动的工作程序 要求,是《质量手册》的支持性文件,全体员工须严格按照其中各个程序的要求开展工作 。经审批,于2019年12月01日发布实施。 全体人员要认真学习本文件,及时领会、掌握文件的核心要求,真正落实到自己的实 际工作中,实现本实验室工作质量、管理水平的不断提高。 编制: 日期: 批准: 日期: 修订页 "序号 "修改章节 "修改内容摘要 "修改日期"修改人 "批准人 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 目录 批准令 2 修订页 3 目录 4 MQL—QP—40101:2019《保证公正性与诚信度程序》 6 MQL—QP—40102:2019《保密工作程序》 8 MQL—QP—60201:2019《检测人员监督程序》 10 MQL—QP—60202:2019《人员培训管理程序》 14 MQL—QP—60301:2019《设施和环境条件控制程序》 19 MQL—QP—60302:2019《安全作业管理程序》 22 MQL—QP—60303:2019《环境保护程序》 25 MQL—QP—60401:2019《设备管理程序》 27 MQL—QP—60402:2019《期间核查程序》 32 MQL—QP—60403:2019《标准物质管理程序》 34 MQL—QP—60404:2019《标准溶液管理程序》 37 MQL—QP—60501:2019《量值溯源程序》 40 MQL—QP—60601:2019《服务和供应品采购程序》 44 MQL—QP—71001:2019《合同评审程序》 48 MQL—QP—70701:2019《检测工作控制程序》 51 MQL—QP—70202:2019《检测方法的验证程序》 54 MQL—QP—70203:2019《检测方法的开发与确认程序》 56 MQL—QP—70702:2019《方法偏离控制程序》 59 MQL—QP—70301:2019《抽样管理程序》 61 MQL—QP—70401:2019《样品管理程序》 64 MQL—QP—70501:2019《数据保护程序》 67 MQL—QP—70601:2019《测量不确定度评定程序》 70 MQL—QP—70701:2019《检测结果有效性控制程序》 73 MQL—QP—70702:2019《能力验证程序》 77 MQL—QP—70801:2019《检测报告管理程序》 79 MQL—QP—70901:2019《投诉处理程序》 84 MQL—QP—71001:2019《不符合工作控制程序》 86 MQL—QP—71101:2019《数据控制和信息管理程序》 88 MQL—QP—80301:2019《文件控制程序》 89 MQL—QP—80401:2019《记录控制程序》 94 MQL—QP—80501:2019《风险和机遇应对程序》 98 MQL—QP—80701:2019《纠正措施控制程序》 99 MQL—QP—80801:2019《内部审核程序》 101 MQL—QP—80901:2019《管理评审程序》 105 "陕西麦可罗生物科技有限公司实验室 "文件编号:MQL—QP—40101:2019 " "程序文件 " " " "文件版本:第2版 第0次修订 " "标题:保证公正性与诚信度程序 "发布实施:2019年12月01日 " " "页码范围:第1页,共2页 " MQL—QP—40101:2019《保证公正性与诚信度程序》 1 目的 为保证检测工作的公正性,避免卷入任何可能降低技术能力、公正性、判断力或工作 诚实性的可信程度的活动,特编制本程序。 2 范围 检测工作流程的各个环节中客观公正性和诚信度的保持工作。 3 职责 3.1实验室主任:制定公正性措施,审批违反公正性事件的处理意见

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值