cocos2d_x_02_使用內建物理引擎,cocos2d_x_02引擎
最終:
一、建立工程進入cocos2d-x的tools下的bin目錄:/Users/beyond/Desktop/cocos2d-x/cocos2d-x-3.3beta0/tools/cocos2d-console/bin目錄
開啟終端,切換到上述bin目錄
使用cocos命令,建立工程,格式如下:
cocos new 工程名 -p 包名 -l 語言 -d 目標檔案夾,
- 例如 :
cocos new 01_cocos2d-x-p com.beyond-l cpp -d /Users/beyond/Desktop/cocos2d-x/cocos2d-x學習
進入建立好的工程目錄,開啟工程
二、BallScene.h,實質是繼承自Layer
//// BallScene.h// 01_cocos2d-x//// Created by beyond on 14-10-3.////#ifndef ___1_cocos2d_x__BallScene__#define ___1_cocos2d_x__BallScene__#include "cocos2d.h"USING_NS_CC;// 注意 這兒,繼承的是 Layerclass BallScene : public cocos2d::Layer{private: // 螢幕尺寸 Size winSize;public: // c++裡面沒有id類型, 所以 返回類的執行個體對象的 指標 static cocos2d::Scene* createScene(); // 以下是 不同點:cocos2d-x的 'init' 方法 返回 bool // 而cocos2d-iphone 返回 'id' 類型 virtual bool init(); // 宏 自動實現 "靜態 create()方法" CREATE_FUNC(BallScene); // 重寫一個方法 virtual void onEnter(); // 自訂方法,建立一個應用程式邊界 void addBoundry(); // 自訂方法,添加一個ball void addBall(float x,float y); // 自訂方法,添加一個ball void addBall(Vec2 point); };#endif /* defined(___1_cocos2d_x__BallScene__) */
三、
BallScene.cpp類實現
//// BallScene.cpp// 01_cocos2d-x//// Created by beyond on 14-10-3.#include "BallScene.h"USING_NS_CC;Scene* BallScene::createScene(){ // 'scene' 自動釋放 // 重點,建立一個,具有物理引擎世界的scene auto scene = Scene::createWithPhysics(); // 重點,繪製調試資訊 scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL); // 'layer' 自動釋放 auto layer = BallScene::create(); // 將圖層 添加到情境中 scene->addChild(layer); // 返回 填充好圖層的 情境 return scene;}// 在 "init" 方法中,執行個體化自己要用的精靈對象bool BallScene::init(){ // 1. 調用父類的init , cpp 沒有super,直接寫父類名 if ( !Layer::init() ) return false; // 螢幕尺寸 winSize = Director::getInstance()->getVisibleSize(); // cocos2d-3.x 可以快速建立 物理body // setPhysicsBody(<#cocos2d::PhysicsBody *body#> return true;}#pragma mark - 重寫父類方法void BallScene::onEnter(){ // 1、先執行父類的onEnter Layer::onEnter(); // 2、調用 自訂方法,建立一個應用程式邊界 addBoundry(); // 3、調用 自訂方法,添加一個ball addBall(winSize.width/2,winSize.height/2); // 4、執行個體化一個觸摸監聽器 對象 auto listener = EventListenerTouchOneByOne::create(); // 當觸摸開始時,綁定一個閉包函數; // 【】表示 要傳入的外界對象,此處是this // ()表示參數 listener->onTouchBegan = [this](Touch *t,Event *e){ // 點擊就建立一個Ball // getLocation 返回一個OpenGL座標 this->addBall(t->getLocation()); return false; }; // 5、擷取事件分發器,添加一個事件監聽器,到this身上;即監聽的是this對象【整個圖層Layer】 Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this); }#pragma mark - 自訂方法// 自訂方法,建立一個應用程式邊界void BallScene::addBoundry(){ // 指定size,建立一個物理body auto b2Body = PhysicsBody::createEdgeBox(winSize,PHYSICSBODY_MATERIAL_DEFAULT,5); // 建立一個顯示用的精靈 auto boundry = Node::create(); boundry->setPosition(winSize.width/2, winSize.height/2); // 為精靈 設定物理body boundry->setPhysicsBody(b2Body); // 添加精靈到當前 Layer this->addChild(boundry);}// 自訂方法,添加一個ballvoid BallScene::addBall(float x,float y){ auto ball = Sprite::create("ball.png"); ball->setPosition(x,y); // 指定size,建立一個物理body auto b2Body = PhysicsBody::createBox(ball->getContentSize()); // 為精靈 設定物理body ball->setPhysicsBody(b2Body); // 添加精靈到當前 Layer this->addChild(ball);}// 自訂方法,添加一個ballvoid BallScene::addBall(Vec2 point){ addBall(point.x, point.y);}
Chipmunk物理引擎一個物體跟隨滑鼠移動的例子,最好在cocos2d-x-js下
沒有研究過這個物理引擎,不過我猜可能是你編寫的時候調用函數有問題吧,根據你說的,目測你是不是調用的點下滑鼠左鍵的功能函數,沒有調用滑鼠左鍵抬起的函數?你如果只調用了滑鼠按下的函數,那勢必會當你點擊對象的時候就會產生物理運算。猜的,我也不確定,畢竟沒有用過。
怎用Xcode工具,在cocos2d-x架構中添加Box2D物理引擎?
樓主遇到“can‘t find file”錯誤嗎?這個錯誤我糾結了很久,Search Path裡面該設定的都設定了,所有.m檔案都改成.mm,就是一直報錯,搜過N個貼都是說這樣設定就可以用,可我就沒有成功build過啊,求樓主搭救,萬分感謝