게임메이커 스튜디오2에서 배경스크롤 제어하기
사실 너무나 간단하고 게임메이커 스튜디오 Document를 읽어보면 나오는 사실이지만, 초보자가
어떤 함수가 어떤 기능으로 어떻게 사용하는지는 누구도 알려주지 않기에 헤매는 경우가 있습니다.
게임메이커 스튜디오2에서는 횡스크롤 혹은 종스크롤 게임을 제작할때, 배경을 강제 스크롤하여
원근감을 표시해야 할 때가 있는데, 게임메이커 스튜디오2에 내장된 함수들을 모두 파악하는 것이 어려워
가끔 까먹을때가 있습니다. 그래서 개인적으로도 잊어버렸을 때에 다시 복습겸 정리를 하고자 글로 남겨놓습니다.
레이어의 기본 속도제어
게임을 시작했을 때에는 기본적으로 초기에 설정한 레이어에 직접 스피드 값을 설정하여 움직이거나
코드로 제어가 가능합니다.
레이어는 가장 처음 만든 배경 레이어가 가장 앞쪽에 표시되며 근거리에서 원거리로 표시되는 방식.
background_layer1 //가장 앞쪽의 이미지를 표시
background_layer2 //중간의 이미지를 표시
background_layer3 //가장 뒷쪽의 이미지를 표시
오프셋 밑에 스피드값이 존재하고 값을 설정해두면 게임이 실행될때 스크롤이 시작됩니다.
X 의 마이너스 값은 오른쪽에서 왼쪽으로 스크롤되며 플러스 값을 설정하면 왼쪽에서 오른쪽으로 스크롤됩니다.
Y 의 경우에는 마이너스를 할 경우, 아래쪽에서 위로 스크롤 되고 플러스는 위에서 아래로 스크롤됩니다.
레이어 속도 제어를 코드로 표기
레이어의 속도 제어 관련 코드는
layer_hspeed(layer_id, speed) 혹은 layer_vspeed(layer_id, speed)
함수를 사용하여 제어할 수 있으며 hspeed (횡스크롤) , vspeed (종스크롤)로 구분됩니다.
[기본적으로 포즈를 눌렀을때 멈추고 포즈가 해제되면 다시 스크롤 하는 코드]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
if (input_pressed(“Key Cancel”)) //개인적으로 사용하기 위해 만든 커스텀 키를 위한 함수
{
global.pause =! global.pause; // Pause the game
if (global.pause)
{
instance_deactivate_all(true);
var bg_layer1 = layer_get_id(“Backgrounds_1”);
var bg_layer2 = layer_get_id(“Backgrounds_2”);
layer_hspeed(bg_layer1, 0); //포즈가 되면 스크롤을 멈춤
layer_hspeed(bg_layer2, 0); //포즈가 되면 스크롤을 멈춤
if (!instance_exists(obj_settings)) //이건 옵션 오브젝트를 생성하기 위한 체크
{
instance_create_layer(x, y, “Instances”, obj_settings); // Create settings instance
}
}
if (!global.pause)
{
var bg_layer1 = layer_get_id(“Backgrounds_1”);
var bg_layer2 = layer_get_id(“Backgrounds_2”);
// 포즈 해제 시 다시 스크롤링 시작
layer_hspeed(bg_layer1, –14);
layer_hspeed(bg_layer2, –2);
instance_activate_all();
}
}
|
cs |
기본적으로 변수를 온/오프 하는 코드
변수이름 =! 변수이름
(위의 코드 예제로는)
global.pause =! global.pause
위에서는 지역변수로 이름을 짧게 적기 위해서 사용했지만, layer_hspeed(배경레이어 이름, 스피드값)만 적어도
작동하며 간단하게 속도를 제어할 수 있습니다.
특정 레이어에 있는 오브젝트만 제어하려면?
예를들어서 슈팅 게임을 만들고 있는데, 적들의 움직임이나 총알의 스피드를 제어해서 무언가 하고자 한다면,
자신을 제외한 오브젝트만 제어를 하고 싶을때가 있습니다.
그러기 위해서는 먼저 레이어의 구분을 두어야 하기에 룸에서 왼쪽(기본적인 환경일때)에 있는 레이어에서
새로운 레이어를 두고 구분지어둡시다. (Ctrl + I)
하나는 주인공 오브젝트만 두고 사용할 Instances_player 레이어와 Instances_enemy 레이어가 있다고 치고
적들은 Instances_enemy 에 작성.
그리고 사용할 함수가 바로 layer_get_name(layer_id) 함수입니다.
[예제]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
// 레이어 ID 가져오기
var layer_id = layer_get_id(“Instances_enemy”);
// 레이어에서 인스턴스 목록 가져오기
var instance_list = layer_get_all_instances(layer_id);
// 배열 생성
var enemy_array = array_create(array_length_1d(instance_list));
// 배열에 인스턴스 추가
for (var i = 0; i < array_length_1d(instance_list); i++) {
enemy_array[i] = instance_list[i];
}
// 스피드 조절 값 설정
var speed_value = 5;
// 배열을 순회하며 각 오브젝트의 스피드 값을 설정
for (var i = 0; i < array_length_1d(enemy_array); i++) {
// 배열에서 인스턴스 가져오기
var enemy_instance = enemy_array[i];
// 오브젝트의 스피드 값을 변경
enemy_instance.speed = speed_value;
}
|
cs
|
대략 이런 모습으로 코드를 작성하여 사용할 수 있습니다.
제작하는 설정이나 변수를 어디에 넣어두고 활용하는가에 따라 코드는 천차만별이므로 질문하셔도
전체적인 코드를 보지 않는한 도움이 안될 수 있습니다. (그리고 보여주셔도 코드체크 하기 귀찮음)
초보자가 겪기 쉬운 레이어 관련 에러
이제 레이어를 제어하고 만드는 것에 익숙해졌다면 반드시 처음에는 겪게 되는 에러가 바로
다른 룸에는 같은 형식으로 레이어를 만들어 놓지 않아 레이어가 없다는 경고 메세지를 받게 됩니다.
그렇기에 코드 진행에서 레이어 뿐만 아니라 ‘무언가 존재한다면’이라는 if문으로 체크를 하는 것이
에러를 만나지 않는 지름길입니다.
레이어라면 layer_background_exists(layer_id, background_element_id) 함수를 사용하여
var lay_id = layer_get_id(“Background_trees”);
if layer_background_exists(lay_id, global.TreesBackground)
{
layer_background_destroy(lay_id, global.TreesBackground);
}
존재하는지 존재한다면 파괴 혹은 생성등을 작성하여 체크하는 것이 좋습니다.
이 코드를 넣는 것이 귀찮다면 그냥 다른 룸에도 항상 같은 형식의 레이어 구성을 하는 것이 기본.
특정 배경 레이어의 컬러를 바꾸고 싶다면?
layer_background_blend(background_element_id, blend_color);
이 함수를 사용하여 특정 배경 레이어의 컬러를 바꿀 수 있습니다.
//”Background_sky” 이름의 배경 레이어 색을 변경하고자 할 때
var lay_id = layer_get_id(“Background_sky”);
var back_id = layer_background_get_id(lay_id);layer_background_blend(back_id, c_aqua);
기본적으로 사용할 수 있는 c_컬러 시리즈를 쓰고 싶지 않다면 컬러 코드(예: #0f6be8)같은
코드를 사용해도 원하는 컬러로 변경됩니다.
새롭게 추가된 레이어 이펙트
추가된 레이어 이펙트는 쉐이더처럼 게임 전체 화면에 영향을 주며, 레이어의 순서상 위에 있는 레이어에는
영향을 주지 않습니다.
다양한 형태의 기본적인 효과들이 존재하는데, 점점 업데이트 되면서 효과유형이 많아져서 다 설명하기 힘들기에
아래쪽에 있는 효과 유형들을 하나씩 적용해보며 어떤 효과가 있는지 체크하는 것이 좋습니다.