'Project (C++)'에 해당되는 글 24건

  1. 2019.11.19 2주차 - 둘째날
  2. 2019.11.18 2주차 - 첫째날
  3. 2019.11.16 1주차 - 여섯째날
  4. 2019.11.15 1주차 - 다섯째날
  5. 2019.11.14 1주차 - 넷째날

오늘의 할 일

내려오는 모션 이쁘게 수정.. ................ ?

가끔 터지는 문제 해결해보자..  .................??

 

 

 

 

 

 

뭔가 해결 한 것 같은데... 눈가리고 아웅 하는 느낌이다.

 

일단,, 세로 줄을 터트리면 아래칸의 좌표를 윗칸에 넘겨주는 형식이고,

윗칸이 0번째이면 0번째 줄이 내려올 때, 새로 블록 하나를 생성하는 형태이다.

 

근데 왜.. 왜.. 제일 마지막에 생성되는 얘가 먼저 밑에 생기는지..

그리고 거리를 조금 벌려주면 왜 .. 왜... 왜 그렇게 멀리 떨어지는지..

 

오후 내내 여러 그림도 그려보고 계산도 해보고 했는데..  딱히 답이 나오지 않는다 ㅠ..

 

이론상으로는 맞을텐데.. 왜.. 왜.. 먼저 내려와있는지... 거리를 좀 벌려주면 왜 확 벌어지는지...

하.. 더 연구를 해봐야하는데 ㅠㅠ

 

 

시간압박 받지 말고 그냥 이번주는 얘네들 이쁘게 굴리는거를 목표로 하고 계속 연구해야겠다.

애니메이션이나 ,, 모든 특수 기능을 다 빼더라도 가장 기본인 3-매치를 만들고 싶다.

사실 그게 제일 중요한 메인이니까.....

으.. 버그없이 완벽한걸 만들고 싶어.....

 

 

 

 

 

1. 가운데에 부분에 있는 블록이,, 상하 좌우가 없어진 상태에서 무언가를 하려고 하면 가끔 터짐.

2. 가로블록이 없어질 때 오류가 가끔 많이 자주 생김..

 

이것들은 나는 건..  블록을 없애는 중간에 검사가 돌아가고.. 그러다 보면 빈 공간을 검사하게 되서..

오류가 나는 것 같다.

검사가 계속 이루어지지 않고, 모든 블록이 멈춰있을때 검사를 하니까 일단 오류는 없어졌는데..

이거 기본적인 검사구문부터 바꿔야 할 것 같다.

 

코드를 몇번째 갈아엎는지 ㅋㅋㅋㅋㅋㅋㅋ

 

 

 

 

 

내일의 할일

가로세로 일치 조건 검사문 수정

기존에 만든 함수 수정해서 상하좌우 블록 가져오는 함수들에 대입하기

'Project (C++) > 1 Month Project' 카테고리의 다른 글

2주차 - 넷째날  (0) 2019.11.21
2주차 - 셋째날  (0) 2019.11.20
2주차 - 첫째날  (0) 2019.11.18
1주차 - 여섯째날  (0) 2019.11.16
1주차 - 다섯째날  (0) 2019.11.15
Posted by 파인애옹
,

오늘의 할일 :

일치하면 없어지고 새로 생성   ...... clear..?

4,5,6개짜리 특수블럭 추가하기 ..... continue;

[+]

블록 선택 조건 수정

 

 

 

 

 

 

이 내려오는 것을 처리하기 전에.. 블록선택하는 조건을 전반적으로 뜯어 고쳤다..

마치 새로 코드를 짠 기분. .ㅠㅠ

 

 

 

1) 블록 선택 조건문 변경

이전에는 처음 선택을 하면, 첫번째 선택을 했다는 bool 변수를 true로 변환하고,

그 true 조건 안에서 처리를 하려고 하는데...

 

계속 있던 문제가, 두번째 클릭을 먼 곳을 했을 때 그쪽 방향으로 바뀐다는 것..

그리고 클릭이 하나씩 안될때가 있었다..

 

아예 바꾼것은..

첫번째 클릭했다! 두번째 클릭이 필요하다!! 이 두가지의 bool 변수를 조건으로 줬다.

 

<슬라이딩 시>

슬라이딩하면 처음 클릭했을때의 좌표를 기준으로 방향을 가져와서, 그쪽의 렉트와 바꾼다.

바꾸고 나면  첫번째 클릭했다 true - 두번째 클릭 필요하다 false로  변경하고,

