COCOS2DX学习之Box2d物理引擎使用之------动态物体的创建
1、创建一个物理世界
首先要引入一个头文件#include "Box2D\Box2D.h"
之后利用b2word创建一个对象,而且指定这个物理世界中的加速度方向。
word = new b2World(b2Vec2(0,-10)); //指定物理世界的加速度
最后还要重写一下update函数。这个函数在之前的计时器学习的时候已经说过。每一帧的变动都将自己主动运行这个函数。所以我们要通过这个函数来进行创建的物理世界的刷新。
2、创建一个运动的物体
我们将自己实现一个在物理世界加入一个物体的函数,在当中调用createbody来创建一个物体,该函数接受一个參数。这个參数是关于创建的这个物体的一些基本信息,比方位置,动态还是静态等等。
b2BodyDef def;
def.position = b2Vec2(10,10);
def.type = b2_dynamicBody;
word->CreateBody(&def);
之后为了能够显示出创建的这个物体的运动情况,在update中,能够通过一个循环来便利整个物理世界的物体列表,找到我们定义的这个物体就能够输出他在物理世界中自由落体的坐标变化
void HelloWorld::update(float dt)
{
word->Step(dt, 8, 3);
for(b2Body *b = word->GetBodyList(); b; b = b->GetNext())
{
if(b->GetType() == b2_dynamicBody)
{
log("x:%f, y:%f", b->GetPosition().x, b->GetPosition().y);
}
}
}
最后要在init函数里面scheduleUpdate()用这个函数启动update
直接看坐标的变化可能不是非常明显。那么这次通过加入一个图形来看
首先,自然要先创建一个sprite。
然后将创建的那个物体和sprite绑定在一起。
b2Body *b = word->CreateBody(&def);
auto sprite = Sprite::create();
addChild(sprite);
sprite->setTextureRect(Rect(0,0,80,80));
b->SetUserData(sprite);
由于BOX2d 物理世界中,它的位置是用米来进行度量的,并非利用像素。BOX2D有一个比較精确的模拟范围就是10M。所以我们要依据像素和米的单位进行映射,找出相应的比例关系才可以确定所创建物体要指定的位置。
所以,在AppDelegate::applicationDidFinishLaunching()函数中我们将设置一下程序的分辨率glview->setDesignResolutionSize(800,600, ResolutionPolicy::SHOW_ALL);设置了一个800*600的分辨率,也就是说纵轴的800相应于物理世界中的10m,那么他们的比例就是80。
也就是说。上述的操作形成了这种一个效果,把整个屏幕变成了800*600的分辨率,在物理世界中,最高的纵坐标范围是10.依照比例缩小的坐标系的范围。
创建的物体在物理世界中的位置能够通过def.position = b2Vec2(3,5);来进行指定,def是这个物体类型信息的一个对象。
可是假设要连接一个图形的话,那么图形不是物理世界中,它是cocos2dx里面得东西,是游戏引擎的部分。所以,要通过刚才的比例设置sprite的位置。
s->setPosition(b->GetPosition().x * RATIO, b->GetPosition().y*RATIO);
s是一个sprite的指针。
上面的工作尽管将物理世界得物体和图形进行了绑定,可是,这仅仅是静态的东西。
所创建的物体在物理世界中是会由于重力的原因下落的。那么与其绑定的图形也就要随之调整位置,所以在Update函数里面要实时更新图形的位置。
void HelloWorld::update(float dt)
{
word->Step(dt, 8, 3);
Sprite *s;
for(b2Body *b = word->GetBodyList(); b; b = b->GetNext())
{
if(b->GetType() == b2_dynamicBody)
{
if(b->GetUserData())
{
s = (Sprite*)b->GetUserData();
s->setPosition(b->GetPosition().x * RATIO, b->GetPosition().y*RATIO);
}
}
}
}
所以在update函数里面就要检查body对象是否绑定了图形。然后获取到他所绑定的图形。进行又一次设置当前的图形坐标。
COCOS2DX学习之Box2d物理引擎使用之------动态物体的创建的更多相关文章
- [Cocos2D-x For WP8]Box2D物理引擎
物理引擎通过为刚性物体赋予真实的物理属性的方式来计算运动.旋转和碰撞反映.为每个游戏使用物理引擎并不是完全必要的—简单的“牛顿”物理(比如加速和减速)也可以在一定程度上通过编程或编写脚本来实现.然而, ...
- cocos2d-x中的Box2D物理引擎
在Cocos2d-x中集成了2个物理引擎,一个是Chipmunk,一个是Box2D.前者是用C语言编写的,文档和例子相对较少:Box2D是用C++写的,并且有比较完善的文档和资料.所以在需要使用物理引 ...
- 瘸腿蛤蟆笔记29-cocos2d-x-3.2 Box2d物理引擎dynamics模块介绍
转载标明出处:http://blog.csdn.net/notbaron/article/details/38611335 上篇回想 本篇名言:奋斗.寻觅.发现,而不屈服.[诗人丁尼生] 上篇中,我们 ...
- 【极客学院出品】Cocos2d-X系列课程之九-BOX2D物理引擎
Cocos2d-x 是时下最热门的手游引擎,在国内和国外手机游戏开发使用的份额各自是70%和25%,在App Store的top10中,有7个是用它开发的. 本节课程为Cocos2d-x系列课程之九, ...
- 实例介绍Cocos2d-x中Box2D物理引擎:使用关节
下面我们将使用Box2D物理引擎技术进行重构.使得关节能够掌握如何在Box2D使用关节约束.HelloWorldScene.cpp中与使用关节的相关代码如下: void HelloWorld::add ...
- 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检测
在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...
- 实例介绍Cocos2d-x中Box2D物理引擎:HelloBox2D
我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用Box2D物理引擎的开发过程,熟悉这些API的使用.这个实例运行后的场景如图所示,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触 ...
- 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检測
在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...
- libgdx学习记录18——Box2d物理引擎
libgdx封装了Box2D物理引擎,通过这个引擎能够模拟物理现实,使设计出的游戏更具有真实感. libgdx中,Box2d程序的大概过程: 1. 创建物理世界world,并设置重力加速度. 2. 创 ...
随机推荐
- QT+ 状态栏+核心控件+浮动窗口
#include "mainwindow.h" #include <QStatusBar> #include <QLabel> #include<QT ...
- 雷林鹏分享:Lua 数据类型
Lua是动态类型语言,变量不要类型定义,只需要为变量赋值. 值可以存储在变量中,作为参数传递或结果返回. Lua中有8个基本类型分别为:nil.boolean.number.string.userda ...
- Go:sync.Once 实现单例模式
代码: package main import ( "fmt" "sync" ) type Singleton struct{} var singleton * ...
- python读取excel学习(1)
#coding=gbk #coding=utf-8 import xlrd table = xlrd.open_workbook(r'E:\test.xlsx') #sheet = table.she ...
- git服务器端安装
一.服务器端安装 git支持四种传输协议 1.本地协议 2.ssh协议 3.git协议 4.http/s协议 [root@zabbix ~]# cat /etc/redhat-release Cent ...
- LeetCode (17)Letter Combinations of a Phone Number
题目 Given a digit string, return all possible letter combinations that the number could represent. A ...
- Android开发——Accessibility机制实现模拟点击(微信自动抢红包实现)
1. 何为Accessibility机制 许多Android使用者因为各种情况导致他们要以不同的方式与手机交互.对于那些由于视力.听力或其它身体原因导致不能方便使用Android智能手机的用户,And ...
- keepalived安装脚本
keepalived_install.sh: #cat keepalived_install.sh #!/bin/bash pkg=keepalived-2.0.10.tar.gz tar xf $p ...
- linux find的用法
①.一般格式: ·find path -option [ -print ] [ -exec -ok command ] {} \; 说明: #-print 将查找到的文 ...
- 大数据学习——flume拦截器
flume 拦截器(interceptor)1.flume拦截器介绍拦截器是简单的插件式组件,设置在source和channel之间.source接收到的事件event,在写入channel之前,拦截 ...