Cocos2d-x之物理世界(创建运动的物体)

在AppDelegate。cpp中配置glview的属性

//配置glview的属性,屏幕的最高处是600,最右边是800

glview->setDesignResolutionSize(800, 600, ResolutionPolicy::SHOW_ALL);

AppDelegate。cpp中的内容如下

#include "AppDelegate.h"

#include "HelloWorldScene.h"

USING_NS_CC;

AppDelegate::AppDelegate() {

}

AppDelegate::~AppDelegate()

{

}

//if you want a different context,just modify the value of glContextAttrs

//it will takes effect on all platforms

void AppDelegate::initGLContextAttrs()

{

//set OpenGL context attributions,now can only set six attributions:

//red,green,blue,alpha,depth,stencil

GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8};

GLView::setGLContextAttrs(glContextAttrs);

}

bool AppDelegate::applicationDidFinishLaunching() {

// initialize director

auto director = Director::getInstance();

auto glview = director->getOpenGLView();

if(!glview) {

glview = GLViewImpl::createWithRect("Box2dLesson", Rect(0, 0, 960, 640));

director->setOpenGLView(glview);

//配置glview的属性,屏幕的最高处是600,最右边是800

glview->setDesignResolutionSize(800, 600, ResolutionPolicy::SHOW_ALL);

}

director->getOpenGLView()->setDesignResolutionSize(960, 640, ResolutionPolicy::SHOW_ALL);

// 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);

FileUtils::getInstance()->addSearchPath("res");

// create a scene. it‘s an autorelease object

auto scene = HelloWorld::createScene();

// 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();

}

HelloWorld。h中的内容如下

#ifndef __HELLOWORLD_SCENE_H__

#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

#include <Box2D/Box2D.h>

class HelloWorld : public cocos2d::Layer

{

private:

b2World *world;//创建一个私有的变量,即物理世界

public:

// there‘s no ‘id‘ in cpp, so we recommend returning the class instance pointer

static cocos2d::Scene* createScene();

// Here‘s a difference. Method ‘init‘ in cocos2d-x returns bool, instead of returning ‘id‘ in cocos2d-iphone

virtual bool init();

//为了模拟世界的运行,重写update方法,他会没隔一帧执行一次,

//我们的世界也要每隔一帧就重新计算一下世界中的物体所处的位置

virtual void update(float dt);

//创建一个运动的物体,运动的矩形

void addRect();

// implement the "static create()" method manually

CREATE_FUNC(HelloWorld);

};

#endif // __HELLOWORLD_SCENE_H__

HelloWorld。cpp中的内容如下

#include "HelloWorldScene.h"

#include "cocostudio/CocoStudio.h"

#include "ui/CocosGUI.h"

USING_NS_CC;

using namespace cocostudio::timeline;

//定义中间的比例为80(box2d和cocos2d的转换比例)

#define RATIO 80.0f

Scene* HelloWorld::createScene()

{

// ‘scene‘ is an autorelease object

auto scene = Scene::create();

// ‘layer‘ is an autorelease object

auto layer = HelloWorld::create();

// add layer as a child to scene

scene->addChild(layer);

// return the scene

return scene;

}

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

bool HelloWorld::init()

{

//////////////////////////////

// 1. super init first

if ( !Layer::init() )

{

return false;

}

//创建一个世界,b2world(二维矢量类型的,指定世界的加速度的方向

//b2Vec2(加速度的方向,向下的,所以x轴没有为0,y轴为-10))这样才能往下落

world = new b2World(b2Vec2(0, -10));

//添加一个矩形,然后调用scheduleUpdate方法,实现矩形的下落,随着重力加速向下运动

addRect();

//调用update方法,实现每帧都改变物理世界中的物体

scheduleUpdate();

return true;

}

//实现模拟物理世界的方法(当前一帧与上一帧的时间差)

