이번에 만들어볼 기능들 타일선택, 맵 크기에 맞추어 그리기
일단 타일 선택하기. 블록을 관리해주는 매니저에 원하는 타일의 파일이름을 저장 후 타일 개수 만큼 배열로 정리했다.
void BlockManager::loadResource()
{
m_pTexture[0] = CCTextureCache::sharedTextureCache()->addImage("box/tile_grass01.png");
m_pTexture[0]->setAliasTexParameters();
m_pTexture[1] = CCTextureCache::sharedTextureCache()->addImage("box/grass01.png");
m_pTexture[1]->setAliasTexParameters();
m_pTexture[2] = CCTextureCache::sharedTextureCache()->addImage("box/fence01.png");
m_pTexture[2]->setAliasTexParameters();
m_pTexture[3] = CCTextureCache::sharedTextureCache()->addImage("box/Box.png");
m_pTexture[3]->setAliasTexParameters();
m_pTexture[4] = CCTextureCache::sharedTextureCache()->addImage("box/Block1.png");
m_pTexture[4]->setAliasTexParameters();
m_pTexture[5] = CCTextureCache::sharedTextureCache()->addImage("box/Block0.png");
m_pTexture[5]->setAliasTexParameters();
m_bLoaded = true;
}
그리고 메인 씬에서
void MyScene::SelectMap()
{
if(GetAsyncKeyState('1')) m_iSelectMap = 0;
if(GetAsyncKeyState('2')) m_iSelectMap = 1;
if(GetAsyncKeyState('3')) m_iSelectMap = 2;
if(GetAsyncKeyState('4')) m_iSelectMap = 3;
if(GetAsyncKeyState('5')) m_iSelectMap = 4;
if(GetAsyncKeyState('6')) m_iSelectMap = 5;
if(Line == false)for(int i=0; i<4; i++) pLine[i]->setIsVisible(false);
}
그냥 int형 변수에 타일의 번호로 선택할 번호를 저장한다 enum을 사용하려 했는데 타일에 이름을 정해주고 싶었으나. 타일이름들 하나하나 이름이 생각이 안 났다.
이제 저번에 만들었던 마우스로 타일 그리기를 사용하면 된다.
void MyScene::ccTouchesBegan(NSSet *pTouches, UIEvent *pEvent)
{
CCTouch* pT = (CCTouch*)pTouches->anyObject();
CGPoint po = pT->locationInView( pT->view() );
CGPoint pos = CCDirector::sharedDirector()->convertToGL( po );
pos.x -= m_pBackGround->getPosition().x;
pos.y -= m_pBackGround->getPosition().y;
TileSelect( pos );
}
백그라운드를 빼주는 것은 맵 스크롤 효과로 맵이 밀렸을 때 마우스 좌표를 밀린 좌표에 넣어주기 위해서다.(이거 없으면 이상한 곳에 깔림)
이제 원하는 위치의 좌표와 원하는 타일의 정보가 모였다.
어디든지 내 마음에 드는 타일을 선택해서 만들 수 있다.
TileSelect 함수를 만들었다.
void MyScene::TileSelect(CGPoint pos)
{
switch(m_iSelectMap)
{
case 0: BlockManager::sharedManager()->addBlock(m_iSelectMap, pos, TILE_CANMOVE); break;
case 1: BlockManager::sharedManager()->addBlock(m_iSelectMap, pos, TILE_CANMOVE); break;
default: BlockManager::sharedManager()->addBlock(m_iSelectMap, pos, TILE_NOTMOVE);
}
};
이제 타일을 마음대로 정해서 만들 수 있다. 하지만 위치가 예쁘게 생성되지 않는다. 그렇타면 타일을 생성 중인 addBlock에서 타일이 만들어질 때 받은 좌표로 계산을 해주면 된다.
제가 사용중인 타일들은 32x32라서 받은 좌표 / 32 = * 32해주면 된다.
void BlockManager::addBlock(int _type, CGPoint _pos, TILE _TileInfo)
{
if ( m_bLoaded == false && m_pGround == NULL) return;
int x = _pos.x / 32, y = _pos.y / 32;
for( int i = 0 ; i < MAX_BLOCK ; i++ ){
if( m_pBlock[i] != NULL )continue;
m_pBlock[i] = new Object_Block;
m_pBlock[i]->initWithBlock(m_pTexture[_type], _TileInfo);
m_pBlock[i]->setPosition(ccp(x*32,y*32));
m_pGround->addChild( m_pBlock[i] );
break;
}
}
끝...
결과 동영상
추가 내용 일기를 쓰다가 생각나서 만들었다.
추가기능 Shitf키를 누를때마다 90도씩 그림이 돌려서 생성된다.
void MyScene::SelectMap()
{
if(GetAsyncKeyState('1')) m_iSelectMap = 0;
if(GetAsyncKeyState('2')) m_iSelectMap = 1;
if(GetAsyncKeyState('3')) m_iSelectMap = 2;
if(GetAsyncKeyState('4')) m_iSelectMap = 3;
if(GetAsyncKeyState('5')) m_iSelectMap = 4;
if(GetAsyncKeyState('6')) m_iSelectMap = 5;
if(Line == false)for(int i=0; i<4; i++) pLine[i]->setIsVisible(false);
if(GetAsyncKeyState(VK_SHIFT) && bKeydown == false){
bKeydown = true;
m_iAngle += 90;
if(m_iAngle > 360) m_iAngle = 0;
}
else if(!GetAsyncKeyState(VK_SHIFT) && bKeydown == true) bKeydown = false;
}
중복키를 설정해서 한번눌렀을때 90식만 돌아가게 만들었다.
'Programming > Cocos2D-X' 카테고리의 다른 글
Inventory 만들기 (0) | 2015.04.27 |
---|---|
removeChild 맵에 필요없는 블록 삭제 (0) | 2015.04.25 |
파일저장 꾸민 맵 저장하기 (0) | 2015.04.24 |
랜더타겟? 메모리 관리? CCSpriteBatchNode!! (0) | 2015.04.24 |
화면 스크롤 만들기 (0) | 2015.04.21 |
Raycast 만들기 (3) | 2015.04.20 |
CollisionBlock 마우스 클릭으로 생성하기 (0) | 2015.04.20 |
캐릭터 리소스 변경작업 (0) | 2015.04.20 |