实例介绍Cocos2d-x物理引擎:HelloPhysicsWorld

我们通过一个实例介绍一下在Cocos2d-x 3.x中使用物理引擎的开发过程熟悉这些API的使用。这个实例的运行后的场景当场景启动后玩家可以触摸点击屏幕每次触摸时候就会在触摸点生成一个新的精灵精灵的运行是自由落体运动。

HelloPhysicsWorld实例

使用物理引擎的一般步骤如下图所示。

这个过程与上帝创建世界的过程类似上帝首先创建了世界然后为世界指定了边界否则万物就会掉到世界之外的混沌里去了最后上帝创建了万物。
当然这只是一个最基本的步骤有的时候还需要碰撞检测和使用关节等处理。下面我们就按照这个步骤介绍一下代码部分。首先看一下看HelloWorldScene.h文件它的代码如下

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"
USING_NS_CC;

class HelloWorld : public cocos2d::Layer
{
public:
    static cocos2d::Scene* createScene();

    virtual bool init();
	virtual bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event);			①

    CREATE_FUNC(HelloWorld);

	void addNewSpriteAtPosition(Vec2 p);									②
};

#endif // __HELLOWORLD_SCENE_H__

上述第①行代码是声明了单点触摸函数onTouchBegan以便于响应单点触摸事件。第②行代码是定义创建精灵函数这个函数是在触摸点击位置创建一个精灵对象。
HelloWorldScene.cpp中创建物理世界代码如下

Scene* HelloWorld::createScene()
{
    auto scene = Scene::createWithPhysics();									①
	scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);		②

    auto layer = HelloWorld::create();

    scene->addChild(layer);

    return scene;

}

上述第①行代码Scene::createWithPhysics()语句是创建场景这个是带物理引擎世界场景使用createWithPhysics()函数会在场景中进行初始化物理引擎我们可以通过场景的getPhysicsWorld()函数获取初始化的物理世界PhysicsWorld对象。我们也可以根据需要在这里设置物理世界其中第②行代码设置在物理世界中绘制调试遮罩这会把物体的形状绘制出来。因为世界中的物体如果没有与精灵绑定到一起我们是看不到它的。这主要用于调试当调试结束后游戏发布的时候我们需要把它关闭。关闭绘制调试遮罩的场景如下图所示。

HelloWorldScene.cpp中指定世界的边界代码如下

bool HelloWorld::init()
{
    if ( !Layer::init() )
    {
        return false;
    }

    Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

	//定义世界的边界
		auto body = PhysicsBody::createEdgeBox(visibleSize,
						PHYSICSBODY_MATERIAL_DEFAULT,5.0f);						①
	auto edgeNode = Node::create();											②
	edgeNode->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2)); 				③
	edgeNode->setPhysicsBody(body); 										④
	this->addChild(edgeNode); 											⑤

	setTouchEnabled(true);												⑥
	//设置为单点触摸
	setTouchMode(Touch::DispatchMode::ONE_BY_ONE);							⑦

    return true;
}

上述代码HelloWorld::init是初始化层函数在这个函数中我们可以指定世界的边界世界边界也是一个物体代码第①行PhysicsBody::createEdgeBox是创建物体对象静态函数createEdgeBox指定世界边界是矩形盒子createEdgeBox函数的第一个参数指定矩形的大小。第二个参数是设置材质PHYSICSBODY_MATERIAL_DEFAULT常量是默认材质材质是由结构体PhysicsMaterial定义的结构体PhysicsMaterial成员有density密度、friction磨擦系数和restitution弹性系数。密度可以用来计算物体的质量密度可以为零或者为正数。摩擦系数经常会设置在0.0~1.0之间0.0表示没有摩擦力1.0会产生强摩擦。弹性系数的值通常设置到0.0~1.0之间0.0表示物体不会弹起1.0表示物体会完全反弹即称为弹性碰撞。createEdgeBox函数的第三个参数是设置边的宽度。
代码第②行是创建边界节点对象这个节点对象作为世界边界对象第③行代码是设置节点对象的位置。第④行代码edgeNode->setPhysicsBody(body)是设置与节点相关的物体对象。通过这条语句使得游戏场景中的节点对象精灵等与物体关联起来。第⑤行代码是将节点对象添加到层中。
代码第⑥行setTouchEnabled(true)是使层开始触摸事件支持。第⑦行代码setTouchMode(Touch::DispatchMode::ONE_BY_ONE)是设置触摸模式为单点触摸。
HelloWorldScene.cpp其他代码如下

