이번에 만들어볼 기능들 타일선택, 맵 크기에 맞추어 그리기

일단 타일 선택하기. 블록을 관리해주는 매니저에 원하는 타일의 파일이름을 저장 후 타일 개수 만큼 배열로 정리했다.

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식만 돌아가게 만들었다.



반응형