//------------------------------------------------------------------ // // TMXBug987New // //------------------------------------------------------------------ TMXBug987New::TMXBug987New() { auto map = cocos2d::experimental::TMXTiledMap::create("TileMaps/orthogonal-test6.tmx"); addChild(map, 0, kTagTileMap); Size CC_UNUSED s1 = map->getContentSize(); CCLOG("ContentSize: %f, %f", s1.width,s1.height); map->setAnchorPoint(Vec2(0, 0)); auto layer = map->getLayer("Tile Layer 1"); layer->setTileGID(3, Vec2(2,2)); }
bool ChunkManager::setTileGID(int gid, const Vec2 & pos) { auto chunk = getChunk(pos); if (chunk) { chunk->setTileGID(3, pos - chunk->getPosition()); return true; } else { return false; } }
void TMXReadWriteTestNew::repaintWithGID(float dt) { // unschedule:_cmd); auto map = (cocos2d::experimental::TMXTiledMap*)getChildByTag(kTagTileMap); auto layer = (cocos2d::experimental::TMXLayer*)map->getChildByTag(0); auto s = layer->getLayerSize(); for( int x=0; x<s.width;x++) { int y = (int)s.height-1; unsigned int tmpgid = layer->getTileGIDAt( Vec2((float)x, (float)y) ); layer->setTileGID(tmpgid+1, Vec2((float)x, (float)y)); } }
void TMXOrthoFlipRunTimeTestNew::flipIt(float dt) { auto map = (cocos2d::experimental::TMXTiledMap*) getChildByTag(kTagTileMap); auto layer = map->getLayer("Layer 0"); //blue diamond auto tileCoord = Vec2(1,10); int flags; unsigned int GID = layer->getTileGIDAt(tileCoord, (TMXTileFlags*)&flags); // Vertical if( flags & kTMXTileVerticalFlag ) flags &= ~kTMXTileVerticalFlag; else flags |= kTMXTileVerticalFlag; layer->setTileGID(GID ,tileCoord, (TMXTileFlags)flags); tileCoord = Vec2(1,8); GID = layer->getTileGIDAt(tileCoord, (TMXTileFlags*)&flags); // Vertical if( flags & kTMXTileVerticalFlag ) flags &= ~kTMXTileVerticalFlag; else flags |= kTMXTileVerticalFlag; layer->setTileGID(GID ,tileCoord, (TMXTileFlags)flags); tileCoord = Vec2(2,8); GID = layer->getTileGIDAt(tileCoord, (TMXTileFlags*)&flags); // Horizontal if( flags & kTMXTileHorizontalFlag ) flags &= ~kTMXTileHorizontalFlag; else flags |= kTMXTileHorizontalFlag; layer->setTileGID(GID, tileCoord, (TMXTileFlags)flags); }
void TMXReadWriteTestNew::updateCol(float dt) { auto map = (cocos2d::experimental::TMXTiledMap*)getChildByTag(kTagTileMap); auto layer = (cocos2d::experimental::TMXLayer*)map->getChildByTag(0); ////----CCLOG("++++atlas quantity: %d", layer->textureAtlas()->getTotalQuads()); ////----CCLOG("++++children: %d", layer->getChildren()->count() ); auto s = layer->getLayerSize(); for( int y=0; y< s.height; y++ ) { layer->setTileGID(_gid2, Vec2((float)3, (float)y)); } _gid2 = (_gid2 + 1) % 80; }
//------------------------------------------------------------------ // // TMXBug987 // //------------------------------------------------------------------ TMXBug987::TMXBug987() { auto map = TMXTiledMap::create("TileMaps/orthogonal-test6.tmx"); addChild(map, 0, kTagTileMap); Size CC_UNUSED s1 = map->getContentSize(); CCLOG("ContentSize: %f, %f", s1.width,s1.height); auto& children = map->getChildren(); for(const auto &child : children) { auto node = static_cast<TMXLayer*>(child); node->getTexture()->setAntiAliasTexParameters(); } map->setAnchorPoint(Vec2(0, 0)); auto layer = map->getLayer("Tile Layer 1"); layer->setTileGID(3, Vec2(2,2)); }
void FloorMapLayer::pick_up_item_impl(const npc_t& npc, const cocos2d::Vec2& target_pos, const std::function<void()>& callback) { auto npc_layer = _tiled_map->getLayer("npc"); auto item = npc_layer->getTileAt(Vec2(npc.x, 11 - npc.y)); npc_layer->setupTileSprite(item, Vec2(npc.x, 11 - npc.y), npc.gid); auto start_pos = this->convertToNodeSpace(item->getParent()->convertToWorldSpace(item->getPosition())); item->retain(); item->removeFromParentAndCleanup(false); item->setPosition(start_pos); this->addChild(item); item->release(); // TODO.. cocos2d-x tiled bug. 如果一个Layer只剩下一个tile,getTileAt内部设置gid为0不起作用,目前找不到解决办法 npc_layer->setTileGID(999, Vec2(npc.x, 11 - npc.y)); auto duration = item->getPosition().distance(target_pos) / 1000.0f; item->runAction(Sequence::create( Spawn::createWithTwoActions(MoveTo::create(duration, target_pos), ScaleTo::create(duration, 0.6f)), CallFunc::create([item, callback]() { item->removeFromParentAndCleanup(true); callback(); }), nullptr)); }
bool TiledMapLayer::init() { if (Layer::init()) { auto map = TMXTiledMap::create("tiledmap/TestMap.tmx"); map->setAnchorPoint(Vec2(0.0f, 0.0f)); map->setPosition(0, 0); this->addChild(map); auto mapLayer = map->getLayer("layer1"); Size maxSize = mapLayer->getLayerSize(); CCLOG("maplayer maxwidth %f maxheight %f" , maxSize.width,maxSize.height); mapGraph = new GridMap((int)maxSize.width,(int)maxSize.height); for (int row = 0; row < maxSize.width; row++) { for (int col = 0; col < maxSize.height; col++) { int gid = mapLayer->getTileGIDAt(Vec2(row,col)); printf(" %d",gid); if (gid == 10) { mapGraph->setGridVertexType(row, col, vertex_vertex); } } printf("\n"); } Dijkstra dij; dij.Execute(*mapGraph, 10, 39 * ID_PARA + 13); Vertex * vertex = mapGraph->getVertex(39, 13); // AStar dij; // dij.Execute(*mapGraph, 10, 39 * ID_PARA + 13); // Vertex * vertex = mapGraph->getVertex(39, 13); printf("path tree length %lld \n", dij.pathTree.size()); // for (auto it = dij.pathTree.find(vertex) , end = dij.pathTree.end(); it->second != 0&& it != end ; it= dij.pathTree.find(it->second)) { // mapLayer->setTileGID(31, Vec2(vertex->getX(), vertex->getY())); // vertex = it->second; // } auto end = dij.pathTree.end(); while (vertex != nullptr) { mapLayer->setTileGID(31, Vec2(vertex->getX(), vertex->getY())); auto it = dij.pathTree.find(vertex); if (it != end && it->second != nullptr) { vertex = it->second; }else{ vertex = nullptr; } } auto dispatcher = Director::getInstance()->getEventDispatcher(); auto listener = EventListenerTouchOneByOne::create(); listener->onTouchBegan = CC_CALLBACK_2(TiledMapLayer::onTouchBegan, this); listener->onTouchMoved = CC_CALLBACK_2(TiledMapLayer::onTouchMoved, this); listener->onTouchEnded = CC_CALLBACK_2(TiledMapLayer::onTouchEnded, this); dispatcher->addEventListenerWithSceneGraphPriority(listener, this); return true; } return false; }
// TMXLayer - adding / remove tiles void TMXLayer::setTileGID(int gid, const Point& pos) { setTileGID(gid, pos, (ccTMXTileFlags)0); }
// TMXLayer - adding / remove tiles void TMXLayer::setTileGID(uint32_t gid, const Vec2& pos) { setTileGID(gid, pos, (TMXTileFlags)0); }
// TMXLayer - adding / remove tiles void TMXLayer::setTileGID(int gid, const Vec2& tileCoordinate) { setTileGID(gid, tileCoordinate, (TMXTileFlags)0); }
void MapModel::troopDelete(Troop *target){ CC_ASSERT(target != nullptr); setTileGID(target->getCoord(), target->getZ(), target->getOccupy().X, target->getOccupy().Y, EMPTY_TILE); PlayerManager::getInstance()->getAtkPlayer()->removeTroop(target); _troops.eraseObject(target); }
void MapModel::buildingDelete(Building *target){ CC_ASSERT(target != nullptr); setTileGID(target->getCoord(), target->getZ(), target->getOccupy().X, target->getOccupy().Y, EMPTY_TILE); PlayerManager::getInstance()->getDefPlayer()->removeBuilding(target); _buildings.eraseObject(target); }
bool FloorMapLayer::init(int floor, bool up) { _floor = floor; // 由于直接继承自node,需要做一些处理,现在layer的功能全被废弃了,无意义 setContentSize(Director::getInstance()->getWinSize()); auto listener = EventListenerTouchOneByOne::create(); listener->setSwallowTouches(true); listener->onTouchBegan = CC_CALLBACK_2(FloorMapLayer::onTouchBegan, this); listener->onTouchEnded = CC_CALLBACK_2(FloorMapLayer::onTouchEnded, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); // 加载地图编辑器文件 auto res = "TileMaps/floor00" + String::createWithFormat("%d", floor)->_string + ".tmx"; _tiled_map = cocos2d::experimental::TMXTiledMap::create(res); if (nullptr != _tiled_map) { _tiled_map->setPosition(Vec2(-50.0f, -50.0f)); this->addChild(_tiled_map); } auto npc_layer = _tiled_map->getLayer("npc"); auto npc_layer_size = npc_layer->getLayerSize(); auto npc_tiles = npc_layer->getTiles(); std::vector<Floor::npc_t> npcs; for (uint32_t i = 0; i < (uint32_t)(npc_layer_size.height); ++i) { for (uint32_t j = 0; j < (uint32_t)(npc_layer_size.width); ++j) { int32_t gid = (int32_t)(npc_tiles[i * (uint32_t)(npc_layer_size.width) + j]); if (gid != 0) { const Floor::floor_t& floor = Floor::GetInstance()->get_floor_info(_floor); Floor::npc_t npc(j, npc_layer_size.height - 1 - i, gid); if (floor.is_valid()) { auto iter = std::find(floor.npcs.begin(), floor.npcs.end(), npc); if (iter == floor.npcs.end()) { npc_layer->setTileGID(999, Vec2(j, i)); } } npcs.push_back(npc); if (get_tile_prop(gid, "style").asInt() == 6) { if (get_tile_prop(gid, "type").asInt() == 2) _stair_up = npcs.back(); else _stair_down = npcs.back(); } } } } Floor::GetInstance()->auto_init_floor(_floor, npcs); // 路径节点 _road_node = Node::create(); if (nullptr != _road_node) { _road_node->setPosition(Vec2::ZERO); this->addChild(_road_node); } // 勇士骨骼动画节点 _warrior = WarriorNode::create(); /*cocostudio::CCBone* bone = _warrior->getBone("sheild1"); int index = bone->getDisplayManager()->getCurrentDisplayIndex(); bone->removeDisplay(1); bone->changeDisplayByIndex(-1, true); cocostudio::CCBone* bone2 = _warrior->getBone("sheild2"); index = bone2->getDisplayManager()->getCurrentDisplayIndex(); bone2->removeDisplay(1); bone2->changeDisplayByIndex(-1, true);*/ Floor::position_t pos = up ? _stair_down.pos : _stair_up.pos; _warrior->setPosition(Vec2((pos.x + 0.5f) * 75.0f - 50.0f, (pos.y + 0.5f) * 75.0f - 50.0f)); this->addChild(_warrior); // 上方背景 auto inside_bg = Sprite::create("Images/bg_top2.png"); auto outside_bg = Sprite::create("Images/bg_top_1.png"); if (nullptr != outside_bg && nullptr != inside_bg) { auto win_size = Director::getInstance()->getWinSize(); outside_bg->setScale(inside_bg->getContentSize().width / outside_bg->getContentSize().width); outside_bg->setPosition(Vec2(win_size.width / 2, 1092.0f)); this->addChild(outside_bg); inside_bg->setPosition(Vec2(win_size.width / 2, 1076.0f)); this->addChild(inside_bg); } // 点击箭头节点 _arrow_node = ArrowNode::create(); if (nullptr != _arrow_node) { _arrow_node->setPosition(Vec2::ZERO); _arrow_node->setVisible(false); this->addChild(_arrow_node); } // 勇士属性面板 _info_panel = WarriorInfoPanel::create(); if (nullptr != _info_panel) { _info_panel->setPosition(Vec2(-10.0f, 825.0f)); this->addChild(_info_panel); } return true; }