◈ 폭탄 만들기
이번 강좌에서는 폭탄을 만들어 봅시다.
(▲ 폭탄 설치)
강좌에서는 아래와 같은 이미지를 준비했습니다.
(▲ 폭탄 애니메이션)
그리드 크기의 폭탄 모양 스프라이트 이미지를 추가하고, 중심점은 (0,0)으로 설정합니다.
(▲ 폭탄 스프라이트 이미지)
그리고 폭탄이 폭발했을 때의 이미지를 준비합니다.
(▲ 폭발 애니메이션)
스프라이트 이미지로 추가하고, 이미지는 그리드 크기보다 클 수도 있고, 작을 수도 있기 때문에
중심점은 가운데로 설정합니다.
(▲ 폭발 스프라이트 이미지)
기물이 파괴되었을 때나, 플레이어가 파기되었을 때의 이펙트도 만들어 봅시다.
(▲ 폭발 애니메이션)
스프라이트 이미지로 추가하고, 마찬가지로 중심점은 가운데로 설정합니다.
(▲ 폭발 스프라이트 이미지)
폭탄 오브젝트를 만들고, 스프라이트 이미지를 지정합니다.
그리드 크기의 마스크 이미지를 지정해줍니다.
(▲ 폭탄 오브젝트)
[Create 이벤트]를 추가하고 필요한 변수를 정의합니다.
● obj_bomb - Create 이벤트 range_point = 2; //폭발 범위 alarm[0] = room_speed*5; image_speed = 0.2; |
폭탄이 폭발할 시간은 알람 이벤트를 이용하여 구성할 거에요.
폭탄이 폭발했을 때는, 폭탄과는 달리 플레이어나 몬스터에 피해를 입히도록 다른 오브젝트를
활용할 것입니다.
(▲ 폭탄이 터졌을 때)
폭발 오브젝트를 만들고, 폭발 이미지를 지정합니다.
그리고 그리드 크기의 마스크 이미지를 지정해줍니다.
(▲ 폭발 오브젝트)
이미지의 조정이 필요하다면 [Draw 이벤트]를 추가하고, 이미지를 다시 표시하도록 합니다.
● obj_bomb_explo - Draw 이벤트 draw_sprite( sprite_index, -1, x+16, y+16 ); |
폭발이 끝나는 시간은 애니메이션이 끝났을 때 없어지도록 하면 됩니다.
[Animation End 이벤트]를 추가하고 오브젝트를 파기합니다.
● obj_bomb_explo - Animation End 이벤트 instance_destroy( ); |
애니메이션이 재생되는 동안 플레이어나, 몬스터가 충돌하면 피해를 입게 하는 것이죠.
이제 이 오브젝트를 폭탄이 폭발할 때 생성하면 됩니다.
폭탄의 [알람 이벤트]를 추가하고, 폭발 오브젝트를 생성하도록 합니다.
우리가 구현해야 형태는 아래와 같습니다.
(▲ 폭탄이 터졌을 때 4방향으로 뻗어나감)
이것은 폭발 오브젝트의 생성 방향을 폭발 범위 만큼 4 방향으로 생성하는 거죠.
예정대로 [알람 이벤트]에서 폭발 오브젝트를 생성합시다.
● obj_bomb - Alarm 0 이벤트 var i, w, h, _x, _y, grid, _len, it; grid = 32; // ▼ 먼저 현재 위치에 생성 it = instance_create_depth( x, y, depth, obj_bomb_explo ); it.image_speed = sprite_get_number( spr_flame )/60; //폭발 지속시간(애니메이션을 지정 시간으로 재생. 서브이미지수/재생시간) // ▲ 먼저 현재 위치에 생성 // ▼ 4방향으로 뻗어나가며 생성 for( i = 0; i<4; i+ = 1; ){ w = grid; h = grid; _len = 1; repeat( range_point ){ _x = x+lengthdir_x( w, i*90 ); _y = y+lengthdir_y( h, i*90 ); if place_free( _x, _y ) || place_meeting( _x, _y, obj_block_light ){ it = instance_create_depth( _x, _y, depth, obj_bomb_explo ); it.image_speed = sprite_get_number( spr_flame )/60; if place_meeting( _x, _y, obj_block_light ) || _len> = range_point{ break; } w+ = grid; h+ = grid; } else{ break; } _len+ = 1; } } // ▲ 4방향으로 뻗어나가며 생성 instance_destroy( ); |
이것은 폭탄 위치에 폭발 오브젝트를 1개 생성하고, 좌우상하 4방향으로 뻗어나가면서 벽을
체크하고, 벽이 없을 때 추가적으로 생성하게 됩니다.
(▲ 폭탄이 터졌을 때 4방향으로 뻗어나감)
이제 플레이어 오브젝트에 이 폭탄을 그리드 위치에 설치하면 됩니다.
강좌에서 Space 키를 눌렀을 때 폭탄 설치하는 것으로 하겠습니다.
● obj_player - Step 이벤트 if keyboard_check_pressed( vk_space ){ //키를 눌렀을 때 생성 if instance_number( obj_bomb )<global.bomb_numb{ //설치 가능 수 체크 var _x, _y; _x = round( x*( 1/32 ) )*32; _y = round( y*( 1/32 ) )*32; if !( place_meeting( _x, _y, obj_bomb ) ){ it = instance_create_depth( _x, _y, 0, obj_bomb ); //폭탄 설치 it.range_point = 1+global.bomb_level; //폭발 범위 }} } |
기물 또는 벽이 파괴되었을 때나, 플레이어가 파기되었을 때의 이펙트도 만들어 봅시다.
오브젝트를 만들고 이미지를 지정합니다.
(▲ 이펙트 오브젝트)
이 오브젝트는 표시만 하는 것이기 떄문에 마스크를 지정하지 않아도 됩니다.
● obj_effect_01 - Create 이벤트 image_speed = 0.2;//애니메이션 속도 |
[Animation End이벤트]를 추가하고, 애니메이션이 끝났을 때 오브젝트를 파기하도록 합니다.
● obj_effect_01 - Animation End 이벤트 instance_destroy( ); |
◈ 게임에 대한 변수 정의
점수나 라이프와 같은 게임에 관련된 변수를 만들 필요가 있습니다.
게임 시스템을 처리할 오브젝트를 만들고, [Game Start 이벤트]를 추가합니다.
(▲ 게임 시스템 오브젝트)
※ Game Start 이벤트는 게임을 시작했을 때 실행되는 이벤트입니다.
강좌에서는 간단하게 아래와 같은 전역 변수(global)를 만들어 사용하겠습니다.
● obj_game_system - Game Start 이벤트 global.game_score = 0; //게임 점수 global.game_life = 3; //플레이어 라이프 global.game_time = 0; //타이머 global.bomb_numb = 1; //폭탄 설치수 global.bomb_level = 1; //폭탄 폭발 길이(화력) |
룸이 이동해서도 유지할 필요가 있는 라이프, 점수, 타이머 등과 같은 변수를 게임 실행시
한번 생성해주면 됩니다.
그러면 어떤 룸에서도, 어떤 오브젝트에서도 호출하거나 값을 변경할 수 있게 됩니다.
※ 전역변수는 값을 변경하지 않는 한, 룸을 이동해도 값이 유지됩니다.
◈ 폭탄과 파괴되는 벽의 상호설정
폭탄이 폭발했을 때, 파괴되는 벽과 충돌하면 벽이 파괴되도록 설정합시다.
파괴되는 오브젝트에 [폭발 오브젝트와의 충돌 이벤트]를 추가합니다.
● obj_block_light - obj_bomb_explo 와의 충돌 이벤트 instance_create_depth( x+16, y+16, depth, obj_effect_01 ); instance_destroy( ); |
이것은 벽이 파괴되면 이펙트를 생성하고, 벽 오브젝트는 파기하는 것입니다.
◈ 폭탄과 몬스터의 상호설정
폭탄이 폭발했을 때, 몬스터와 충돌하면 몬스터 오브젝트는 파기하고, 게임 점수를
추가하도록 구성합시다.
● obj_enemy_01 - obj_bomb_explo 와의 충돌 이벤트 global.game_score+ = 100; //점수 추가 instance_create_depth( x+16, y+16, depth, obj_effect_01 ); instance_destroy( ); |
그리고 폭발하기 전인 폭탄과 충돌 했을 때는 방향을 전환해서 이동하도록 합니다.
● obj_enemy_01 - obj_bomb 와의 충돌 이벤트 hspeed * = -1; vspeed * = -1; |
◈ 폭탄과 플레이어의 상호설정
몬스터와 마찬가지로 폭탄이 폭발했을 때, 플레이어 오브젝트를 파기하도록 합니다.
플레이어 오브젝트 파기는 단순 파기와 라이프가 감소되는 파기 2가지로 나뉩니다.
호출이 많은 이벤트는 사용자 함수(function) 로 만들거나, 사용자 이벤트로 만들어
호출하면 좋습니다.
강좌에서는 라이프가 감소하는 이벤트는 사용자 이벤트로 호출하도록 해보겠습니다.
[사용자 이벤트 (User Event)]를 추가하고, 라이프를 감소하도록 합니다.
● obj_player - User Event 0 이벤트 global.game_life- = 1; if global.game_life>0{ with( obj_start_point ){ alarm[0] = 60; }} global.bomb_numb = 1; global.bomb_level = 1; instance_create_depth( x+16, y+16, depth, obj_effect_01 ); instance_destroy( ); |
그리고 시작 위치 오브젝트에서 플레이어를 재생성하도록 합니다.
게임 수치들은 초기화 하고, 이펙트를 생성한 다음 파기합니다.
이제 이 이벤트를 폭발 오브젝트와 충돌했을 때, 호출하도록 합니다.
● obj_player - obj_bomb_explo 와의 충돌 이벤트 if guard == 0{ event_user( 0 ); }//무적 상태가 아니면 이벤트 호출 |
플레이어가 몬스터와 충돌 했을 때도 호출하도록 합니다.
● obj_player - obj_enemy 와의 충돌 이벤트 if guard == 0{ event_user( 0 ); } |
'GameMaker강좌[GMS2] > 액션게임강좌' 카테고리의 다른 글
[게임메이커 강좌-액션][GMS2]봄버맨 만들기-6 : 점수 표시 및 상단 인터페이스 (0) | 2022.02.04 |
---|---|
[게임메이커 강좌-액션][GMS2]봄버맨 만들기-5 : 게임오버와 클리어 (0) | 2022.02.04 |
[게임메이커 강좌-액션][GMS2]봄버맨 만들기-3 : 몬스터 만들기 (2) | 2022.02.03 |
[게임메이커 강좌-액션][GMS2]봄버맨 만들기-2 : 이동 (0) | 2022.02.02 |
[게임메이커 강좌-액션][GMS2]봄버맨 만들기-1 : 준비 (0) | 2022.02.01 |
댓글