specify
/'spesɪfaɪ/
指定;列举;详细说明
点击符号”>>"—编辑地图信息---增加地形类型-将”新地形"改名为t 如果编辑错了必须要点击下“清除” 再点击“清除”才能继续绘图 选中的那个图块也要涂抹上-----close
在地图中画新图形t
地图—Map Properties—点击右下角”+“—输入type—输入”我是地图属性“
选中右上角的 scene —此时右下角显示为Tile Layer 点击”+“—输入type—输入”我是图层属性“
图块—选中第一块图块-此时右下角显示为ID 0 点击”+“—输入type—输入”我是图块属性“
点击 scene下面的“添加对象层”—输入object—选择“插入矩形”---选择“插入椭圆形”--选择“编辑多边形”—在右下角名称输入 player 选中矩形区域 在右下角名称输入 color
给player-- 点击”+“—输入type—输入”我是对象属性“
保存在桌面 map
Xcode—单击map.tmx
在player所在的图块(ID33)上添加属性move 输入”true“ 表示player在该图快上是可以移动的
保存新地图,将Xcode中原来的地图删掉,添加新地图到Xcode
auto
map =
TMXTiledMap
::
create
(
"map.tmx"
);
addChild (map);
//map 属性是一个字典
auto maProperties = map-> getProperties ();
// 传入一个 key 也就是 type
auto str =maProperties[ "type" ]. asString ();
CCLOG ( "map pro:%s" ,str. c_str ());
// 获取图层属性
addChild (map);
//map 属性是一个字典
auto maProperties = map-> getProperties ();
// 传入一个 key 也就是 type
auto str =maProperties[ "type" ]. asString ();
CCLOG ( "map pro:%s" ,str. c_str ());
// 获取图层属性
auto sceneLayer = map->getLayer("scene");
auto
layerProperties = sceneLayer->
getProperties
();
CCLOG ( "scene pro:%s" ,layerProperties[ "type" ]. asString (). c_str ());
// 获取图块属性
// ID 为 1 返回值为 value 类型 这里需要转换为 ValueMap 类型
auto tilePro = map-> getPropertiesForGID ( 1 ). asValueMap ();
CCLOG ( "tile pro:%s" ,tilePro[ "type" ]. asString (). c_str ());
// 获取对象属性
auto objectGroup = map-> getObjectGroup ( "object" );
auto obj = objectGroup-> getObject ( "player" );
CCLOG ( "tile pro:%s" ,obj[ "type" ]. asString (). c_str ());
// 修改指定区域的颜色
auto colorObj = objectGroup-> getObject ( "color" );
CCLOG ( "tile pro:%s" ,colorObj[ "type" ]. asString (). c_str ());
auto colorObjX = colorObj[ "x" ]. asInt ()/ 32 ;
auto colorObjY = colorObj[ "y" ]. asInt ()/ 32 ;
auto colorObjW = colorObj[ "width" ]. asInt ()/ 32 ;
CCLOG ( "scene pro:%s" ,layerProperties[ "type" ]. asString (). c_str ());
// 获取图块属性
// ID 为 1 返回值为 value 类型 这里需要转换为 ValueMap 类型
auto tilePro = map-> getPropertiesForGID ( 1 ). asValueMap ();
CCLOG ( "tile pro:%s" ,tilePro[ "type" ]. asString (). c_str ());
// 获取对象属性
auto objectGroup = map-> getObjectGroup ( "object" );
auto obj = objectGroup-> getObject ( "player" );
CCLOG ( "tile pro:%s" ,obj[ "type" ]. asString (). c_str ());
// 修改指定区域的颜色
auto colorObj = objectGroup-> getObject ( "color" );
CCLOG ( "tile pro:%s" ,colorObj[ "type" ]. asString (). c_str ());
auto colorObjX = colorObj[ "x" ]. asInt ()/ 32 ;
auto colorObjY = colorObj[ "y" ]. asInt ()/ 32 ;
auto colorObjW = colorObj[ "width" ]. asInt ()/ 32 ;
auto colorObjH = colorObj["height"].asInt()/32;
//
在
Tiled
中
Y
轴是向下的,而
cocos2d-x
中
Y
轴是向上的
//
将
color
区域全部变成红色
for
(
int
x = colorObjX; x < colorObjX+colorObjW; x++) {
for ( int y = colorObjY; y < colorObjY+colorObjH; y++) {
// 在 Tiled 中 Y 轴是向下的,而 cocos2d-xY 轴是向上的所以用 map->getMapSize().height-y 代替 y
auto sprite = sceneLayer-> getTileAt ( Vec2 (x, map-> getMapSize (). height -y));
sprite-> setColor ( Color3B ( 255 , 0 , 0 ));
}
}
// 加载小球
auto player = Sprite :: create ( "c.png" );
player-> setPosition (obj[ "x" ]. asFloat (), obj[ "y" ]. asFloat ());
addChild (player);
auto eventListener = EventListenerTouchOneByOne :: create ();
eventListener-> onTouchBegan = [map,sceneLayer,player]( Touch * touch, Event *event){
auto point = map-> convertToNodeSpace (touch-> getLocation ());
point. x = static_cast < int >(point. x / 32 );
//MapSize().height 图块的高度是从 1 开始的所以需要减去 1 ; point 的高度是从 0 开始的
point. y = map-> getMapSize (). height - static_cast < int >(point. y / 32 )- 1 ;
auto t = sceneLayer-> getTileAt (point);
// t->setColor(Color3B(255,0,0));
// 获取该位置的图块 ID
auto gid = sceneLayer-> getTileGIDAt (point);
auto p = map-> getPropertiesForGID (gid). asValueMap ();
if (p[ "move" ]. isNull ()!= true && p[ "move" ]. asBool () == true ) {
player-> setPosition (t-> getPosition (). x ,t-> getPosition (). y );
}
return false ;
};
for ( int y = colorObjY; y < colorObjY+colorObjH; y++) {
// 在 Tiled 中 Y 轴是向下的,而 cocos2d-xY 轴是向上的所以用 map->getMapSize().height-y 代替 y
auto sprite = sceneLayer-> getTileAt ( Vec2 (x, map-> getMapSize (). height -y));
sprite-> setColor ( Color3B ( 255 , 0 , 0 ));
}
}
// 加载小球
auto player = Sprite :: create ( "c.png" );
player-> setPosition (obj[ "x" ]. asFloat (), obj[ "y" ]. asFloat ());
addChild (player);
auto eventListener = EventListenerTouchOneByOne :: create ();
eventListener-> onTouchBegan = [map,sceneLayer,player]( Touch * touch, Event *event){
auto point = map-> convertToNodeSpace (touch-> getLocation ());
point. x = static_cast < int >(point. x / 32 );
//MapSize().height 图块的高度是从 1 开始的所以需要减去 1 ; point 的高度是从 0 开始的
point. y = map-> getMapSize (). height - static_cast < int >(point. y / 32 )- 1 ;
auto t = sceneLayer-> getTileAt (point);
// t->setColor(Color3B(255,0,0));
// 获取该位置的图块 ID
auto gid = sceneLayer-> getTileGIDAt (point);
auto p = map-> getPropertiesForGID (gid). asValueMap ();
if (p[ "move" ]. isNull ()!= true && p[ "move" ]. asBool () == true ) {
player-> setPosition (t-> getPosition (). x ,t-> getPosition (). y );
}
return false ;
};
_eventDispatcher->addEventListenerWithSceneGraphPriority(eventListener, map);