麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

第十二章物理引擎

2019-11-09 18:46:39
字體:
供稿:網(wǎng)友

Cocos2d-x學(xué)習(xí)筆記


使用物理引擎

物理引擎能夠模仿真實世界物理運動規(guī)律,使得精靈做出自由落體、拋物線運動、互相碰撞、反彈等效果,使用物理引擎還可以進(jìn)行準(zhǔn)確的碰撞檢測。

物理引擎核心概念

物理引擎核心概念

世界(World):游戲中的物理世界。物體(Body):構(gòu)成物理世界的基礎(chǔ),具有位置、旋轉(zhuǎn)角度等的特性,它上面的任何兩點之間的距離都是完全不變的,也可以稱為剛體(rigid body)。形狀(Shape):物體的形狀。一個依附于物體的二維碰撞幾何結(jié)構(gòu),具有摩擦和彈性等材料屬性。由于物體被抽象成剛體,忽略了形狀。但是物體間的摩擦和碰撞時與形狀有關(guān)的,這時候需要將形狀依附于物體上。接觸點(Contact):管理檢測碰撞。關(guān)節(jié)(Joint):把兩個或多個物體固定到一起的約束。

物理引擎與精靈關(guān)系

物理引擎本身不包括精靈,它與精靈關(guān)系之間是相互獨立的,精靈不會自動跟著物理引擎中的物體做物理運動,通常需要編寫代碼將物體與精靈連接起來,同步它們的狀態(tài)。

Cocos2d-x 3.x中物理引擎封裝

Cocos2d-x 3.x 物理引擎API

在Cocos2d-x 3.x 中物理世界被融入游戲引擎的場景中,我們可以指定這個場景是否使用物理引擎,為此創(chuàng)建類Scene增加如下函數(shù):

static Scene * createWithPhysics():創(chuàng)建場景對象。bool initWithPhysics():初始化具有物理引擎場景對象。void addChlidToPhysicsWorld(Node * child):增加節(jié)點對象到物理世界。PhysicsWorld * getPhysicsWorld():獲得物理世界對象。

Cocos2d-x 3.x 在節(jié)點類Node中增加了physicsBody屬性,我們可以將物理引擎中的物體添加到Node對象中。 此外,Cocos2d-x 3.x為物理引擎增加了很多類,其中主要的類如下:

PhysicsWorld類:封裝物理引擎世界(World)。PhysicsBody類:封裝物理引擎物體(Body)。PhysiCSShape類:封裝物理疫情形狀(Shape)。PhysicsContact類:封裝物理引擎碰撞類(Contact)。EventListenerPhysicsContact類:碰撞檢測監(jiān)聽類。PhysicsJoint類:封裝物理引擎關(guān)節(jié)(Joint)。

PhysicsShape類

形狀類PhysicsShape是一個抽象類,它有很多子類:

PhysicsShapeCircle:圓圈。PhysicsShapeBox:矩形盒子。PhysicsShapePolygon:多邊形。PhysicsShapeEdgeSegment:有邊的線段。PhysicsShapeEdgeBox:有邊的矩形盒子。PhysicsShapeEdgePolygon:有邊的多邊形。PhysicsShapeEdgeChain:有邊的鏈形。

EventListenerPhysicsContact類

碰撞檢測監(jiān)聽類EventListenerPhysicsShapeContact,子類如下: EventListenerPhysicsContact中碰撞檢測事件響應(yīng)屬性:

std::function<bool(PhysicsContact & contact)>onContactBegin:兩個物體開始接觸時會響應(yīng),但只調(diào)用一次。返回false情況下后面的兩個屬性(onContactPReSolve 和 onContactPostSolve)所指定的函數(shù),不調(diào)用。std::function<bool(PhysicsContact & contact, PhysicsContactPreSolve & solve)>onContactPreSolve:持續(xù)接觸時響應(yīng),它會被多次調(diào)用。返回false情況下后面的onContactPostSolve屬性所指定的函數(shù),不調(diào)用。std::function<void(PhysicsContact & contact, const PhysicsContactPostSolve & solve)>onContactPostSolve:持續(xù)接觸時響應(yīng),調(diào)用完P(guān)reSolve后調(diào)用。std::function<void(PhysicsContact & contact)>onContactSeparate:分離時響應(yīng),但只調(diào)用一次。

