[cocos2d-x学习笔记][入门基础]Box-2d物理引擎的使用02制作一个简易的愤怒小鸟Demo
2014-09-17 20:21
906 查看
在地图层创建一个游戏中出现的树杈发射器如图
部分代码如下
2.创建世界,初始化世界,定义地板绑定夹具(详情请看01);
3.添加敌人小猪
添加小猪的动态刚体并且绑定图层
在场景中添加小猪
模拟世界的实现
4.添加愤怒的小鸟
点击屏幕在树杈中间出现一只小鸟。可以随着鼠标移动。
创建小鸟
效果图
5.将小鸟的图层与动态刚体绑定,并射出,撞到小猪
部分代码如下
//创建树杈 auto tree01=Sprite::create("leftshot.png"); this->addChild(tree01); tree01->setPosition(Vec2(200,200)); tree01->setScale(4); auto tree02=Sprite::create("rightshot.png"); tree02->setPosition(Vec2(200,200)); tree02->setScale(4); this->addChild(tree02);
2.创建世界,初始化世界,定义地板绑定夹具(详情请看01);
//创建地板 b2BodyDef groundDef; groundDef.position.Set(.0f, 50/32.0f); b2Body *groundbody=world->CreateBody(&groundDef); //创建夹具定义刚体形状 b2PolygonShape groundShop; groundShop.SetAsBox(visibleSize.width/32, 50/32); //刚体绑定夹具 groundbody->CreateFixture(&groundShop,0);
3.添加敌人小猪
添加小猪的动态刚体并且绑定图层
void HelloWorld::addPigAtPosition(Vec2 p) { //刚体 b2BodyDef bodyDef; bodyDef.type=b2_dynamicBody;//?? bodyDef.position.Set(p.x/32, p.y/32); b2Body *body=world->CreateBody(&bodyDef); b2PolygonShape dynamicBox; b2CircleShape d; d.m_radius=5;//?? dynamicBox.SetAsBox(50/32.0/2.0f, 50/32.0/2.0f); b2FixtureDef fixtureDef; fixtureDef.shape=&dynamicBox; fixtureDef.density=1.0f; fixtureDef.friction=3.0f; fixtureDef.restitution=0.5; body->CreateFixture(&fixtureDef); //绑定图层 auto sprite = Sprite::create("pig_2.png"); sprite->setTag(10+pigIndex); sprite->setScale(0.5); this->addChild(sprite); body->SetUserData(sprite);//将这个新的Body中绑定精灵Sprite sprite->setPosition( Vec2( p.x, p.y) ); pigIndex++; }
在场景中添加小猪
void HelloWorld::addObstacles() { pigIndex=0; this->addPigAtPosition(Vec2(700,0)); this->addPigAtPosition(Vec2(700,32)); this->addPigAtPosition(Vec2(700,64)); this->addPigAtPosition(Vec2(700,96)); this->addPigAtPosition(Vec2(700,128)); this->addPigAtPosition(Vec2(700,160)); // this->addPigAtPosition(Vec2(700,192)); // this->addPigAtPosition(Vec2(700,224)); // this->addPigAtPosition(Vec2(700,256)); // this->addPigAtPosition(Vec2(750,0)); this->addPigAtPosition(Vec2(750,32)); this->addPigAtPosition(Vec2(750,64)); this->addPigAtPosition(Vec2(750,96)); this->addPigAtPosition(Vec2(750,128)); this->addPigAtPosition(Vec2(750,160)); // this->addPigAtPosition(Vec2(750,192)); // this->addPigAtPosition(Vec2(750,224)); // this->addPigAtPosition(Vec2(750,256)); this->addPigAtPosition(Vec2(800,0)); this->addPigAtPosition(Vec2(800,32)); this->addPigAtPosition(Vec2(800,64)); this->addPigAtPosition(Vec2(800,96)); this->addPigAtPosition(Vec2(800,128)); this->addPigAtPosition(Vec2(800,160)); }
模拟世界的实现
this->scheduleUpdate(); void HelloWorld::update(float t){ world->Step(t, 8, 3);//模拟物理世界 //获取所有刚体的信息 for (b2Body* b=world->GetBodyList(); b; b=b->GetNext()) { if (b->GetUserData()) {//如果当前的body绑定了精灵 Sprite * sp=(Sprite *)b->GetUserData(); sp->setPosition(b->GetPosition().x*32, b->GetPosition().y*32); sp->setRotation(-CC_RADIANS_TO_DEGREES(b->GetAngle())); } } }效果图:
4.添加愤怒的小鸟
点击屏幕在树杈中间出现一只小鸟。可以随着鼠标移动。
创建小鸟
void HelloWorld::addNewSpriteAtPoint(Vec2 p){ auto sprite = Sprite::create("bird1.png"); sprite->setTag(110+birdIndex); sprite->setPosition(Vec2(200,200)); this->addChild(sprite); sprite->setPosition( Vec2( p.x, p.y) ); }屏幕交互
//屏幕交互 auto listener=EventListenerTouchOneByOne::create(); listener->onTouchBegan=[&](Touch *t,Event *e){ //birdBody addNewSpriteAtPoint(Vec2(200,200)); this->getChildByTag(110+birdIndex)->setPosition(200,200); startx=t->getLocation().x; starty=t->getLocation().y; m_isFlying=false; return true; }; listener->onTouchMoved=[&](Touch *t,Event *e){ // addNewSpriteAtPoint(t->getLocation()); this->getChildByTag(110+birdIndex)->setPosition(200+t->getLocation().x-startx, 200+t->getLocation().y-starty); }; listener->onTouchEnded=[&](Touch *t,Event *e){ this->shootBirdAtPosition(t->getLocation()); birdIndex++; m_isFlying=true; }; Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this); //添加小鸟
效果图
5.将小鸟的图层与动态刚体绑定,并射出,撞到小猪
void HelloWorld::shootBirdAtPosition(Vec2 p) { //Set up a 1m squared box in the physics world b2BodyDef bodyDef; bodyDef.type = b2_dynamicBody;//动态刚体 bodyDef.position.Set(p.x/32, p.y/32); b2Body *body = world->CreateBody(&bodyDef); this->birdBody=body; // Define another box shape for our dynamic body. b2PolygonShape dynamicBox; dynamicBox.SetAsBox(50/32.0/2.0f, 50/32.0/2.0f);//These are mid points for our 1m box // Define the dynamic body fixture. b2FixtureDef fixtureDef; fixtureDef.shape = &dynamicBox; fixtureDef.density = 1.0f; fixtureDef.friction = 0.3f; fixtureDef.restitution=0.5; body->CreateFixture(&fixtureDef); body->SetUserData(this->getChildByTag(110+birdIndex));//将这个新的Body中绑定精灵Sprite b2Vec2 force = b2Vec2((200-p.x)/3, (200-p.y)/3); birdBody->ApplyLinearImpulse(force, birdBody->GetPosition(),true); }
相关文章推荐
- [cocos2d-x学习笔记][入门基础]Box-2d物理引擎的使用01
- 【AwayPhysics学习笔记】:Away3D物理引擎的简介与使用
- Unity 物理引擎学习笔记。。很基础。很实用哦。。。
- 【零基础入门学习Python笔记012】一个打了激素的数组3
- 使用BIOS进行键盘输入和磁盘读写02 - 零基础入门学习汇编语言76
- 【零基础入门学习Python笔记011】一个打了激素的数组2
- 学习 "使用cocos2d-x3.0和物理引擎实现碰撞检测" 中出现的一个问题
- [Kotlin&Anko开发Android入门学习笔记]-02Kotlin如何使用Android第三方库
- Webpack学习笔记——基础使用入门
- 如何使用cocos2d-x3.0和物理引擎来制作一个Breakout游戏:第一部分
- Web基础入门(表格)-使用表格嵌套的形式制作一个简单的网页布局
- 使用BIOS进行键盘输入和磁盘读写02 - 零基础入门学习汇编语言76
- Unity学习笔记3 简易2D横版RPG游戏制作(三)
- Cocos2d-x 3.x学习笔记:猩先生带你打飞机(三)物理引擎的使用
- struts2学习笔记--使用servletAPI实现ajax的一个小Demo
- 物理引擎Chipmunk2d学习笔记
- JDBC 学习笔记(十)—— 使用 JDBC 搭建一个简易的 ORM 框架
- 深入理解机器学习:从原理到算法 学习笔记-第1周 02简易入门
- SpringMVC学习笔记---- 一、SpringMVC基础入门,创建一个HelloWorld程序
- 【零基础入门学习Python笔记010】一个打了激素的数组1