엑셀 VBA 마리오 게임 만들기 [7/8] :: 마리오 이동 명령문

이전 강의에서 알아본 KeyPressAPI 모듈을 이용하여 마리오를 좌/우로 이동하는 명령문을 작성합니다.

홈페이지 » 엑셀 VBA 마리오 게임 만들기 [7/8] :: 마리오 이동 명령문

엑셀 마리오게임 본격 명령문 작성하기 :: 마리오 이동하기 :: 엑셀 VBA 강의 3-7

실습파일 무료E-Book 강의 PPT 파일 완성파일
첨부파일에 이상이 생겼을 경우, 1:1 문의하기로 연락주시면 신속히 해결해드리겠습니다. 

관련강의 살펴보기

글을 발견하지 못했습니다.

관련 기초내용 포스트 | by 오빠두엑셀

VBA 리스트박스 값 선택여부 PNG
엑셀 isListBoxSelected 함수 사용법 :: 리스트박스 선택여부 확인
예제파일 예제파일은 매크로가 포함되어 있습니다. 예제파일 실행 후 '컨텐츠 포함' 버튼을 클릭하여 매크로를 활성화합니다. 매크로를 활성화하는 방법은 '예제파일 매크로 활성화 ...

1. 음악출력함수(Play/StopSound)에 인수 추가하기

기존에 만들었던 음악출력/중단함수 (PlaySound/StopSound)인수를 추가합니다. 함수의 내부 변수로 입력했던 FileName (음악파일주소)를 함수의 인수로 받도록 변경하여, 다른 명령문에서 PlaySound/StopSound 명령문을 엑셀함수 이용하듯 편리하게 사용할 수 있게됩니다.

엑셀 VBA 게임 만들기 음악 출력 인수 추가
음악출력/중단 함수에 인수를 추가합니다.
'// 변경된 음악출력/중단 함수 전문
 
Public Sub PlaySound(FileName As String)
 
FileName = GetShortPath(FileName)
 
Play = mciSendString("play " & FileName, 0&, 0, 0)
If Play <> 0 Then
   MsgBox "오디오파일을 확인할 수 없습니다. 다시 확인해주세요"
End If
 
End Sub
 
Public Sub StopSound(FileName As String)
 
FileName = GetShortPath(FileName)
 
Play = mciSendString("close " & FileName, 0&, 0, 0)
 
End Sub

2. Select Case 문 이용하기

키입력받기 모듈(KeyPressAPI 모듈)을 제대로 응용하기위해서는 Select Case문의 기초적인 동작방법을 이해해야 합니다. 우측 이미지와 같이 “A1”셀에 ‘등심’ 이라는 값이 입력되어 있다고 가정하겠습니다.

엑셀 VBA Select Case문 예제
Select Case문의 논리값으로 A1셀을 지정해줍니다.
'// Select Case문 사용예제
 
Select Case Range("A1").Value  '// = 등심
 
    case "사과", "오렌지", "귤"
        msgbox "과일입니다."
    case "오이", "배추", "상추"
        msgbox "야채입니다."
    case "등심", "안심", "삼겹살"
        msgbox "고기류입니다."
    case else
        msgbox "기타 재료입니다.“
 
end select

Select Case 문을 통해, 첫번째로 A1셀의 값인 ‘등심’을 받아옵니다.
이후 각 Case(논리상황)을 통해
1) 사과 or 오렌지 or 귤일 경우,
⇨ “과일입니다” 안내메세지 출력
2) 오이 or 배추 or 상추일 경우,
⇨ “야채입니다” 안내메세지 출력
3) 등심 or 안심 or 삼겹살일 경우,
⇨ “고기류입니다” 안내메세지 출력
4) 위의 3가지 경우가 모두 아닐 경우,
⇨ “기타 재료입니다” 안내메세지 출력

본 예시에서 받아온 Case는 셀 A1의 값인 “등심”이므로, 3번째 Case에서 걸리게 되고 “고기류입니다.” 라는 안내메세지를 출력한 뒤 Select Case 문은 종료됩니다.

  •  Select Case문은 IF문보다 가독성이 뛰어납니다. 만약 처리해야 할 조건이 3개 이상이라면 Select Case문을 ‘무조건’ 사용하시길 권장합니다.
  • 엑셀의 최대 행 개수인 100만개정도의 자료를 단순반복계산시, Select Case문은 IF문보다 약 3-5초정도 느리게 동작합니다. 이는 프로그래밍에서 매우 치명적인 단점이지만, 엑셀이라는 다소 한정된 범위안에서 코드를 작성할 경우 100만개의 자료를 다루는 경우는 상당히 드물며, 대부분이 사용자는 10만행 이내의 범위안에서 자료를 다루게 됩니다. 따라서 이는 처리속도에 아주 미미한 차이만 발생하므로, 여러 개의 조건 사용시 IF문보다 Select Case문 사용을 적극 권장합니다.
  • Select Case문은 For문과 같이 응용하여 선택된 범위안에서 셀을 하나씩 비교하여 논리계산을 할 때 많이 사용됩니다. 이에 대한 자세한 내용은 이후 관련강의를 준비할 때 좀 더 다루도록 하겠습니다.

3. GameSheet에 KeyPressAPI 시트모듈 붙여넣기

이전강의에서 만들었던 KeyPressAPI 모듈을 GameSheet 안에 복사하여 붙여넣기 합니다. KeyPressAPI 모듈에 대한 자세한 설명은 아래 영상강의를 참고하세요.
KeyPressAPI 클래스 모듈 관련강의 바로가기

