void RPGMapSceneLayer::ccTouchEnded(CCTouch* touch, CCEvent* event) { if(this->m_touchedDialogNPC) { CCTMXTiledMap *bgMap = (CCTMXTiledMap*)this->getChildByTag(kRPGMapSceneLayerTagBgMap); CCPoint point = touch->getLocation(); point = bgMap->convertToNodeSpace(point); if(this->m_touchedDialogNPC->boundingBox().containsPoint(point)) { this->m_touchedDialogNPC->stopAutoMove(); //暂时停止自动移动 this->enabledControl(false); string content = this->m_touchedDialogNPC->m_content->getCString(); RPGMapDialogLayer *dialogLayer = RPGMapDialogLayer::create(this->m_stringList, &this->m_db, this->m_touchedDialogNPC); this->addChild(dialogLayer); CCMenu *mainMenu = (CCMenu*)bgMap->getChildByTag(kRPGMapSceneLayerTagMainMenu); mainMenu->setVisible(false); //player和NPC互相对着 RPGMapRoleSprite *player = (RPGMapRoleSprite*)bgMap->getChildByTag(kRPGMapSceneLayerTagPlayer); switch (this->m_dialogDirection) { case kRPGMapSceneLayerDialogDirectionUp: { player->setDirection(kRPGMapRoleSpriteDirectionDown); this->m_touchedDialogNPC->setDirection(kRPGMapRoleSpriteDirectionUp); } break; case kRPGMapSceneLayerDialogDirectionDown: { player->setDirection(kRPGMapRoleSpriteDirectionUp); this->m_touchedDialogNPC->setDirection(kRPGMapRoleSpriteDirectionDown); } break; case kRPGMapSceneLayerDialogDirectionLeft: { player->setDirection(kRPGMapRoleSpriteDirectionRight); this->m_touchedDialogNPC->setDirection(kRPGMapRoleSpriteDirectionLeft); } break; case kRPGMapSceneLayerDialogDirectionRight: { player->setDirection(kRPGMapRoleSpriteDirectionLeft); this->m_touchedDialogNPC->setDirection(kRPGMapRoleSpriteDirectionRight); } break; default: break; } } } this->m_touchedDialogNPC = NULL; this->m_dialogDirection = kRPGMapSceneLayerDialogDirectionNone; }
bool RPGMapSceneLayer::ccTouchBegan(CCTouch* touch, CCEvent* event) { CCTMXTiledMap *bgMap = (CCTMXTiledMap*)this->getChildByTag(kRPGMapSceneLayerTagBgMap); RPGMapRoleSprite *player = (RPGMapRoleSprite*)bgMap->getChildByTag(kRPGMapSceneLayerTagPlayer); //循环判断点击了哪一个NPC,如果有点中则m_isTouchedNPC为true for (int i = 0; i < bgMap->getChildren()->count(); i++) { CCObject *item = bgMap->getChildren()->objectAtIndex(i); if(dynamic_cast<RPGMapRoleSprite*>(item) != NULL) { RPGMapNPCRoleSprite *npc = (RPGMapNPCRoleSprite*)item; if(npc->m_type == kRPGMapRoleSpriteTypeNPC) { //判断player是否存在该NPC的四个方向(距离为一格),存在则为true bool exist = false; if(player->getPosition().equals(ccpAdd(npc->getPosition(), ccp(0, GAME_TMX_ROLE_HEIGHT)))) { //上 exist = true; this->m_dialogDirection = kRPGMapSceneLayerDialogDirectionUp; } else if(player->getPosition().equals(ccpAdd(npc->getPosition(), ccp(0, -GAME_TMX_ROLE_HEIGHT)))) { //下 exist = true; this->m_dialogDirection = kRPGMapSceneLayerDialogDirectionDown; } else if(player->getPosition().equals(ccpAdd(npc->getPosition(), ccp(-GAME_TMX_ROLE_WIDTH, 0)))) { //左 exist = true; this->m_dialogDirection = kRPGMapSceneLayerDialogDirectionLeft; } else if(player->getPosition().equals(ccpAdd(npc->getPosition(), ccp(GAME_TMX_ROLE_WIDTH, 0)))) { //右 exist = true; this->m_dialogDirection = kRPGMapSceneLayerDialogDirectionRight; } if(exist) { CCPoint point = touch->getLocation(); point = bgMap->convertToNodeSpace(point); if(npc->boundingBox().containsPoint(point)) { this->m_touchedDialogNPC = npc; break; } } } } } //如果是点中了NPC则进入ccTouchEnded的处理 if(this->m_touchedDialogNPC) return true; else { //传入到摇杆的事件处理 CCMenu *mainMenu = (CCMenu*)bgMap->getChildByTag(kRPGMapSceneLayerTagMainMenu); mainMenu->setVisible(false); return false; } }