void HelloWorld::update(float dt){

//使用这个step方法来一步一步的模拟我们的物理世界

//(时间差(当前一步与最后一步的时间差,即当前一帧与上一帧的时间差),

//速度迭代,模拟物理世界的过程中难免会有误差,所以就用速度迭代的次数来避免误差,官方建议8次,

//位置的迭代,官方建议3次)

world->Step(dt, 8, 3);

//为了获取矩形,所以在这里定义一个Sprite

Sprite *s;

//获取移动的矩形

//在这里获取到所有的子集的对象

//遍历所有的子集对象,

for (b2Body *b = world->GetBodyList(); b; b = b->GetNext()) {

//判断,因为只有一个动态的物体,所以可以这么判断,否则,要用别的方法

if (b->GetType() == b2_dynamicBody) {

//获取到移动的物体的y 位置

log("%f",b->GetPosition().y);

if (b->GetUserData()) {

s = (Sprite*)b->GetUserData();

//让Sprite与body同步

s->setPosition(b->GetPosition().x * RATIO, b->GetPosition().y * RATIO);

}

}

}

}

//创建矩形,并且让其随着重力开始运动,有加速度的向下移动

void HelloWorld::addRect(){

//config box2d

///*******************************************************************

//定义一个b2BodyDef物体

b2BodyDef def;

//    //指定def的初始化的position,x轴是0,y轴是10,代表着从10往下落

//    def.position = b2Vec2(0, 10);

//定义完比例后开始修改位置,因为最高为6米,所以y轴定义为5,x轴最大为10米

def.position = b2Vec2(3, 5);

//配置物体的属性

//b2_dynamicBody是枚举类型的,代表运动的物体,

//还有b2_staticBody  代表静态的物体

//还有b2_kinematicBody  代表悬浮的物体

def.type = b2_dynamicBody;//此时这是个运动的物体

//创建一个物体(物体的相关的定义)

b2Body *body = world->CreateBody(&def);

///*******************************************************************

//config cocos shape

///*******************************************************************

//定义一个图形

auto s = Sprite::create();

//指定他的Texture图形区域

s->setTextureRect(Rect(0, 0, 80, 80));

//将其添加到层中

addChild(s);

//配置位置

//cocos2d的图形区域的位置是(800 x 600)

//box2d的范围单位是米,官方文档上的比较精确的范围是10米之内

//意味着800px的位置当成10米是比较合理的,所以中间的比例是80

//    //因为每一帧都同步了,所以此处可以不要了,

//    //因为update中的s->setPosition(b->GetPosition().x * RATIO,

//    //b->GetPosition().y * RATIO);所以就不要了

//    //配置s的位置

//    s->setPosition(Point(def.position.x * RATIO, def.position.y * RATIO));

//将图形和body相关起来

body->SetUserData(s);//这样就将图形和body绑定起来了

///*******************************************************************

}

时间: 2025-01-02 17:31:36

Cocos2d-x之物理世界(创建运动的物体)的相关文章

Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界

这篇我要给大家介绍两个知识点: 1. 创建游戏物理世界 2. 没了(小若:我噗) 害怕了?不用担心,这太简单了~! 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址:http://www.benmutou.com/blog/archives/804 文章来源:笨木头与游戏开发 3.0新亮点,史上最简单的物理引擎 在Cocos2d-x3.0里使用物理引擎,会很有快感,因为很多繁琐的东西它都帮我们封装好了. 那么,我要开始创建游戏的关卡场景了,大家跟紧了. 我们给关卡场景命名为Toll

coco2d-x 3.0游戏实例学习笔记 《跑酷》 二 游戏界面--全新的3.0物理世界

