1. 程式人生 > >cocos2d-x 物理引擎

cocos2d-x 物理引擎

你的遊戲進展的很順利。遊戲中添加了精靈物件、遊戲機制,你努力編碼還是有回報的。你現在開始覺得:“嗯,這是一個能讓人玩的遊戲了”。當你意識到你的遊戲需要模擬現實世界的物理環境時,你該怎麼做呢?你會猜:應該會涉及到碰撞檢測、重力、彈力和摩擦力。沒錯,猜對了!這一章就來講物理引擎和如何使用物理引擎。讓我們來探討一下,我們什麼時候、什麼地點、為什麼會使用物理引擎吧。

物理引擎很可怕,我真的需要它麼?請告訴我不是這樣的!

別逃走啊,物理引擎其實也不是個藏在你床下準備把你嚇個半死的怪物。或許你的需求很簡單,簡單到並不需要使用物理引擎。或許節點物件、update()函式、Rect物件、containsPoint()函式或intersectsRect()函式這些就夠你用的了。例如:

1 2 3 4 5 6 7 8 9 10 void update(float dt) { auto p = touch->getLocation(); auto rect = this->getBoundingBox(); if(rect.containsPoint(p)) { // do something, intersection } }

上面這套系統能滿足簡單的需求,但卻無法擴充套件。假如你有100個精靈,而所有的這些精靈都需要不斷地更新,以檢測與其他物件的重疊狀況,那該怎麼辦呢?用上面的系統,這也是可以實現的,但是會嚴重消耗CPU的使用率並影響幀速率。你的遊戲就沒辦法繼續玩下去了。物理引擎(PhysicsEngine)幫我們解決了這些問題,並且它是可擴充套件的,還也不會對CPU造成過大壓力。這或許看起來有點陌生,我們還是來看一個簡單的例子。之後,我們還是來看一個簡單的例子,力求將概念、術語以及實踐結合起來。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // create a static PhysicsBody auto physicsBody = PhysicsBody::createBox(Size(65.0f , 81.0f ), PhysicsMaterial(0.1f, 1.0f, 0.0f)); physicsBody->setDynamic(false); // create a sprite auto sprite = Sprite::create(
"whiteSprite.png"); sprite->setPosition(Vec2(400, 400)); // sprite will use physicsBody sprite->setPhysicsBody(physicsBody); //add contact event listener auto contactListener = EventListenerPhysicsContact::create(); contactListener->onContactBegin = CC_CALLBACK_1(onContactBegin, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(contactListener, this);

雖然上面這個例子已經很簡單了,但你可能還是覺得它複雜得有點嚇人?沒關係,讓我們來更仔細地分析一下它,我們會發現也沒那麼複雜的。程式碼中的建立步驟為:建立PhysicsBody物件。建立Sprite精靈。Sprite精靈物件應用PhysicsBody物件的屬性。建立了一個監聽器以響應onContactBegin事件。

一旦我們一步步地來分析,這些概念都變得容易理解了。理解下面這些術語和概念,會有利於你更好地瞭解物理引擎的所有細節:

物理引擎術語和概念

剛體

PhysicsBody物件包含了一個物件的物理屬性。這些屬性包括:質量、位置、自旋度、速度和衰減度。PhysicsBody物件是形狀的核心。當你把形狀和PhysicsBody關聯後,PhysicsBody物件才能具有形狀。

材質

材質描述了材料的以下屬性:

  • 密度:它被用於計算母體的質量屬性。
  • 摩擦:它被用於進行物體間的相對運動。
  • 恢復係數:它被用於使物體反彈。恢復係數一般設為0到1之間。0說明不反彈,1說明完全反彈。

形狀

形狀描述了碰撞的幾何屬性。將形狀繫結到剛體,就定義了一個剛體的形狀。如果必要,你可以為一個剛體關聯無數的形狀,這是一種定義複雜形狀的方式。每個形狀都與一個PhysicsMaterial物件相關,並且擁有以下的屬性:type(種類), area(面積), mass(質量), moment(轉矩), offset(偏移量/重心)和tag(標籤)。可能你還對它們中的某些還感到陌生:

  • type:描述了一系列的形狀,例如圓形,矩形,多邊形等。
  • area:用於計算剛體的質量。密度和體積決定了剛體的質量。
  • mass:剛體所含的物質的量,可以用兩種方式進行測量:物體在給定的力下獲得的加速度大小,或者在一個引力場中物體受到力的大小。
  • moment:決定了獲得特定角加速度所需要的轉矩。
  • offset:在剛體的當前座標中,相對於剛體的重心所偏移的量。
  • tag:用以使開發者較容易地確定形狀。你大概還能記得把?你可以為所有的節點都分配一個標籤,以進行辨識和實現更容易的訪問。

我們這樣來描述不同的形狀:

  • PhysicsShape:shapes(形狀)實現了PhysicsShape的基類。
  • PhysicsShapeCircle:圓是實心的。你無法用圓(circle)形狀來實現空心圓。
  • PhysicsShapePolygon:多邊形(Polygon)形狀是指實心的且外凸的多邊形。
  • PhsicsShapeBox:矩形(Box)形狀是外凸的多邊形的一種。
  • PhysicsShapeEdgeSegment:一種線段的形狀。
  • PhysicsShapePolygon:空心多邊形。一種由多個線段構成的多邊形的邊緣。
  • PhysicsShapeEdgeBox:空心矩形形狀。一種由四個線段組成的矩形的邊緣。
  • PhysicsShapeEdgeChain鍊形形狀(chain shape)可以有效地把許多邊緣聯結起來。

連線/關節

連線(contacts)和關節(joint)物件描述了剛體相互關聯的方式。

World 世界

物理剛體被新增到一個叫世界(World)的容器裡,這也是它們被模擬的場所。將bodies,shapes,constraints這些物件新增到物理世界中,將整個物理世界作為一個整體進行更新。物理世界決定了所有這些部件在一起的互動方式。其中,用物理API實現的許多互動都是與PhysicsWorld這個物件有關的。

此處有許多需要記住的東西。請把這些術語記在身邊,待會用到的時候以便隨時查閱。

物理世界和物理剛體

物理世界

物理世界(PhysicsWorld)物件是進行物理模擬時的一個核心部件。物理世界(PhysicsWorld)與場景(Scene)緊密整合在一起。讓我們來看一個我們都會涉及到的例子吧。你住的房子裡有廚房嗎?你想這個問題的時候,就像是在想你的物理世界一樣!現在,你的世界裡擁有一些物理剛體(PhysicsBody)物件,就跟食物、刀具、電器這些東西一樣!在這個世界中,這些剛體相互作用。它們相互接觸,並且對相互的接觸做出反應。例如:用刀子切開食物,並把它放到電器中。刀子切到食物了嗎?可能切到了。也可能還沒有。還可能這個刀子根本就不適合做這個。

你可以用下面的方式建立一個包含有PhysicsWorld的Scene物件:

相關推薦

25.cocos2d-x物理引擎(每點選一次螢幕新增一個小球)

HelloWorldScene.h檔案: #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" USING_NS_CC; class Hell

cocos2d-x 物理引擎

你的遊戲進展的很順利。遊戲中添加了精靈物件、遊戲機制,你努力編碼還是有回報的。你現在開始覺得:“嗯,這是一個能讓人玩的遊戲了”。當你意識到你的遊戲需要模擬現實世界的物理環境時,你該怎麼做呢?你會猜:應該會涉及到碰撞檢測、重力、彈力和摩擦力。沒錯,猜對了!這一章就來講物

Cocos2d-x Lua引擎製作的遊戲程式碼加密

在Mac OS中的終端鍵入:cocos luacompile -h,可以獲得這個命令的幫助: usage: cocos luacompile [-h] [-v] [-s SRC_DIR_ARR] [-d DST_DIR] [-e]         &nbs

cocos2d-x遊戲引擎核心之多執行緒分析及注意事項

一、多執行緒原理 (1)單執行緒的尷尬   重新回顧下 Cocos2d-x 的並行機制。引擎內部實現了一個龐大的主迴圈,在每幀之間更新各個精靈的狀態、執行動作、呼叫定時函式等,這些操作之間可以保證嚴格獨立,互不干擾。不得不說,這是一個非常巧妙的機制,它

Cocos2D-X 遊戲引擎】初窺門徑(11)CCUserDefault:儲存資料

儲存簡單的資料用CCUserDefault和Android中的SharedPreferences一樣,都是以鍵值對儲存的。 //獲取bool型值 bool getBoolForKey(const char* pKey, bool defaultValue = fals

cocos2dx 3.x 物理引擎接觸檢測掩碼、碰撞掩碼和類別掩碼問題解析

言簡意賅,物體的類別掩碼CategoryBitMask和物體的接觸測試掩碼ContactTestBitmask邏輯“與”運算結果非零,則觸發EventListenerPhysicsContact事件監聽器,物體的類別掩碼CategoryBitMask和物體

Cocos2d-x遊戲引擎開發[3]----建立錨點 (重建了一個類)

一般新建專案可以看到他是位於整個圖形介面的中心,原因是他設定了一個錨點,相當於落腳點。 因此我需要重做一個類研究這個影象在介面中的位置擺放,主要是下面這個程式碼 spr->setAnchorP

實例介紹Cocos2d-x中Box2D物理引擎:碰撞檢測

函數實現 pda creates pty blank oid rtu and 重構 在Box2D中碰撞事件通過實現b2ContactListener類函數實現,b2ContactListener是Box2D提供的抽象類,它的抽象函數:virtual void BeginC

實例介紹Cocos2d-x中Box2D物理引擎:HelloBox2D

pre all align 討論 響應 算法 站點 virtual origin 我們通過一個實例介紹一下。在Cocos2d-x 3.x中使用Box2D物理引擎的開發過程,熟悉這些API的使用。這個實例執行後的場景如圖所看到的,當場景啟動後,玩家能夠觸摸點擊屏幕,每次觸

cocos2d-x 3.0開發筆記---物理引擎封裝 Physics深入學習

/** 建立一個body mass和moment為預設值 */ static PhysicsBody* create(); /** 建立一個質量為mass的body moment為預設值. */ static PhysicsBody* create(float mass);

cocos2d-x Tests講解四:box2dTest(物理引擎

一、box2d基礎知識 1、關於  Box2D 是一個用於遊戲的 2D 剛體模擬庫。從遊戲的視角來看,物理引擎就是一個程式性動畫(procedural animation)的系統,而不是由動畫師去移動你的物體。 1、核心概念  剛體(rigid body)一塊十分堅硬的物質,它上面的任何兩點之間的

cocos2d-x物理引擎box2d(2)

小滿(bill man)個人原創,歡迎轉載,轉載請註明地址,小滿(bill man)的專欄地址http://blog.csdn.net/bill_man 由於box2d的內容比較多,它也有自己的testbed例子,所以關於比較深入的box2d引擎內容,我準備單開一個專題去研

Cocos2d-x物理引擎使用入門

相關概念 什麼是物理引擎? 科學模型:科學研究中對事物的合理簡化。 物理引擎是一個計算機程式模擬牛頓力學模型,使用質量、速度、摩擦力和空氣阻力等變數。 可以用來預測這種不同情況下的效果。它主要用在科學模擬和電子遊戲中。 一般,物理引擎只負責物理計算,而不進行畫面渲染。

cocos2d-x box2d物理引擎深入研究 第一篇之旋轉關節詳解(b2RevoluteJoint)

對於旋轉關節場常見的包括如下: 滾輪或滾筒鏈條或懸橋(使用多個旋轉聯結器)破布娃娃的關節轉門,彈射器,槓桿建立旋轉關節 建立旋轉關節首先設定b2RevoluteJointDef屬性,然後用世界物件建立之. 然後我們看一堆關於旋轉關節的屬性。 localAnchorA - 基

quick-cocos2d-x 中自帶物理引擎 PhysicsMaterial 恢復力的問題

今天在使用物理引擎過程中,發現不管材質第二個欄位,恢復力是否設定為0,繫結的物件運動異常,例如一個球落到地面上,落到地面後,並沒有靜止,仍然會跳動(可能很輕微,也可能很劇烈)這種情況很大概率出現,但不是必定會出現。例如: 小球部分: local body = cc.Ph

Cocos2d-x教程(17)-Box2D 物理引擎

 歡迎加入 Cocos2d-x 交流群: 193411763 轉載時請註明原文地址: 物理引擎並非每款遊戲的必需品,但它卻可以更好的模擬現實世界的真實感。 此篇文章我們將初步講解Box2D的使用方法。 想要精通Box2D並非簡單的事情,但簡單的使用Box2D卻

例項介紹Cocos2d-x中Box2D物理引擎:碰撞檢測

在Box2D中碰撞事件通過實現b2ContactListener類函式實現,b2ContactListener是Box2D提供的抽象類,它的抽象函式:virtual void BeginContact(b2Contact* contact)。兩個物體開始接觸時會響應,但只調用

cocos2d-x lua 3D模組學習(3)----3D物理引擎

cocos2d-x 3.X封裝的是Bullet的物理引擎使用也是很簡單,精靈繫結剛體,設定為元件,就可以一起運動了,很方便首先場景必須是物理世界的,這在2d還是3d中都是一樣的,不然會黑屏哦    local pScene = cc.Scene:createWithPhysi

Cocos2d-x 3.0中 物理碰撞檢測中onContactBegin回調函數不響應問題

track 後來 which compare mar details egl def trac 好吧,事實上這篇也是暫時冒出來的,近期朋友要做個物理遊戲,曾經做物理還是用box2d,呃。確實要花些功夫才幹搞懂當中的精髓,可是聽講這套引擎又一次封裝了一次。要easy非

Cocos2d-HTML5 開發之一】新建HTML5項目及簡單闡述與cocos2d/x引擎關系

分公司 文件名 真的 參數 部分 cocos2d-x -c js代碼 防止 真的是有一段時間沒寫博了,這段時間呢,發生的事情真的挺多,另外自己呢也閑來做了一些自己的喜歡的東西,主要做的還是基於Mac系統的Cocoa框架的各種編輯器吧。(對了,今年初也出了自己第二本書《