2.Cocos2dx 3.2中的重力系统Box2D
1 添加Box2D相关的库
步骤1:右击项目所在的解决方案à添加—>现有项目àE:\Installed\cocos2d-x-3.2\cocos2d-x-3.2\external\Box2D\proj.win32\Box2D.vcxproj
步骤2:右击项目à生成依赖项à项目依赖项à将关于libBox2D的复选框选中
步骤3:为项目添加libBox2D的库
方法:右击项目à属性à链接器à输入—>附加依赖项à编辑,添加上libBox2d.lib,à确定
案例说明:
1.编写T32.h |
#ifndef __T32_H__ #define __T32_H__ #include "cocos2d.h" USING_NS_CC; #define winSize Director::getInstance()->getWinSize() #define CCLog cocos2d::log #endif |
2.编写TBack.h |
#ifndef __TBack_H__ #define __TBack_H__ #include "T32.h" class TBack : public Layer { public: CREATE_FUNC(TBack); bool init(); }; #endif |
3编写TBack.cpp |
#include "TBack.h" bool TBack::init() { Layer::init(); setLocalZOrder(100); Menu* menu = Menu::create(); MenuItemImage* item = MenuItemImage::create("CloseNormal.png", "CloseSelected.png", [](Ref*){ Director::getInstance()->popScene(); }); menu->addChild(item); item->setPosition(winSize.width / 2 - item->getBoundingBox().size.width / 2, item->getBoundingBox().size.height / 2 - winSize.height / 2); addChild(menu); return true; } |
4.编写T06Box2D.h |
#ifndef __T06Box2D_H__ #define __T06Box2D_H__ #include "T32.h" #include "Box2D/Box2D.h" class T06Box2D : public Layer { public: CREATE_FUNC(T06Box2D); bool init(); b2World* _world; b2Body* _bat; void update(float); }; #endif |
5编写:T06Box2D.cpp |
#include "T06Box2D.h" #define PTM_RATIO 32.0f bool T06Box2D::init() { Layer::init(); //创建世界,后面的-9.8表示向下的重力加速度为9.8 //b2Vec2 gravity(0,-9.8f); //这个表示没有重力加速度 b2Vec2 gravity(0,0.0f); _world = new b2World(gravity); { b2BodyDef def; //这里是一个动态的body,默认是静态的body def.type = b2_dynamicBody; //设置位置,要转换成重力场中的位置要除以PTM_RATIO def.position.Set(winSize.width / 2 / PTM_RATIO, winSize.height / 2 / PTM_RATIO); b2Body* body = _world->CreateBody(&def); //让body受力 body->SetLinearVelocity(b2Vec2(10,20)); //显示body的精灵 Sprite* sprite = Sprite::create("CloseNormal.png"); addChild(sprite); sprite->setPosition(body->GetPosition().x*PTM_RATIO, body->GetPosition().y*PTM_RATIO); //设置body的形状,让它和sprite相一致,是圆形的 b2CircleShape shape; //设置半径 shape.m_radius = sprite->getContentSize().width / 2 / PTM_RATIO; //后面的一个参数表示的是密度系数 b2Fixture* fixture = body->CreateFixture(&shape, 1.0f); //设置摩擦系统 fixture->SetFriction(0.0f); //弹性系数 fixture->SetRestitution(1.0f); //关联body和精灵 body->SetUserData(sprite); } //加个地板 { b2BodyDef def; // def.position.Set(0, 0); b2Body* body = _world->CreateBody(&def); //设置边界类型的形状 b2EdgeShape shape; //设置地板的开始点和结束点 shape.Set(b2Vec2(0, 0), b2Vec2(winSize.width / PTM_RATIO, 0)); b2Fixture* fixture = body->CreateFixture(&shape, 1.0f); //设置摩擦系数 fixture->SetFriction(0.0f); //设置弹性系数 fixture->SetRestitution(1.0f); } //加个天花板 { b2BodyDef def; def.position.Set(0, winSize.height / PTM_RATIO); b2Body* body = _world->CreateBody(&def); b2EdgeShape shape; shape.Set(b2Vec2(0, 0), b2Vec2(winSize.width / PTM_RATIO, 0)); b2Fixture* fixture = body->CreateFixture(&shape, 1.0f); //摩擦系统 fixture->SetFriction(0.0f); //弹性系数 fixture->SetRestitution(1.0f); } //左挡板 { b2BodyDef def; //def.position.Set(0, winSize.height / PTM_RATIO); b2Body* body = _world->CreateBody(&def); b2EdgeShape shape; shape.Set(b2Vec2(0, 0), b2Vec2(0, winSize.height / PTM_RATIO)); b2Fixture* fixture = body->CreateFixture(&shape, 1.0f); fixture->SetFriction(0.0f); //摩擦系统 fixture->SetRestitution(1.0f); //弹性系数 } //右挡板 { b2BodyDef def; def.position.Set(winSize.width / PTM_RATIO, 0); b2Body* body = _world->CreateBody(&def); b2EdgeShape shape; shape.Set(b2Vec2(0, 0), b2Vec2(0, winSize.height / PTM_RATIO)); b2Fixture* fixture = body->CreateFixture(&shape, 1.0f); //摩擦系数 fixture->SetFriction(0.0f); //弹性系数 fixture->SetRestitution(1.0f); } //球拍 { b2BodyDef def; def.position.Set(winSize.width / 2 / PTM_RATIO, winSize.height / 4 / PTM_RATIO); b2Body* body = _world->CreateBody(&def); _bat = body; Sprite* sprite = Sprite::create("bat.png"); body->SetUserData(sprite); addChild(sprite); sprite->setPosition(body->GetPosition().x*PTM_RATIO, body->GetPosition().y*PTM_RATIO); Size batSize = Size(100,30); Size content = sprite->getContentSize(); sprite->setScale(batSize.width / content.width, batSize.height / content.height); b2PolygonShape shape; shape.SetAsBox(batSize.width / 2 / PTM_RATIO, batSize.height / 2 / PTM_RATIO); b2Fixture* fixture = body->CreateFixture(&shape, 1.0f); //摩擦系统 fixture->SetFriction(0.0f); //弹性系统 fixture->SetRestitution(1.0f); //touch EventListenerTouchOneByOne* ev = EventListenerTouchOneByOne::create(); ev->onTouchBegan = [](Touch*, Event*){return true; }; ev->onTouchMoved = [&](Touch* touch, Event*){ float dx = touch->getDelta().x / PTM_RATIO; b2Vec2 pos = _bat->GetPosition(); pos.x += dx; //下面的函数等价于setPosition() _bat->SetTransform(pos, 0); }; _eventDispatcher->addEventListenerWithSceneGraphPriority(ev, this); } scheduleUpdate(); return true; } void T06Box2D::update(float dt) { //时间在流逝 _world->Step(dt, 8, 1); //遍历这个世界的body b2Body* body = _world->GetBodyList(); while (body) { //设置body相关的精灵的位置 Sprite* sprite = (Sprite*)body->GetUserData(); if (sprite) { sprite->setPosition(body->GetPosition().x*PTM_RATIO, body->GetPosition().y*PTM_RATIO); sprite->setRotation(body->GetAngle()*180.0 / M_PI); } body = body->GetNext(); } } |
6.编写TMenu.h |
#ifndef __TMenu_H__ #define __TMenu_H__ #include "T32.h" class TMenu : public Layer { public: CREATE_FUNC(TMenu); bool init(); bool TouchBegan(Touch*, Event*); }; #endif |
7. 编写:TMenu.cpp |
#include "TMenu.h" #include "TBack.h" #include "T01CPP11.h" #include "T02Vector.h" #include "T03Map.h" #include "T04Label.h" #include "T06Box2D.h" static const char* title[] = { "T01CPP11", "T02Vector", "T03Map", "T04Label", "T06Box2D" }; bool TMenu::init() { Layer::init(); Menu* menu = Menu::create(); addChild(menu); for (int i = 0; i < sizeof(title) / sizeof(*title); ++i) { MenuItemFont* item = MenuItemFont::create(title[i], [](Ref* sender){ MenuItem* item = (MenuItem*)sender; int i = item->getTag()-1000; Layer* l = NULL; if (title[i] == "T01CPP11") l = T01CPP11::create(); if (title[i] == "T02Vector") l = T02Vector::create(); if (title[i] == "T03Map") l = T03Map::create(); if (title[i] == "T04Label") l = T04Label::create(); if (title[i] == "T06Box2D") l = T06Box2D::create(); if (l) { TBack* b = TBack::create(); Scene* s = Scene::create(); s->addChild(b); s->addChild(l); Director::getInstance()->pushScene(s); } }); menu->addChild(item); item->setTag(1000 + i); } menu->alignItemsVertically(); // 触摸 auto ev = EventListenerTouchOneByOne::create(); #if 0 ev->onTouchBegan = [](Touch*, Event*){ return true; }; #endif //ev->onTouchBegan = std::bind(&TMenu::TouchBegan, this, std::placeholders::_1, std::placeholders::_2); ev->onTouchBegan = CC_CALLBACK_2(TMenu::TouchBegan, this); ev->onTouchMoved = [&](Touch* touch, Event*){ setPositionY(getPositionY() + touch->getDelta().y); }; _eventDispatcher->addEventListenerWithSceneGraphPriority(ev, this); return true; } bool TMenu::TouchBegan(/*TMEnu* this, */Touch*, Event*) { return true; } |
8.编写AppDelegate.cpp |
#include "AppDelegate.h" #include "TMenu.h" #include "TBack.h" USING_NS_CC; AppDelegate::AppDelegate() { } AppDelegate::~AppDelegate() { } bool AppDelegate::applicationDidFinishLaunching() { // initialize director auto director = Director::getInstance(); auto glview = director->getOpenGLView(); if(!glview) { glview = GLView::create("My Game"); glview->setFrameSize(480, 320); director->setOpenGLView(glview); } glview->setDesignResolutionSize(480, 320, ResolutionPolicy::EXACT_FIT); // turn on display FPS director->setDisplayStats(true); // set FPS. the default value is 1.0/60 if you don't call this director->setAnimationInterval(1.0 / 60); // create a scene. it's an autorelease object auto scene = Scene::create(); scene->addChild(TMenu::create()); scene->addChild(TBack::create()); // run director->runWithScene(scene); return true; } // This function will be called when the app is inactive. When comes a phone call,it's be invoked too void AppDelegate::applicationDidEnterBackground() { Director::getInstance()->stopAnimation(); // if you use SimpleAudioEngine, it must be pause // SimpleAudioEngine::getInstance()->pauseBackgroundMusic(); } // this function will be called when the app is active again void AppDelegate::applicationWillEnterForeground() { Director::getInstance()->startAnimation(); // if you use SimpleAudioEngine, it must resume here // SimpleAudioEngine::getInstance()->resumeBackgroundMusic(); } |
运行效果: |
2.Cocos2dx 3.2中的重力系统Box2D相关推荐
- 【Visual C++】游戏开发笔记二十 游戏基础物理建模(二) 重力系统的模拟
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7496200 作者:毛星云 邮箱: h ...
- 【Android游戏开发二十】物理游戏之重力系统开发,让你的游戏变得有质有量!...
本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/354.html 今 ...
- Unity中的布料系统
0. 前言 项目技术测试结束之后,各种美术效果提升的需求逐渐成为后续开发的重点,角色效果部分的提升目标之一便是在角色选择/展示界面为玩家提供更高的品质感,于是可以提供动态效果的布料系统就作为了技术预研 ...
- 【Android游戏开发二十】物理游戏之重力系统开发,让你的游戏变得有质有量!
本站文章均为 李华明Himi 原创,转载务必在明显处注明:(作者新浪微博: @李华明Himi ) 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/andr ...
- 深入分析Cocos2d-x 2.0中的“纹理”
[Cocos2d-x相关教程来源于红孩儿的游戏编程之路CSDN博客地址:http://blog.csdn.net/honghaier] 红孩儿Cocos2d-X学习园地QQ群:249941957 加群 ...
- 用实例说明在cocos2d-x 3.x中使用SQLite
为什么这一行的代码行删不掉???还有为什么下面插入的图片这么大?怎么改小???搞不定了,随性写几个字在这儿,吐槽一下吧!吐槽中............. 一.说明 我将用实例与扩充解释的方式具体说明如 ...
- 【功能开发篇】游戏中的时间系统修改Unity自带组件运行速度
"功能开发篇"系列文章记录了我在平时工作中遇到的问题以及一些和游戏功能相关的项目经验. 目录 1. 插件介绍 2. 核心类功能拆解 3. Timeline深入 修改Rigidbod ...
- JAVA中获取当前系统时间
JAVA中获取当前系统时间 转自:http://www.cnblogs.com/Matrix54/archive/2012/05/01/2478158.html 一. 获取当前系统时间和日期并格式化输 ...
- 通过 RDTSC 指令从 CPU 寄存器中直接获取系统时钟
很多时候我们使用函数 gettimeofday 以及 clock_gettime 作为我们获取 wall lock的时钟函数. 因为这两种函数是 glibc 提供的用户封装,简单易用,而且能够精确到 ...
最新文章
- 代码审计之代码执行注入
- mysql 分区表优化_Sql优化之Mysql表分区
- pycharm+itk+vtk安装及测试程序运行
- springboot-web开发
- 在VS中编译C++静态库以及使用的方法
- mysql 二进制日志大小_mysql二进制日志。
- C++_程序内存模型_new运算符---C++语言工作笔记030
- AlphaGo围棋 论文笔记
- 163 镜像源 linux,网易163的Ubuntu apt镜像源
- win7 计算机 工具,win7小工具
- JavaScript 上传文件并展示
- python画球面_matplotlib中的球面坐标图
- block locality
- 无线电波是怎么产生的
- WPF实战之DataGrid设置行高
- 路由器重温——ISIS路由-2
- 罐子与硬币--【英雄会】
- 视觉数据集是基于物体和风景标记的巨大的图像库
- XML:Schema、三种编写Schema的方式
- Android-图片预览(自定义ImageView实现图片缩放,多点触控,自由移动)
热门文章
- boost::packaged_task相关的测试程序
- boost::spirit模块实现逗号分隔的数字列表的解析器的测试程序
- boost::iostreams::example::container_sink用法的测试程序
- boost::hana::minimum用法的测试程序
- boost::local_time模块实现航班飞行时间的测试程序
- GDCM:gdcm::StreamImageWriter的测试程序
- GDCM:gdcm::TransferSyntax的测试程序
- boost::container模块实现范围分配器用法
- boost::callable_traits添加member右值引用的测试程序
- Boost:can_require的使用测试程序