'########################################################################################################################
'# 해당 명령문에 대한 저작권은 오빠두엑셀(https://www.oppadu.com)에 있습니다.                                                
'# 모든 정보는 Cretive Commns License에 의해 저작권을 보호받습니다.                                                     
'# 영리를 목적으로 하지 않는 사용 및 공유는 허용됩니다. 반드시 저작자, 오빠두엑셀(https://www.oppadu.com)을 명시해야합니다.  
'# This VBA Code is protected by Creative Commons License.                                                              
'# All information can be posted, uploaded, shared at online for NON-commercial use only.                              
'# The Author, '오빠두엑셀(https://www.oppadu.com)' have to be mentioned when you post this code.                            
'########################################################################################################################
 
Dim WithEvents KeyPressWatcher As KeyPressAPI
 
Sub Start_KeyPress()
 
If KeyPressWatcher Is Nothing Then
    Set KeyPressWatcher = New KeyPressAPI
End If
 
KeyPressWatcher.StartKeyPress
 
End Sub
 
Sub End_KeyPress()
 
If KeyPressWatcher Is Nothing Then Exit Sub
KeyPressWatcher.StopKeyPress
 
End Sub
 
Private Sub KeyPressWatcher_KeyPressed(ByVal KeyAscii As LongPtr, ByVal KeyCode As LongPtr, ByVal Target As Range, Cancel As Boolean)
 
'(msgMessage.wParam, iKeyCode, Selection, blnCancel)
 
'// 여기에 키입력시 동작할 명령문을 작성하세요.
 
End Sub

4. 이전 강의에서 만들었던 보조함수/변수 활용하여 명령문 작성하기

이전 강의에서 만들었던 보조함수와 변수를 활용하여 게임시작/종료 명령문을 작성합니다. 이전에 작성했던 함수 목록은 아래와 같습니다.
A. 키입력 이벤트 모듈 (KeyPressAPI)
키입력이벤트(KeyPressAPI) 관련 강의 바로가기

A-1. Start_KeyPress :
키입력 받기 이벤트를 활성화합니다.

A-2. End_KeyPRess :
키입력 받기 이벤트를 종료합니다.

A-3. KeyPressWatcher_KeyPressed :
입력된 키를 함수의 인수로 반환합니다.

B. 시트 초기화 모듈
시트 초기화 모듈 작성강의 바로가기

B-1. Init :
활성화된 셀 기준 시트 초기화

B-2. Sheet_Init :
전체 시트 초기화

C. 공통변수

C-1. Facing :
마리오가 바라보는 방향을 결정

C-2. PointRng :
마리오를 출력할 기준 셀

5. 게임 시작/종료 명령문 작성

A. KeyPressWatcher_KeyPressed 이벤트 명령문 작성

'// ###############################################
'// KeyPressWatcher_KeyPressed 명령문 안에 넣어주세요
'// ###############################################
 
Select Case CLng(KeyAscii)
 
'// 만약 입력된키가
'// 1. 오른쪽 방향키
    Case 39   '/39 = 오른쪽 방향키
        If pointRng.Column >= 76 Then Exit Sub
    '// Facing = True
        Facing = True
    '// 현재 있는 셀을 기준으로 마리오 그림을 초기화 (마리오 그림 삭제)
        init pointRng
    '// 활성화된 셀을 오른쪽으로 한칸 이동
        Set pointRng = pointRng.Offset(0, 1)
    '// 활성화된 셀을 기준으로 오른쪽을 바라보고 있는 마리오 그림을 출력
        Mario_RW pointRng
 
'// 2. 왼쪽방향키
    Case 37  '/37 = 왼쪽 방향키
        If pointRng.Column = 1 Then Exit Sub
    '// Facing = false
        Facing = False
    '// 현재 있는 셀을 기준으로 마리오 그림을 초기화 (마리오 그림 삭제)
        init pointRng
    '// 활성화된 셀을 왼쪽으로 한칸 이동
        Set pointRng = pointRng.Offset(0, -1)
    '// 활성화된 셀을 기준으로 왼쪽을 바라보고 있는 마리오 그림을 출력
        Mario_LW pointRng
 
End Select

B. 게임시작/종료 명령문 작성

Sub Game_Start()
 
'// 혹시모를 상황에 대비하여 게임을 실행하는 범위 외의 셀을 초기화
    GameSheet.Range("CN:XFD").Delete
    GameSheet.Range("47:1048576").Delete
 
'// BGM 출력
    StopSound ActiveWorkbook.Path & "\MarioBGM.mp3"
    PlaySound ActiveWorkbook.Path & "\MarioBGM.mp3"
 
'// 이전에 만들었던 함수 사용 -> 시트 초기화
    Sheet_init
 
'// 마리오게임을 시작하기 위한 시작셀을 지정 (PointRng)
    Set pointRng = GameSheet.Range("F21")
 
'// Facing = True
    Facing = True
 
'// 키입력받기 이벤트를 활성화
    Start_KeyPress
 
End Sub
 
Sub Game_End()
 
'// 키입력 받기를 종료
    End_KeyPress
 
'// 실행중인 마리오 게임 음악 종료
    StopSound ActiveWorkbook.Path & "\MarioBGM.mp3"
 
'// 마리오 게임 종료 음악 출력
    PlaySound ActiveWorkbook.Path & "\PlayerDown.mp3"
 
'// 메세지 박스 출력
    MsgBox "게임이 종료되었습니다."
 
End Sub
guest
0 댓글
Inline Feedbacks
모든 댓글 보기
0
여러분의 생각을 댓글로 남겨주세요.x