从这里开始,就和之前前辈的有很多不同啦. 在MainScene中,开始按钮中,我们就要通过回调函数,进入到我们的游戏场景啦. 那么在游戏场景中我们定义为:PlayScene ,而且是一个带物理世界的场景,cocos2d-x 3.0中要创建物理Scene是很简单的,因为它都帮我们封装好了. 那么这一步,我们在PlayScene 中主要完成以下功能: 1.物理世界创建 2.创建一个地面的物理刚体 相关知识个人见解: 所谓的创建物理世界,个人觉得是一个抽象的东东,作为新手,开始并不能理解,开始你可以就

coco2d-x 3.0游戏实例学习笔记 《跑酷》 第二步---游戏界面&amp;amp;全新的3.0物理世界

说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写.并做相关笔记 从这里開始,就和之前前辈的有非常多不同啦. 在MainScene中,開始button中,我们就要通过回调函数,进入到我们的游戏场景啦. 那么在游戏场景中我们定义为:PlayScene ,并且是一个带物理世界的场景,cocos2d-x 3.0中要创建物理Scene是非常easy的,由于它都帮我们封装好

Cocos2d-x之物理世界(创建静态的物体)

在HelloWorldScene.h中添加如下内容 //创建一个地板 void addGround(); HelloWorldScene.cpp 1 #include "HelloWorldScene.h" 2 #include "cocostudio/CocoStudio.h" 3 #include "ui/CocosGUI.h" 4 5 USING_NS_CC; 6 7 using namespace cocostudio::timeline

Cocos2d-x之物理世界(创建悬浮的物体)

在HelloWorldScene.h中添加如下内容 //创建一个运动的物体,运动的矩形 void addRect(float x, float y, b2BodyType type); HelloWorldScene.cpp 1 #include "HelloWorldScene.h" 2 #include "cocostudio/CocoStudio.h" 3 #include "ui/CocosGUI.h" 4 5 USING_NS_CC;

cocos2d-x快乐的做让人快乐的游戏3:cocos-2d 3.x中的物理世界

Cocos2d-x 3.0+ 中全新的封装的物理引擎给了开发人员最大的便捷,你不用再繁琐与各种物理引擎的细节,全然的封装让开发人员能够更快更好的将物理引擎的机制加入?到自己的游戏中,简化的设计是从2.0到3.0+的一个质的飞跃.(假设用的2.x版本号的cocos2d-x,看前一篇文章box2d) 以下相同以一个小demo来展示一下物理引擎的运用,同一时候说一下我在运用物理引擎中遇到的一些小小的问题. Cocos2d-x 3.0+中的物理属性: 1.物理世界被集成到场景中,当你创建一个场景,你能够

Quick-cocos2d-x3.3 Study (十三)--------- 创建物理世界的边界 ( 创建一个带物理效果的线条 )

创建物理效果的线条 1 -- 创建物理世界的边界 2 -- 创建物理世界的上边界 3 -- 通过设置两个点来创建一条带物理效果的线条 4 local top = display.newNode() 5 local topBody = cc.PhysicsBody:createEdgeSegment( 6 -- 第一个点的位置 7 cc.p( 100, display.top - 100 ), 8 -- 第二个点的位置 9 cc.p( display.right - 100, display.to

cocos2d-x之物理世界(创建物理世界)

首先在HelloWorld.h中引入包名:#include <Box2D/Box2D.h> 在HelloWorld.h类中添加如下内容: private: b2World *world;//创建一个私有的变量,即物理世界 public: //为了模拟世界的运行,重写update方法,他会没隔一帧执行一次, //我们的世界也要每隔一帧就重新计算一下世界中的物体所处的位置 virtual void update(float dt); 在bool HelloWorld::init()中 //创建一个

15--Box2D使用(一、创建物理世界)

创建工程Box2DTest,去掉背景和精灵对象等.首先在HelloWorldScene.h头文件定义一个屏幕像素与物理世界长度转换宏,并引入box2D头文件 #define PIXEL_TO_METER 30 #include "Box2D/Box2D.h" 再声明几个函数与变量 void createWorld(); //创建物理世界 void createWall(); //创建四周墙体 void createBall(); //创建刚体   b2World* world;