知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
cocos2dx3.3tilemap縮放滑動并且準(zhǔn)確點擊對象
發(fā)表時間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):68
之前已經(jīng)有一篇更基本的tilemap標(biāo)記了,這兩天用了下3.3的tilemap發(fā)明以前有些器械又套用不了。所以又寫了一篇札記,立時感到本身萌萌噠。
完全沒有玩過的童鞋可以看看基本篇
2. 可以或許鼠標(biāo)滑動 tiledMap
3. 在縮放和滑動的情況下,點擊一個tile 可以或許斷定出 實際的格子坐標(biāo)。
縮放和滑動這里就不再具體說清楚明了,有很多的例子,末尾呈上完全代碼。重要說一下第三條的實現(xiàn)。
1. 可以或許3倍縮放tiledMap
可以大年夜圖中看出,我建了一個points對象組,然后建立了兩個對象 startPos 和endPos
startPos 大年夜概覆蓋了 4個tiled [0,24] [1,24] [0,25] [1,25]
并且給startPos設(shè)置了一個 自定義屬性:id 。我須要的就是點擊到 膳綾擎4塊tiled的時刻可以或許 獲取到這個對象的id值。
[img]http://img.blog.csdn.net/20150105004528937?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ29vZGV2ZW5pbmdiYWJ5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center [img]http://img.blog.csdn.net/20150105004535239
1. 把tilemapLayer的坐標(biāo)作為偏移量
[img]http://img.blog.csdn.net/20150105004540028
void HelloWorld::parseTileMap() { CCLOG("parseTileMap"); if(_tiledMap == NULL) return; _objectsGroup = _tiledMap->getObjectGroup("points"); //tileX 0 tileY 24 ValueMap startPos = _objectsGroup->getObject("startPos"); std::string name = startPos["name"].asString(); float pointX = startPos["x"].asFloat(); float pointY = startPos["y"].asFloat();; float PointWidth = startPos["width"].asFloat(); float PointHeight = startPos["height"].asFloat(); Size winSize = Director::getInstance()->getWinSize(); Point mapPoint = _tiledMap->getPosition(); Point centerPos = covertTiledPointToCenterPoint(Point(0,24)); Point tilePos = covertPointToTiledPoint(Point(pointX,pointY)); Point tilePos2 = covertPointToTiledPoint(centerPos); }
很順利的拿到startPos對象的 pointX 和 pointY , 然則值倒是 (0,296) , 不是等待的(1,768) 溘然有點紛亂 -_- !!了。
直到看了一下源碼TMXLayer 的getPositionAt才發(fā)明,本來這個(0,296) 是已經(jīng)經(jīng)由 “分辨率轉(zhuǎn)換“了。
重要實現(xiàn)目標(biāo):
Vec2 TMXLayer::getPositionAt(const Vec2& pos) { Vec2 ret = Vec2::ZERO; switch (_layerOrientation) { case TMXOrientationOrtho: ret = getPositionForOrthoAt(pos); break; case TMXOrientationIso: ret = getPositionForIsoAt(pos); break; case TMXOrientationHex: ret = getPositionForHexAt(pos); break; case TMXOrientationStaggered: ret = getPositionForStaggeredAt(pos); break; } CCLOG("%f,%f,%f",ret.x,ret.y,CC_CONTENT_SCALE_FACTOR()); <span style="color:#ff0000;"> ret = CC_POINT_PIXELS_TO_POINTS( ret );</span> return ret; }
看一下宏的定義:
/** @def CC_POINT_PIXELS_TO_POINTS Converts a rect in pixels to points */ #define CC_POINT_PIXELS_TO_POINTS(__pixels__) Vec2( (__pixels__).x / CC_CONTENT_SCALE_FACTOR(), (__pixels__).y / CC_CONTENT_SCALE_FACTOR()) /** @def CC_CONTENT_SCALE_FACTOR On Mac it returns 1; On iPhone it returns 2 if RetinaDisplay is On. Otherwise it returns 1 */ #define CC_CONTENT_SCALE_FACTOR() Director::getInstance()->getContentScaleFactor()
大年夜源碼可以看到:
1 . 我們可以肯定的是tilemap 膳綾擎 pixel : point 的比例是 1 : 1, 而設(shè)備膳綾擎卻并不必定。
mac 設(shè)備膳綾擎 pixel : point = 1: 1 , iphone Retina 是 2 : 1, 低分辨率就會更大年夜。我們就把這個比值像素尺寸因子吧
2. 經(jīng)由過程 CC_POINT_PIXELS_TO_POINTS 可以或許把 tilemap膳綾擎的坐標(biāo)值轉(zhuǎn)換成 設(shè)備膳綾擎的坐標(biāo)值。
3. 這個setScale getScale做的昵嚕似的工作,然則要區(qū)分開來計算。
此外,因為我們的tilemap可以滑動點擊,所以在大年夜觸摸點綴換 tilemap絕對坐標(biāo)的時刻須要額外做兩點:
起首寫了個函數(shù)來讀地圖對象
bool HelloWorld::onTouchBegan(Touch *touch, Event *event) { CCLOG("HelloWorld::onTouchBegan"); Point touchPoint = touch->getLocation(); Point mapPoint = _tiledMap->getPosition(); <span style="color:#ff0000;">Point realPoint = touchPoint - mapPoint;</span> Point tilePoint = covertPointToTiledPoint(realPoint); CCLOG("tilePoint x:%f y:%f",tilePoint.x,tilePoint.y); tryGetObjectPropertyByPosition(realPoint); return true; }
2. 乘以縮放系數(shù)
//參數(shù):觸摸坐標(biāo) string HelloWorld::tryGetObjectPropertyByPosition(Point position) { float scale = _tiledMap->getScale(); float factor = CC_CONTENT_SCALE_FACTOR(); <span style="color:#ff0000;"> float realPointX = position.x / scale; float realPointY = position.y / scale;</span> for (auto item : _objectsGroup->getObjects()) { ValueMap curObject = item.asValueMap(); float pointX = curObject["x"].asFloat(); float pointY = curObject["y"].asFloat();; float PointWidth = curObject["width"].asFloat(); float PointHeight = curObject["height"].asFloat(); if(realPointX >= pointX and realPointX <= pointX + PointWidth and realPointY >= pointY and realPointY <= pointY + PointHeight) { string objectId = curObject["id"].asString(); CCLOG("HelloWorld:tryGetObjectPropertyByPosition: %s",objectId.c_str()); return objectId; } } return ""; }
接下來再逆推一下大年夜 觸摸點 轉(zhuǎn)換到 tilemapPoint 的辦法就異常簡單了
Point HelloWorld::covertTiledPointToCenterPoint(Point p) { float scale = _tiledMap->getScale(); float factor = CC_CONTENT_SCALE_FACTOR(); CCLOG("HelloWorld::covertTiledPointToCenterPoint scale:%f factor:%f",scale,factor); int offsetX = _tiledMap->getTileSize().width / (2 * factor); int offsetY = _tiledMap->getTileSize().height / (2 * factor); TMXLayer* layer = _tiledMap->layerNamed("background"); Point point = layer->getPositionAt(p); point = Point(point.x + offsetX,point.y - offsetY); point = Point(point.x * scale, point.y * scale); return point; }
源碼
相關(guān)案例查看更多
相關(guān)閱讀
- 云南網(wǎng)站建設(shè)哪家好
- 云南網(wǎng)站建設(shè)靠譜公司
- 云南小程序開發(fā)
- web前端
- 網(wǎng)站建設(shè)需要多少錢
- 買小程序被騙
- 軟件開發(fā)
- 昆明小程序代建
- 汽車報廢
- 搜索排名
- 汽車報廢管理系統(tǒng)
- 云南網(wǎng)站建設(shè)公司
- 商標(biāo)注冊
- 昆明軟件公司
- 微信分銷系統(tǒng)
- 報廢車回收管理軟件
- 貴州小程序開發(fā)
- 云南旅游網(wǎng)站建設(shè)
- 網(wǎng)站建設(shè)選
- 云南網(wǎng)站建設(shè)一條龍
- 花農(nóng)小程序
- 云南網(wǎng)絡(luò)營銷
- 公眾號模板消息
- 云南軟件定制
- 微分銷
- 報廢車管理
- 網(wǎng)站建設(shè)
- 定制小程序開發(fā)
- 小程序開發(fā)課程
- 云南網(wǎng)站設(shè)計