본문 바로가기
GameMaker강좌[GMS2]/액션게임강좌

[게임메이커 강좌-액션][GMS2]봄버맨 만들기-4 : 폭탄 만들기

by 타락카얀 2022. 2. 3.
728x90

 

 

 

 

 

◈ 폭탄 만들기

 

 

이번 강좌에서는 폭탄을 만들어 봅시다.

 

(▲ 폭탄 설치)

 

강좌에서는 아래와 같은 이미지를 준비했습니다.

 

(▲ 폭탄 애니메이션)

 

그리드 크기의 폭탄 모양 스프라이트 이미지를 추가하고, 중심점은 (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 ); }

 

 

 

 

bomberman_03.yyz
0.41MB

 

 

 

 

 

300x250

댓글