지금까지 만든현황

이제 

Raycast를 만들자레일케스트는 캐릭터가 한칸 이동할때마다 범위를 정해서 그안에 충돌 하는 물체가 있는지 확인 하는기능이다.void BlockManager::Raycast(CGRect _rc, CGPoint _vec, float _distance, raycast* _ray){ float detail = 0.1f; for( _ray->distance = 0 ; _ray->distance < _distance ; _ray->distance+=detail ){ int index = CollisionChack(_rc);
if( index > -1 ){ _ray->distance -= detail; _ray->m_pBlock = m_pAdjacentBlock[index]; return; } _rc.origin.x += _vec.x * detail; _rc.origin.y += _vec.y * detail; }}

이기능을 수행할때 전체 블럭을 계산하면 타일이 많아지면 제가 사용하는 컴퓨터는 떵컴이라 랙이 심합니다.

그래서 근처 이동 불가능한 타일박스와 캐릭터의 거리가 96보다 클경우 수집하는 함수를 만들었다.

 

void BlockManager::AdjacentChack(CGPoint _pt)

{

CGPoint vec;

float distance;

 

memset(m_pAdjacentBlock, NULL, sizeof(m_pAdjacentBlock));

 

for( int i = 0 ; i < MAX_BLOCK ; i++ ){

if( m_pBlock[i] == NULL ) continue;

if( m_pBlock[i]->getTileInfo() != TILE_NOTMOVE) continue;

 

vec = ccp(_pt.x - m_pBlock[i]->getPosition().x, _pt.y - m_pBlock[i]->getPosition().y );

distance = sqrtf(vec.x * vec.x + vec.y * vec.y);

 

if( distance < 96 )

{

// 수집 //

if( count > ABJACENT_BLOCK){ count = 0; return; }

m_pAdjacentBlock[count++] = m_pBlock[i];

m_pBlock[i]->setColor(ccc3(255,0,0));

}

else{ 

m_pBlock[i]->setColor(ccc3(255,255,255));

}

}

}

약간의 버그가 있다. 충돌 지점에서 계속 밀어 넣으면 뚫리는 부분이 있다.

 

레이 캐스트를 만들면서 느낀 점 : 매우어렵다...ㅠㅠ

 

결과 동영상(미완성)2015.04.23

 

2015.04.24

AdjacentChack, CollisionChack 이 두 함수가 사실상 하는 일은 비슷하다.

그래서 방법을 바꾸려고 한다. 타일을 많이 깔면 어차피 랙이 발생해서 렌더타겟을 사용해야 할 거 같다.

그래서 CollisionChack안에 AdjacentChack에서 사용하던 거리를 계산해서 검사하던 기능을 넣었다. 사실상 블록을 수집해도 랙은 줄지 않고 쓸모없는 함수다. 삽질하고 있었다.

 

최종 Raycast 결과 동영상

 

 

동영상 찍다 알게 된 점. 장해물 방향을 바꿔줬더니 그림만 위치가 바뀌었다.. 충돌 위치도 좀 손봐야 할 거 같다.

 

2016.01.15 추가

 

렉트가 겹치는지 확인하는 부분 충돌체크

 

이동 수행 하는부분

사이즈, 이동방향, 거리, 충돌체

반응형