바꿈이 이뤄지고 나면 첫번째 클릭과 두번째 클릭 관련 변수를 false로 바꾸어 준다.

 

<클릭 시>

클릭으로 선택할 때는 마우스가 선택한 렉트에서 떨어지는 것을 염두하여,

만약 첫번째 클릭했는데 그 블록 안에서 마우스가 떨어지면 

첫번째 클릭했다 true - 두번째 클릭 필요하다 true 로 해주고

두 조건일때 다른 블록을 선택 할 수 있게 했다.

 

 

 

 

2) 슬라이딩 블록 선택 방법 변경

블록을 선택하면 clickPoint에 마우스의 좌표가 저장된다.

그리고 움직이는 방향에 따라 상하좌우 방향이 결정되는데..

이 쉬워보이는게... 쉽게 안된다...

 

종이에다가 그림도 엄청 그려보고.. 결국 엑셀로 (문명의 이기를 잊고있었다) 특정 발생 조건을 찾아서..

 

DIRECTION BlockBoard::getDirection()
{
	int distanceX = clickMouse.x - _ptMouse.x ;
	int distanceY = clickMouse.y - _ptMouse.y;
	int _standardDistance = 25;

	//상
	if (distanceX < BLOCK_SIZE && distanceY > _standardDistance) return UP;
	//하
	else if (distanceX < BLOCK_SIZE && distanceY < -_standardDistance) return DOWN;
	//좌
	else if (distanceY < BLOCK_SIZE && distanceX > _standardDistance) return LEFT;
	//우
	else if (distanceY < BLOCK_SIZE &&  distanceX < -_standardDistance) return RIGHT;

	else return NONE_DIRECTION;
}

이렇게 예쁘고 깔끔한 코드가 탄생했다.. 흐흐

25픽셀만 마우스가 움직이면 블록 안에서 움직여도 가로세로 잘 판단해서 움직인다.. 흑흑

이거 너무 힘들었어.. 무려 3시간 넘게 걸렸다... ㅠ 이 몇줄 코드 뽑느라구 ㅠㅠ...

 

 

 

3) 가로 세로 일치 할 때  블록 삭제..

엊그제 가로세로 일치 조건문 줄였다고 좋아했는데..

쩔수없이 걍 하나로 합쳤다...

이건 뭐 내 맘대로 늘이고 줄이고 할 수 있으니까 상관은 없는데...

아직 내려오는 모션들이 이쁘지 않아서 손을 좀 더 봐야한다..

 

 

 

 

 

내일의 할 일

내려오는 모션 이쁘게 수정..

가끔 터지는 문제 해결해보자.. (y의 -1 을 추가하면 될지도..?

오전중에 저것들이 끝나면 ... 특수블럭 하자! 라고 하려고 했는데,, 오전은 cocos2d 때문에 시간이 없겠구나 .ㅠㅠ

 

이런.. 하루 스케쥴이 짧아졌다... 이거 여유가 없겠는데..?

'Project (C++) > 1 Month Project' 카테고리의 다른 글

2주차 - 셋째날  (0) 2019.11.20
2주차 - 둘째날  (0) 2019.11.19
1주차 - 여섯째날  (0) 2019.11.16
1주차 - 다섯째날  (0) 2019.11.15
1주차 - 넷째날  (0) 2019.11.14
Posted by 파인애옹
,

주말에 할 일

슬라이딩, 클릭 선택조건 바꿔보기 ----- pass

[+] 코드 리뷰.

 

 

 

 

...

지난 닷새간 시간을 나름 많이 투자한 부분인데..

솔직히 절망적이다.

두번째 블록을 선택하는 방법이,, 슬라이딩 또는 클릭인데..

그 두가지를 가능하기 위해 썼던 방법이 뭔가 잘못된 것 같다.

 

<수정 전>
<수정 후>

사실 ,,  DIRECTION getDirection(Block* _block);  이 함수가

마우스 클릭한 좌표와 움직이는 좌표를 기준으로 방향을 리턴해준다.

근데... 지금 이 구조에서는 전혀 쓸모가 없던 것이었다..

정말 충격.

오히려 중간에 있는 블록 하나를 클릭하고,,

상하좌우 아무곳이나 먼 곳을 클릭하면 바뀌는 그 버그 아닌 버그 유발자였다......

 

그럼 내가 생각한 ,, - 마우스 선택시 멀리 움직여도 괜춘한.. 마우스 stayDown이나 onceKeyUp 부분을 수정해야 한다는 것인데..

햐...

 

아예 첫번째 선택하는 것부터 수정해야할거같다..

하지만 일단 지금 상태로는 충분히 문제가 없기때문에ㅋㅋㅋㅋ   

그래서 코드 리뷰를 했다.

 

 

내가 만든 코드지만, 아무리 생각과 고민을 하며 짠다 하더라도..

막 쓰다보면 이 함수가 어떻게 돌아가는지 까먹게 되니까..

 

 

중복되거나 필요없는 코드를 병합해서 8개였던 BlockBoard의 함수가 5개로 줄었다..

그리고 인덱스로 좌표를 처리하니까 넘나 편한 것-.

 

무엇보다.. 확실히 주변 블록 선택 조건을 다시 수정해야겠다.

그래.. 상하좌우 선택하는 방식을 마우스 방향으로 추출하는 것 보다,

아예 상하좌우 블록을 가져와서 한정적으로 체크하는게 훨씬 낫지..

 

 

 

우선 월요일에는..

일치하면 없어지고 새로 생성

 

 

 

내일은 일요일.

밀린 집안일도 하고 시장도 보고,, 다음 2주차를 위해서 쉬어야겠다..

하아.. 먹고살기 빡시네

 

 

 

'Project (C++) > 1 Month Project' 카테고리의 다른 글

2주차 - 둘째날  (0) 2019.11.19
2주차 - 첫째날  (0) 2019.11.18
1주차 - 다섯째날  (0) 2019.11.15
1주차 - 넷째날  (0) 2019.11.14
1주차 - 셋째날  (0) 2019.11.13
Posted by 파인애옹
,

 

오늘의 할일.

가로세로 매치 제대로 안되는 문제 해결..☆    ..........................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);
    }
   }
  }
 }

 

