cocos2d-x3.x实现屏幕画线并添加刚体属性
為了方便理解,本文分為如下兩部分:
- 實現屏幕畫線
- 為線段添加剛體屬性
實現屏幕畫線
效果預覽
涉及內容
- 觸摸機制
- 線段繪制方法
創建 PhysicWorld 類
在頭文件**PhysicWorld.h**中加入以下代碼:
#include "cocos2d.h" USING_NS_CC; struct _segment{Point p1;Point p2; }; class PhysicWorld : public Layer { public:virtual bool init();static Scene* createScene();CREATE_FUNC(PhysicWorld); virtual bool onTouchBegan(Touch *touch, Event *unused_event);virtual void onTouchMoved(Touch *touch, Event *unused_event);virtual void onTouchEnded(Touch *touch, Event *unused_event);virtual void onTouchCancelled(Touch *touch, Event *unused_event);virtual void draw(); private:Point pre_point;Point cur_point;_segment seg;std::vector<_segment> segment; };其中聲明了一個結構體?_segment?(線段),顧名思義此結構體用于記錄線段的兩個端點,以便后續繪制線段的過程。
因為我們需要利用觸摸事件自定義繪制線段的方法,故重載了父類的**onTouchBegan, onTouchMoved, draw**等方法,具體實現過程下文詳解。
觸摸響應
關于**“3.x新觸摸機制”**,可參考Testcpp中相應源碼,同時網絡上也有很多博文可供學習,此處便不再贅述其原理。
首先,我們需要添加一個觸摸監聽。觸摸監聽的創建方式有兩種:
- EventListenerTouchOneByOne 單點觸摸
- EventListenerTouchAllAtOnce 多點觸摸
此處我們選擇?EventListenerTouchOneByOne
auto touch_listener = EventListenerTouchOneByOne::create();接下來我們通過監聽器監聽相應事件,并回調相應方法,如下:
touch_listener->setSwallowTouches(true); touch_listener->onTouchBegan = CC_CALLBACK_2(PhysicWorld::onTouchBegan, this); touch_listener->onTouchMoved = CC_CALLBACK_2(PhysicWorld::onTouchMoved, this); touch_listener->onTouchEnded = CC_CALLBACK_2(PhysicWorld::onTouchEnded, this); touch_listener->onTouchCancelled = CC_CALLBACK_2(PhysicWorld::onTouchCancelled, this);將事件監聽器加入到事件調度中:
_eventDispatcher->addEventListenerWithSceneGraphPriority(touch_listener, this);相應事件的回調方法:
- onTouchBegan?: 首先獲取觸摸點的坐標,并將上一次觸摸點坐標**pre_point**和當前觸摸坐標**cur_point**均賦值為該值。
- onTouchMoved?: 同樣首先獲得在屏幕滑動時經過的點的坐標,并計算其與上一個點之間的距離。當距離的平方大于 25 時將?pre_point?和?cur_point?分別賦值到結構體seg的?p1?和?p2?中,并將seg變量存儲到std::vector中。
- onTouchEnded?: 同上。
最后我們在析構函數中刪除觸摸監聽:
_eventDispatcher->removeEventListeners(EventListener::Type::TOUCH_ONE_BY_ONE);繪制
cocos2dx 繪制基本圖元可參考博文,但在3.x中相應接口有所改變,筆者將整理一篇文章出來供大家參考。
此處,我們在成員函數draw的函數體中實現自己的繪制方法:
void PhysicWorld::draw(){ DrawPrimitives::setDrawColor4B(0, 255, 255, 255);glLineWidth(4);for (std::vector<_segment >::const_iterator i=segment.begin(); i!=segment.end(); i++){DrawPrimitives::drawLine(i->p1, i->p2);} }有上述代碼很容易看出,首先是設置繪制顏色和線條寬度。
然后再通過循環取出存儲在vector中的線段值,依次進行繪制。
為線段添加剛體屬性
效果預覽
涉及內容
- 創建物理世界
- 添加剛體
創建 PhysicWorld 類
當然你完全可以在上一篇文章所編寫的代碼的基礎上進行修改,實際上筆者也正是這么做的。
在頭文件**PhysicWorld.h**中添加如下內容(省略部分可參考本文的上部分):
class PhysicWorld : public Layer { public:... ...void setPhysicsWorld(PhysicsWorld* world){_world = world;}... ... private:... ...PhysicsWorld* _world;... ... };實現過程
1. 創建物理世界
關于3.x 新物理特性的內容?泰然網?有兩篇文章可供參考?在cocos2d-x 3.0中使用物理引擎?和?利用Cocos2dx-3.0新物理特性模擬彈珠迷宮
首先我們創建物理世界:
在**static Scene* createScene();**的實現方法中添加如下代碼:
Scene* PhysicWorld::createScene() {auto scene = Scene::createWithPhysics();auto layer = PhysicWorld::create();layer->setPhysicsWorld(scene->getPhysicsWorld());scene->addChild(layer);return scene; }通過?createWithPhysics()?方法創建一個帶有物理效果的場景對象,并且在此場景中添加當前層。
為了方便后續的開發,我們可在上述方法中添加如下一句代碼,開啟debugDraw來繪制出剛體:
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);2. 繪制線條剛體
在成員函數draw方法的for循環里添加如下代碼:
lineBody = PhysicsBody::createEdgeSegment(i->p1, i->p2); edgeNode = Node::create(); edgeNode->setPhysicsBody(lineBody); addChild(edgeNode);再次運行程序,通過繪制即可獲取本文首部所示的圖片,相較于本文的第一張效果圖字體中多了紅色。
這也正是我打開debugDraw的原因,紅色的線條表明了我們的線段已經具備了剛體屬性。
源碼可從github獲取,將其加入你的Classes文件夾中。
總結
現在我們已經實現了實時繪制線條剛體,想象一下,如果這個時候我們在場景中添加一個剛體小球,是否就能使得我們的小球按照我們實時繪制的線條軌跡滾動呢?
當然可以了,這也是筆者接下來準備做的事情。
總結
以上是生活随笔為你收集整理的cocos2d-x3.x实现屏幕画线并添加刚体属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 下载链接|从CAD2004到CAD202
- 下一篇: shiro权限拦截失效