bool HelloWorld::onTouchBegan(Touch* touch, Event* event)						①
{
	Vec2 location = touch->getLocation();
	addNewSpriteAtPosition(location);
	return false;
}	

void HelloWorld::addNewSpriteAtPosition(Vec2 p) 								②
{
    auto sp = Sprite::create("Ball.png");										③
	sp->setTag(1);														④

	auto body = PhysicsBody::createCircle(sp->getContentSize().width / 2);				⑤
	//auto body = PhysicsBody::createBox(sp->getContentSize());						⑥
    sp->setPhysicsBody(body);											⑦
    sp->setPosition(p);
	this->addChild(sp);
}

上述代码第①行是单点触摸时候调用的函数在这个函数中调用addNewSpriteAtPosition(location)函数在触摸点创建一个精灵对象。
第②行代码是定义addNewSpriteAtPosition函数第③行代码Sprite::create("Ball.png")是创建一个精灵对象第④行代码sp->setTag(1)是设置精灵的tag属性在检查碰撞时候可以通过tag属性判断并获得精灵对象。
第⑤行代码是通过PhysicsBody的静态createCircle函数创建圆圈形状物体。PhysicsBody还有很多类似的create函数如createBox、createCircle、createPolygon和createEdgePolygon等函数这些函数与物理形状对应的。这里只详细解释createCircle函数, createCircle函数API如下
static PhysicsBody* createCircle(float radius,
const PhysicsMaterial & material = PHYSICSBODY_MATERIAL_DEFAULT,
const Vec2 & offset = Vec2::ZERO 
)
其中第一个参数radius是设置圆圈的半径第二参数material是材质这可以省略默认值是PHYSICSBODY_MATERIAL_DEFAULT所以在HelloWorld::init()函数中定义世界的边界时候PhysicsBody::createEdgeBox语句中的material参数也是可以省略的。第三个参数offset是偏移量可以省略默认值是Vec2::ZERO。

第⑥行代码PhysicsBody::createBox(sp->getContentSize())是创建一个没有边的矩形盒子。第⑦行代码sp->setPhysicsBody(body)是设置与精灵相关的物体对象。

更多内容请关注最新Cocos图书《Cocos2d-x实战 C++卷》‍

本书交流讨论网站http://www.cocoagame.net

更多精彩视频课程请关注智捷课堂Cocos课程http://v.51work6.com

欢迎加入Cocos2d-x技术讨论群257760386

《Cocos2d-x实战 C++卷》现已上线各大商店均已开售‍

京东http://item.jd.com/11584534.html

亚马逊http://www.amazon.cn/Cocos2d-x%E5%AE%9E%E6%88%98-C-%E5%8D%B7-%E5%85%B3%E4%B8%9C%E5%8D%87/dp/B00PTYWTLU

当当http://product.dangdang.com/23606265.html

互动出版网http://product.china-pub.com/3770734

《Cocos2d-x实战 C++卷》源码及样章下载地址

源码下载地址http://51work6.com/forum.php?mod=viewthread&tid=1155&extra=page%3D1 

样章下载地址http://51work6.com/forum.php?mod=viewthread&tid=1157&extra=page%3D1

欢迎关注智捷iOS课堂微信公共平台

时间: 2024-09-13 00:27:38

实例介绍Cocos2d-x物理引擎:HelloPhysicsWorld的相关文章

三个物理引擎(转)

介绍三个物理引擎以及讨论  物理引擎在3D的领域中是较年轻的,而且难度也比较高, 先製作这篇文章,是想让大家有个先行印象,了解这是什么. 別担心,最终这些教学终將连结成为一体,我只是让大家的概念先推前一下. 当成看杂誌一般的心情即可,如果你有研究,会使用SDK,也可以马上开始. 关於物理 牛顿归纳出了地心引力的通则,並且开始以数学方法描述物理现象, 这已经是很久前的事情了,但是並不只是东西往下掉而已,虽然简单讲是这样. 球会滚动.羽毛会飘落.摩擦力......等等,都是自然界常见的力学现象. 关

