오늘의 할일.
가로세로 매치 제대로 안되는 문제 해결..☆☆☆☆☆ ..........................clear
없어지고 내려오게.. → 픽셀좌표 기준을 인덱스로 바꾸기......................clear
1) 가로세로 매치 오류 해결
으윽.. 갬동이다...
역시나 문제는.... 내가 만들면서도 찝찝해 했던, 매치가 안될 경우 다시 false 상태로 돌리는 구문에 있었다.
//가로체크
for (_blockIndex = blocks.begin(); _blockIndex != blocks.end(); _blockIndex++)
{
Block* target1 = *_blockIndex;
POINT _targetPoint = target1->getGoalCoordinate();
int num1 = target1->getNum();
if (_targetPoint.x < rightsideX - xPadding)
{
Block* colTarget2 = getNearBlock(target1, COL_NEXT);
Block* colTarget3 = getNearBlock(colTarget2, COL_NEXT);
int colNum2 = colTarget2->getNum();
int colNum3 = colTarget3->getNum();
if (_targetPoint.x < rightsideX - xPadding)
{
if ((num1 == colNum2) && (colNum2 == colNum3))
{
target1->setColMatch(true);
colTarget2->setColMatch(true);
colTarget3->setColMatch(true);
}
else colTarget3->setColMatch(false);
}
if (_targetPoint.x < leftsideX + xPadding) //제일 왼쪽 일때
{
if (num1 != colNum2 || colNum2 != colNum3)
{
target1->setColMatch(false);
colTarget2->setColMatch(false);
}
}
}
}
///변경 전 코드 (참고로 가로에만 해당함)
///아래는 변경 후 코드
//체크 전 초기화
for (_blockIndex = blocks.begin(); _blockIndex != blocks.end(); _blockIndex++)
{
if(_direction == RIGHT) (*_blockIndex)->setColMatch(false);
else if (_direction == DOWN) (*_blockIndex)->setLowMatch(false);
}
//체크
for (_blockIndex = blocks.begin(); _blockIndex != blocks.end(); _blockIndex++)
{
Block* target1 = *_blockIndex;
POINT _targetIndex = target1->getGoalIndex();
int num1 = target1->getNum();
int rangeMin =0;
int rangeMax =0;
if (_direction == RIGHT)
{
rangeMin = _targetIndex.x;
rangeMax = BLOCK_QUANTITY_X -2;
}
else if (_direction == DOWN)
{
rangeMin = _targetIndex.y;
rangeMax = BLOCK_QUANTITY_Y - 2;
}
if (rangeMin < rangeMax)
{
Block* target2 = getNearBlock(target1, _directiony);
Block* target3 = getNearBlock(target2, _directiony);
int num2 = target2->getNum();
int num3 = target3->getNum();
if ((num1 == num2) && (num2 == num3))
{
if (_direction == RIGHT)
{
target1->setColMatch(true);
target2->setColMatch(true);
target3->setColMatch(true);
}
else if (_direction == DOWN)
{
target1->setLowMatch(true);
target2->setLowMatch(true);
target3->setLowMatch(true);
}
}
}
}
인자로 가로체크인지 세로체크인지 결정하게 하고,
체크 전 일괄로 초기화를 하고 맞는것만 true로 바꾸게 했다.
햐.. 그랬더니 문제가 사라짐. .ㅎ..
2) 검사과정에서 오지게 불편했던 좌표값 수정
원래 픽셀좌표여서... 옆칸들 값 찾아올 때 힘들었는데..
< 현재 픽셀 좌표를 가진 변수> / <있어야 하는 위치 인덱스 번호>
요래 변수를 바꾸었다.
그리고 인덱스번호->픽셀좌표 로 변경해주는 함수를 가져와서,
비교 및 이동할 수 있게 해주었다.
int Block::changeIndexToCoordinate(int _index, AXIS _way)
{
int _startX = PLAY_AREA_START_X; //playArea
int _startY = PLAY_AREA_START_Y;
if (_way == COL) return _index * BLOCK_SIZE + _index * BLOCK_PADDING + _startX + BLOCK_PADDING;
if (_way == LOW) return _index * BLOCK_SIZE + _index * BLOCK_PADDING + _startY + BLOCK_PADDING;
}
그랬더니 윗칸 아래칸 옆칸 값 가져오는게 세상 편 - 안.
덕분에 여러개 있던 불필요 함수도 싹 다 정리했다.
한 2~300여줄은 줄은 것 같어....
사실 1,2번은 천재개발자인 남자친구님의 조언이 컸다...
내가 일단 말로만 3개 매치됐을때의 동작에 대해 설명했더니.. 두가지 조언이 튀어나왔다.
1. 프로그래밍언어,, 코드는 사람이 보기 위해 만든 것이다..
그렇기에 가독성이 제일 중요한데,,
블록의 좌표가 445, 182 ... 이렇게 숫자로 되어 있으면 오류도 잘 생기고 보기도 힘들다.
체스처럼 인덱스 번호로 해야한다...
2. true나 false 체크하는 애는 보통 한가지 기능만 한다. 한 함수에 여러 기능을 같이 넣으면 오류가나도 찾기 힘들다.
후... 그래서 다시 뜯어고치는데 조금 힘들었지만.. 코드도 많이 줄고,
무엇보다 내가 보기가 편하다.
세상 편 -안..
3. 고민
사실.. 마우스 슬라이딩, 클릭.. 이거 로직이 버그없이 하는게 생각보다 힘들다..
응??
방금 뭔가 생각이 남. 방향을 마우스 포인터로 하던걸.. 렉트와 충돌하는걸로 하면 되잖아?
고민이 있었는데요. 없습니다.
그럼 이제 4,5,6 등의 특수블럭을 어케할지만 생각하면 된다.. ^0^
특수블럭과 특수블럭 이펙트도 넣어야 하나...?
고민이 없었는데요. 있었습니다.
1주차는 로직에 올인한다고 너무 코드도 막 바꿔가면서 시간을 많이 쓴 것 같다..
그래도 이걸 만들어서 혼자 뿌듯 중.. ㅎ
주말에 할 일
슬라이딩, 클릭 선택조건 바꿔보기
다음에 할 일
없어지고 내려오게!
4,5,6개짜리 특수블럭 추가하기..
vector <Block*>::iterator _blockIndex;
//체크 전 초기화
for (_blockIndex = blocks.begin(); _blockIndex != blocks.end(); _blockIndex++)
{
if(_directiony == RIGHT) (*_blockIndex)->setColMatch(false);
else if (_directiony == DOWN) (*_blockIndex)->setLowMatch(false);
}
//체크
for (_blockIndex = blocks.begin(); _blockIndex != blocks.end(); _blockIndex++)
{
Block* target1 = *_blockIndex;
POINT _targetIndex = target1->getGoalIndex();
int num1 = target1->getNum();
int rangeMin =0;
int rangeMax =0;
if (_directiony == RIGHT)
{
rangeMin = _targetIndex.x;
rangeMax = BLOCK_QUANTITY_X -2;
}
else if (_directiony == DOWN)
{
rangeMin = _targetIndex.y;
rangeMax = BLOCK_QUANTITY_Y - 2;
}
if (rangeMin < rangeMax)
{
Block* target2 = getNearBlock(target1, _directiony);
Block* target3 = getNearBlock(target2, _directiony);
int num2 = target2->getNum();
int num3 = target3->getNum();
if ((num1 == num2) && (num2 == num3))
{
if (_directiony == RIGHT)
{
target1->setColMatch(true);
target2->setColMatch(true);
target3->setColMatch(true);
}
else if (_directiony == DOWN)
{
target1->setLowMatch(true);
target2->setLowMatch(true);
target3->setLowMatch(true);
}
}
}
}