2019년 6월 1일 토요일

GMS2 타일 충돌 검사와 가로등 아래 (Checking tile collision and standing below street lights)


앞에서 GMS2의 맵을 이용하는 방법을 알아보았습니다.

이번에는 나무의 경우 어떤식으로 구현하는지 알아보도록 하겠습니다.
나무와 비슷한것이 가로등, 담벼락 처럼 위로 큰 물체를 만들고 플레이어가 해당 물체 뒤쪽에 가면 안나오게 되고 해당 물체 앞으로 가면 보이는 부분의 처리입니다.

일단 여기에서는 가로등 같은 물체를 만들어서 예제를 만들어 보았습니다.
원리는 일반 타일위에 가로등이 되는 타일을 새로운 레이어를 만듭니다.
아래 예제에서는 Tiles_1 일반 타일 Layer가 됩니다.




Tiles_2는 가로등의 아래 부분을 표시하기 위한 레이어입니다.


Tiles_3는 지붕레이어 입니다. 즉 플레이어 보다 항상 위쪽에 뿌려주는 레이어가 됩니다.


그래서 플레이어를 Instances 레이어에 생성하고 이동 시키면 아래 그림처럼 가로등 아래에있는것 처럼 보입니다.


만약 플레이어가 가로등 아래단쪽으로 가면 가로등 아래는 Tiles_2에 있고 사람은 Instances에 있으니 사람이 앞쪽으로 나오나 가로등의 위쪽 부분은 Tiles_3에 있기 때문에 반쯤 걸친 상태가 됩니다. 이 현상을 방지하기 위해 가로등 아래로 사람이 진입하지 못하도록 하여야 합니다. 그래서 충돌 검사를 위한 Tiles_coli를 하나 만들고 이곳에 충돌 검사를 하기위한 block을 둡니다. 여기에서는 빨간색 블록으로 처리하였습니다. 


Tiles_coli 레이어는 특별히 tileset1으로 된 단색으로된 이미지를 준비하였고 실제 게임시에는 hide시켜서 단순히 충돌 검사만 하도록 하였습니다. 충돌 검사시 tilemap_get_at_pixel 함수를 이용하여 현재 좌표에 대한 tile의 번호를 알아오도록 처리하였습니다.


전체 코드입니다.





var dx = 0
var dy = 0

if (keyboard_check(vk_left)){
 dx=-2
}

if (keyboard_check(vk_right)){
 dx=+2
}

if (keyboard_check(vk_up)){
 dy=-2
}

if (keyboard_check(vk_down)){
 dy=+2
}

var lay_id = layer_get_id("Tiles_coli");
var map_id = layer_tilemap_get_id(lay_id);
var data1 = tilemap_get_at_pixel(map_id, x+dx+3, y+dy+5);
var data2 = tilemap_get_at_pixel(map_id, x+dx-3, y+dy+5);
var data3 = tilemap_get_at_pixel(map_id, x+dx+3, y+dy-5);
var data4 = tilemap_get_at_pixel(map_id, x+dx-3, y+dy-5);

if( data1!=1 && data2!=1 && data3!=1 && data4!=1 ){ // can not move block
 x=x+dx
 y=y+dy
}

layer_get_id 레이어를 구한뒤 layer_tilemap_get_id 맵아이디를 구해서 tilemap_get_at_pixel 함수를 이용하여 현재 좌표의 tile번호를 가져옵니다. 획득한 tile번호가 빨간색이면 1번 블록이므로 dx,dy를 더하지 않고 기존값을 유지 하도록 합니다.
이때 dx+3, dy+5를 하는 이유는 player의 충돌 영역을 감안하여 4개의 점을 검사하기 위한 방법 입니다.





























댓글 없음:

댓글 쓰기