본문 바로가기
GameMaker강좌[GM8]/기초강좌

[게임메이커강좌-기초] 장애물 인지 이동 2

by 타락카얀 2017. 1. 9.
728x90



GAME MAKER 강좌



KAYAN









◈ 장애물을 체크하고 이동하는 기능을 가진 함수



장애물을 미리 체크하 이동시킬 수 있는 함수가 있습니다.

먼저 아래 함수는 이동할 위치로 이동하다 장애물을 만나면, 이동을 멈추는 기능을 가졌습니다.


 

mp_linear_step(x,y,speed,checkall)
mp_linear_step_object(x,y,speed,obj) : 특정 오브젝트를 장애물로 체크



(x,y)는 이동할 위치, speed 는 이동할 속도를 지정합니다. 그리고 checkall 은 모든 오브젝트를 장애물로
처리(1,true)할 것인지, 아니면 solid 오브젝트만 장애물로 처리(0,false)할 것인지를 지정합니다.
다만, 모든 오브젝트로 설정할 경우, 모든 오브젝트들을 장애물로 인식하여 이동이 제대로 이루어지지

않을 수 있습니다.

obj 는 장애물로 체크할 오브젝트를 지정하면 됩니다.



(▲ mp_linear_step 함수)


예를 들어, 이동할 때, solid 오브젝트만 장애물로 체크하고, (320,240)위치로 이동할 때


 

예) solid 오브젝트만 체크하고, 2의 속도로 (320,240)위치로 이동할 때

mp_linear_step(320,240,2,false)



이와 같이 할 수 있습니다.
이것은 이동할 때 solid 오브젝트만 체크하고, 2의 속도로 (320,240)위치로 이동하게 됩니다.
그리고 목표지로 이동하다가 solid 오브젝트와 충돌한다면 이동을 멈추게 되지요.


그리고 아래 함수는 이동할 위치로 이동하다 장애물을 만나면, 그 장애물을 회피해 목적지 위치로
이동하는 기능을 가진 함수입니다.


 

mp_potential_step(x,y,speed,checkall)
mp_potential_step_object(x,y,speed,obj) : 특정 오브젝트를 장애물로 체크



(x,y)는 이동할 위치, speed 는 이동할 속도를 지정합니다. 그리고 checkall 은 모든 오브젝트를 장애물로
처리(1,true)할 것인지, 아니면 solid 오브젝트만 장애물로 처리(0,false)할 것인지를 지정하면 됩니다.
다만, 모든 오브젝트로 설정할 경우, 모든 오브젝트들을 장애물로 인식하여 이동이 제대로 이루어지지

않을 수 있습니다.
obj 는 장애물로 체크할 오브젝트를 지정하면 됩니다.



(▲ mp_potential_step 함수)


예를 들어 (320,240)위치로 이동하고, solid 오브젝트만 장애물로 처리할 때

 

예) solid 오브젝트만 체크하고, 2의 속도로 (320,240)위치로 이동할 때

mp_potential_step(320,240,2,false)



이와 같이 할 수 있습니다.
이것은 이동할 때 solid 오브젝트만 체크하고, 2의 속도로 (320,240)위치로 이동하게 됩니다.
목표지로 이동하다가 solid 오브젝트가 있다면, 그 오브젝트를 회피하여 목표지로 이동하게 됩니다..

다만, 이 함수는 이동 경로에 장애물이 2~3개로 간단하게 배치되었을 때 사용하기 적합합니다.

장애물이 복잡하게 설정되어 있는 경우, 이동하다가 장애물을 계속 회피하려고, 한곳에 빙글빙글 돌며
머무르는 경우가 발생할 수 있기 때문이지요. 적당히 피할 수 있도록 장애물을 배치하는 것이 좋습니다.


아래의 함수는 장애물에 충돌 하기 전까지 이동시킬 수 있는 함수입니다.


 

move_contact_solid(dir,maxdist) : solid 오브젝트만 체크
move_contact_all(dir,maxdist)
: 모든 오브젝트 체크



dir 은 이동 방향, maxdist 는 이동 거리(0 초과의 양수값)를 지정하면 됩니다.



(▲ move_contact 함수)


예를 들어, 이동시 270 방향에 solid 오브젝트가 있을 때, 그 오브젝트 가까이 붙이고자 한다면,


 

예) 270방향의 solid 오브젝트 가까이 붙이고자 할 때

move_contact_solid(270,8)



이와 같이 할 수 있습니다.
이것은 이동시 270방향에 최대 8 거리 이내에 solid 오브젝트가 있다면, 그 오브젝트 가까이 붙이게 됩니다.


그리고 장애물과 충돌했을 때, 장애물의 외곽으로 이동시킬 수 있는 함수가 있습니다.


 

move_outside_solid(dir,maxdist) : solid 오브젝만 체크
move_outside_all(dir,maxdist)
: 모든 오브젝트 체크



dir 은 이동 방향, maxdist 는 이동 거리(0 초과의 양수값)를 지정하면 됩니다.


그러면 충돌하지 않을 때까지 지정한 방향으로 이동하게 됩니다.



(▲ move_outside 함수)


예를 들어, solid 오브젝트 내에 겹쳐 있다면, solid 오브젝트에서 90방향의 외곽으로 이동하고자 할 때,


 

예) 90도 방향의 solid 오브젝트 외곽으로, 최대 8 의 속도로 이동.

move_outside_solid(90,8)



이와 같이 할 수 있습니다.
이것은 solid 오브젝트 내에 겹쳐 있다면, solid 오브젝트에서 90방향의 외곽으로 이동하게 됩니다.



300x250

댓글