'Project (C++) > 1 Month Project' 카테고리의 다른 글

2주차 - 첫째날  (0) 2019.11.18
1주차 - 여섯째날  (0) 2019.11.16
1주차 - 넷째날  (0) 2019.11.14
1주차 - 셋째날  (0) 2019.11.13
1주차 - 둘째날  (0) 2019.11.12
Posted by 파인애옹
,

오늘의 할일..

클래스 전환 완료시키기(어제 한 부분까지.) ................ clear

오늘 다 못한 무빙 완성시키기                 ................. clear

일치안하면 돌아오기 기능이 자동으로 추가될 듯.. // not yet..

 

 

클래스로 전부 다 돌렸따아ㅡ!

그리고 목표 좌표와 현재 좌표의 일치여부로,,  움직여야 한다 or Not 을 자동으로 설정하여, 움직이게 하였다.

 

물론 움직이는 중간에 다른것과 또 교체하려 하면 안되게도 하였다.

사실 일치 안하면 돌아오기 기능 안넣어도 되는거 아녀?..

그러면 새로고침이 필요없어지지! ㅎ

이건 기획상의 문제고.. 어려울건 없어보이니.. 일단 킵.

 

 

허나 문제는..

 

 

 

분명 일치를 하는데 일부가 일치하는 상태로 변환을 안한다는 것이다.

vector를 list로도 바꿔보고, 조건문 수정도 해보고 했는데..............

모르겠다....

세로조건이 잘 안먹히는건가?
가로조건이 안먹히는 건가??

표시 안되는 애들을 다시 지들끼리 바꾸면 되는건 왜지..?/

 

5시간동안 내내 저거 해결할라고 이것저것 해보는데... 모르겠다 ㅠㅠ

1. vector.size() 로 for문 돌리던거 iter로 전부 다 전환..

2. 원하는 좌표에 있는 클래스 찾아오는 함수.. 여러번에 걸쳐 수정

3. 일치하는지 확인하는 조건문 명시적으로 바꿈.

요러케...

 

근데 아무래도.. false로 바꿔주는 저 조건문 에서 문제가 있는 것 같다.

좀 더 생각하고 생각해봐야겠다...

 

 

내일의 할일.

저 문제 해결..

없어지고 내려오게..

 

'Project (C++) > 1 Month Project' 카테고리의 다른 글

1주차 - 여섯째날  (0) 2019.11.16
1주차 - 다섯째날  (0) 2019.11.15
1주차 - 셋째날  (0) 2019.11.13
1주차 - 둘째날  (0) 2019.11.12
1주차 - 첫째날  (0) 2019.11.11
Posted by 파인애옹
,