본문 바로가기
GameMaker강좌[GMS2]/기타장르강좌

[게임메이커 강좌-기타][GMS2]그리드 기반의 길찾기-5 이동 거리 제한

by 타락카얀 2023. 1. 18.
728x90

 

 

GAME MAKER 강좌

 

KAYAN

 

 

 

 

 

◈ 그리드 기반의 길찾기(Path finding) 이동 거리 제한

 

 

이번 강좌에서는 길찾기에서 이동 거리 제한하는 방법에 대해 알아봅시다.

 

(▲ 이동 제한)

 

현 강좌는 [응용편1]강좌의 예제를 기반으로 합니다.

 

[응용편1]의 플레이어 이동은 아래와 같습니다.

 


   //● obj_player - Step 이벤트
   
   var mx,my;
   mx=(floor(mouse_x/global.grid)*global.grid)+floor(global.grid/2);
   my=(floor(mouse_y/global.grid)*global.grid)+floor(global.grid/2);


   var _break;
   _break=0;
   
   //---------- 이동 패스 구성
   
   if move_on==0{
   
   if position_meeting(mx,my,obj_block){_break=1;}
   
   if mouse_check_button_pressed(mb_left) && _break==0{
   
   mp_grid_clear_all(global.move_grid);


   mp_grid_add_instances(global.move_grid,obj_block,0);
   
   
   x=(floor(x/global.grid)*global.grid)+floor(global.grid/2);
   y=(floor(y/global.grid)*global.grid)+floor(global.grid/2);
   
   mp_grid_path(global.move_grid,global.move_path,x,y,mx,my,0);//패스 작성
   
   
   if path_get_number(global.move_path)>=2{
   pspeed=2;
   path_start(global.move_path,pspeed,0,1);//패스를 따라 이동
   move_on=1;
   }
   
   }
   }


   //---------- 이동 종료
   
   if move_on==1{
   if path_position==1{
   
   path_end();//패스 종료
   
   x=(floor(x/global.grid)*global.grid)+floor(global.grid/2);//위치 갱신
   y=(floor(y/global.grid)*global.grid)+floor(global.grid/2);
   
   move_on=0;//이동 초기화
   
   path_clear_points(global.move_path);//패스 클리어
   
   }
   }


 

여기서 패스 이동전에 패스를 구성하는 부분을 보아야 합니다.

강좌에서 패스는 mp_grid_path 함수로 구성하고, path_start 함수로 이동하는 순서죠.

 

이동 제한은 패스 포인트 총 개수에서 이동할 포인트만 남기고, 나머지 포인트를 삭제하면 됩니다.

이 패스 포인트 삭제는 이동할 패스를 변경하는 것으로 [패스작성]▶[패스 삭제]▶[이동 하기]

순서로 작성해야 합니다.

그리고 패스 포인트를 삭제할 때는 패스 포인트를 도착 지점을 기점으로 삭제하는 것이 좋습니다.

 

(▲ 패스 포인트 삭제)

 

이벤트를 구성하자면 아래와 같습니다.

패스를 작성하는 mp_grid_path 함수를 찾아봅시다.

그리고 패스 작성(mp_grid_path)과 패스 이동(path_start) 사이에 패스 포인트를 필요한 만큼 재구성하면 됩니다.

 


   // 이동 거리를 move_point 라고 할 때
   
   mp_grid_path(global.move_grid,global.move_path,x,y,mx,my,0);//패스 작성
   
   
   //--------- ▼ 추가
   
   move_point=5;//이동 거리
   
   var n,i;
   
   n=path_get_number(global.move_path);//패스 포인트 수
   
   for(i=n-1; i>move_point; i-=1;){//패스 포인트를 이동할 포인트만 남기고 끝에서부터 삭제
   path_delete_point(global.move_path,i);//패스 포인트 삭제
   }
   
   //--------- ▲ 추가


   if path_get_number(global.move_path)>=2{
   pspeed=2;
   path_start(global.move_path,pspeed,0,1);//패스를 따라 이동
   move_on=1;
   }


 

이것은 이동할 패스를 구성하고, 이동할 포인트를 재구성한 다음, 패스를 따라 이동시키도록 합니다.

간단하죠.

패스 포인트 0번은 현재 위치입니다.

패스 포인트가 최소 2개 이상일 때 이동시킬 수 있기 때문에, 이동 거리는 패스 포인트 1번부터

계산하시면 됩니다.

 

이제 잘 되는지 테스트 해봅시다.

 

※ 패스가 잘 구성되는지 확인하고 싶을 때는 [Draw 이벤트] 에서 draw_path 함수를 사용하면

사용중인 패스를 간단하게 표시할 수 있습니다.

예)


   //● obj_system - Draw 이벤트

   
  

   draw_path(global.move_path,0,0,1);

 

(▲ 테스트)

 

 

 

pathfinding_example4.yyz
0.04MB

 

 

 

 

 

 

 

300x250

댓글