日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cocos2d-x3.x实现屏幕画线并添加刚体属性

發布時間:2023/12/14 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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**均賦值為該值。
bool PhysicWorld::onTouchBegan(Touch *touch, Event *unused_event){Point location = touch->getLocation();pre_point = cur_point = location;return true; }
  • onTouchMoved?: 同樣首先獲得在屏幕滑動時經過的點的坐標,并計算其與上一個點之間的距離。當距離的平方大于 25 時將?pre_point?和?cur_point?分別賦值到結構體seg的?p1?和?p2?中,并將seg變量存儲到std::vector中。
void PhysicWorld::onTouchMoved(Touch *touch, Event *unused_event){Point location = touch->getLocation();cur_point = location;if((pre_point - cur_point).getLengthSq()>25){seg.p1=pre_point;seg.p2=cur_point;segment.push_back(seg);pre_point=cur_point;} }
  • 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实现屏幕画线并添加刚体属性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。