实例介绍Cocos2d-x物理引擎:碰撞检测

碰撞检测是使用物理引擎的一个重要目的使用物理引擎可以进行精确的碰撞检测而且执行的效率也很高.在Cocos2d-x 3.x中使用事件派发机制管理碰撞事件EventListenerPhysicsContact是碰撞事件监听器.碰撞检测相关的API我们在前面一节介绍过了下面通过一个实例介绍碰撞检测的实现.这个实例的运行后的场景如图所示当场景启动后玩家可以触摸点击屏幕每次触摸时候就会在触摸点生成一个新的精灵精灵的运行是自由落体运动.当这些精灵之间发生接触时候它们的颜色被设置为黄色分离后颜色又恢复到原来状

实例介绍Cocos2d-x中Box2D物理引擎:HelloBox2D

我们通过一个实例介绍一下在Cocos2d-x 3.x中使用Box2D物理引擎的开发过程熟悉这些API的使用.这个实例运行后的场景如图所示当场景启动后玩家可以触摸点击屏幕每次触摸时候就会在触摸点生成一个新的精灵精灵的运行自由落体运动.   HelloBox2D实例使用Box2D引擎进行开发过程如图12-15所示.下面我们就按照这个步骤介绍一下代码部分.首先看一下看HelloWorldScene.h文件它的代码如下 #ifndef __HELLOWORLD_SCENE_H__ #define __H

实例介绍Cocos2d-x中Box2D物理引擎:使用关节

下面我们将使用Box2D物理引擎技术进行重构.使得关节能够掌握如何在Box2D使用关节约束.HelloWorldScene.cpp中与使用关节的相关代码如下 void HelloWorld::addNewSpriteAtPosition(Vec2 p) { log("Add sprite %0.2f x %02.f",p.x,p.y); //创建物理引擎精灵对象A auto spriteA = Sprite::create("BoxA2.png"); ① sprit

实例介绍Cocos2d-x中Box2D物理引擎:碰撞检测

在Box2D中碰撞事件通过实现b2ContactListener类函数实现b2ContactListener是Box2D提供的抽象类它的抽象函数virtual void BeginContact(b2Contact* contact).两个物体开始接触时会响应但只调用一次.virtual void EndContact(b2Contact* contact).分离时响应.但只调用一次.virtual void PreSolve(b2Contact* contact, const b2Manifo

实例介绍Cocos2d-x物理引擎:使用关节

在游戏中我们可以通过关节约束两个物体的运动.我们通过一个距离关节实例介绍一下如何在使用关节. 这个实例的运行后的场景如图所示当场景启动后玩家可以触摸点击屏幕每次触摸时候就会在触摸点和附近生成两个新的精灵它们的运行是自由落体运动它们之间的距离是固定的.图示是开启了绘制调试遮罩从图中可见调试遮罩不仅会显示物体还会显示关节.   使用距离关节实例     使用距离关节实例绘制调试遮罩 代码部分中HelloWorldScene.h文件与上一节的实例非常类似不再介绍了.HelloWorldScene.cp

Android下2d物理引擎Box2d用法简单实例_Android

本文实例讲述了Android下2d物理引擎Box2d用法.分享给大家供大家参考.具体如下: 程序运行的时候需要加载Jbox2d的库,可到以下地址下载(使用的是不带渲染部分的库jbox2d-2.0.1-library-only.jar): http://sourceforge.net/projects/jbox2d/ package com.test; import org.jbox2d.collision.AABB; import org.jbox2d.collision.CircleDef;

Android下2d物理引擎Box2d用法简单实例

本文实例讲述了Android下2d物理引擎Box2d用法.分享给大家供大家参考.具体如下: 程序运行的时候需要加载Jbox2d的库,可到以下地址下载(使用的是不带渲染部分的库jbox2d-2.0.1-library-only.jar): http://sourceforge.net/projects/jbox2d/ package com.test; import org.jbox2d.collision.AABB; import org.jbox2d.collision.CircleDef;

常见3D物理引擎概述

今天帮朋友找3D物理引擎的资料,以前也看过那么多了,一直没有总结过,今天顺便整理一下. 1.  Havok: 老牌的君王,支持功能如下: http://www.havok.com ·         Collision Detection - including Continuous Physics ·         MOPP Technology - for compact representation of large collision meshes ·         Dynamics