PhysicsJoint類

關(guān)節(jié)類PhysicsJoint是一個抽象類,其子類如下: PhysicsJointDistance類是距離關(guān)節(jié)類,兩個物體上面各自有一點,兩點之間的距離必須固定不變。創(chuàng)建PhysicsJointDistace的靜態(tài)函數(shù)定義如下:

static PhysicsJointDistance * construct (    PhysicsBody * a,    PhysicsBody * b,    const Vec2 & anchr1,    const Vec2 & anchr2)

其中參數(shù)a和b是兩個互相約束的物體,anchr1是連接a物體的錨點,anchr2是b物體的錨點。

實例

小球

HelloWorld.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); void addNewSpriteAtPosition(Vec2 p); // implement the "static create()" method manually CREATE_FUNC(HelloWorld);};#endif // __HELLOWORLD_SCENE_H__

HelloWorld.cpp文件

#include "HelloWorldScene.h"USING_NS_CC;Scene* HelloWorld::createScene(){ // 'scene' is an autorelease object auto scene = Scene::createWithPhysics();//創(chuàng)建帶物理引擎的場景 scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);//設(shè)置在物理世界中調(diào)試遮罩,當(dāng)調(diào)試結(jié)束時,需要把它關(guān)閉 // '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 instancebool HelloWorld::init(){ ////////////////////////////// // 1. super init first if ( !Layer::init() ) { return false; } log("HelloWorld init"); Size visibleSize = Director::getInstance()->getVisibleSize(); Vec2 origin = Director::getInstance()->getVisibleOrigin(); //定義世界的邊界 //創(chuàng)建物體對象,靜態(tài)函數(shù)createEdgeBox指定世界邊界是矩形盒子,第一個參數(shù)指定矩形的大小,第二個參數(shù)是設(shè)置材質(zhì),第三個參數(shù)是設(shè)置邊的寬度 auto body = PhysicsBody::createEdgeBox(visibleSize, PHYSICSBODY_MATERIAL_DEFAULT, 5.0f); auto edgeNode = Node::create();//創(chuàng)建邊界節(jié)點對象,這個節(jié)點對象作為世界邊界的對象 edgeNode->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2)); edgeNode->setPhysicsBody(body);//設(shè)置與節(jié)點相關(guān)的物體對象 this->addChild(edgeNode); setTouchEnabled(true); //設(shè)置為單點觸摸 setTouchMode(Touch::DispatchMode::ONE_BY_ONE); return true;}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);//創(chuàng)建圓圈形狀物體 sp->setPhysicsBody(body); sp->setPosition(p); this->addChild(sp);}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 黑人一级片 | 亚洲成人福利电影 | 午夜九九九 | 欧美黄色性视频 | 欧美性生交xxxxx久久久缅北 | 精品亚洲在线 | 史上最强炼体老祖动漫在线观看 | 亚洲综合视频在线播放 | 欧美三日本三级少妇三级99观看视频 | sm高h视频 | 国产成人精品一区二区视频免费 | 亚洲网视频 | a黄色网| 国产jjizz一区二区三区视频 | 黄色免费av网站 | 日本一道aⅴ不卡免费播放 久久久久久久高清 | 久久精精品 | 中国美女一级黄色片 | 国产精品剧情一区二区在线观看 | 亚州精品在线视频 | 色妞欧美 | 欧美精品一区二区久久 | 国产超碰人人爽人人做人人爱 | 一本一本久久a久久精品综合小说 | 黄色毛片a级 | 热99热| 国产人成精品一区二区三 | 一区二区三视频 | 最近免费观看高清韩国日本大全 | 在线免费日本 | 黄色网欧美 | 免费人成在线播放 | 国产精品免费大片 | 九九色网站 | 天天躁狠狠躁夜躁2020挡不住 | 国产91在线免费 | 午夜视频在线观看91 | 深夜福利久久久 | 日本a∨精品中文字幕在线 狠狠干精品视频 | 久久精品中文字幕 | 欧美日韩在线免费观看 |