[엑셀마리오게임] 마리오 이동 명령문
마리오를 움직여보자! 마리오 이동 명령문 (KeyPressAPI 응용)
이 강의에서는 마리오 게임 시리즈에서 핵심이 되는 키 입력 처리를 다룹니다. KeyPressAPI 모듈과 Select Case 문을 조합해 방향키 입력에 따라 마리오를 좌우로 이동시키고, PlaySound 함수에 인수를 추가해 음악을 자유롭게 제어하는 게임 시작·종료 명령문까지 차근차근 정리합니다.
실습자료를 준비했어요
수업에서 사용한 예제 파일과 보충 자료를 한 곳에 정리했습니다!👇
1. 음악출력함수(Play/StopSound)에 인수 추가하기
이전 강의에서 작성한 음악출력/중단 함수(PlaySound/StopSound)에 인수를 추가합니다. 함수 내부 변수로 고정해 두었던 FileName(음악파일 경로)을 인수로 받도록 변경하면, 다른 명령문에서도 PlaySound/StopSound를 엑셀 함수처럼 자유롭게 호출할 수 있습니다.

'// 변경된 음악출력/중단 함수 전문 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” 셀에 ‘등심’이라는 값이 입력되어 있다고 가정하겠습니다.

'// Select Case문 사용예제 Select Case Range("A1").Value '// = 등심 case "사과", "오렌지", "귤" msgbox "과일입니다." case "오이", "배추", "상추" msgbox "야채입니다." case "등심", "안심", "삼겹살" msgbox "고기류입니다." case else msgbox "기타 재료입니다.“ end select
Select Case 문은 먼저 A1 셀의 값인 ‘등심’을 받아옵니다.
이후 각 Case(논리 조건)을 순서대로 비교합니다.
1) 사과 / 오렌지 / 귤인 경우,
⇨ “과일입니다” 안내 메시지 출력
2) 오이 / 배추 / 상추인 경우,
⇨ “야채입니다” 안내 메시지 출력
3) 등심 / 안심 / 삼겹살인 경우,
⇨ “고기류입니다” 안내 메시지 출력
4) 위의 세 경우에 모두 해당하지 않을 경우,
⇨ “기타 재료입니다” 안내 메시지 출력
이 예제에서 받아온 값은 셀 A1의 “등심”이므로 세 번째 Case에 매칭되고, “고기류입니다.” 메시지를 출력한 뒤 Select Case 문은 종료됩니다.
- Select Case 문은 IF 문보다 가독성이 뛰어납니다. 처리해야 할 조건이 3개 이상이라면 Select Case 문 사용을 적극 권장합니다.
- 엑셀 최대 행 개수인 약 100만 개 자료를 단순 반복 계산할 때, Select Case 문은 IF 문보다 약 3~5초 정도 느리게 동작합니다. 프로그래밍 관점에서는 치명적인 차이지만, 엑셀에서 100만 행 단위 자료를 한 번에 다루는 경우는 드물고 대부분 10만 행 이내에서 작업합니다. 따라서 실무에서 체감되는 속도 차이는 거의 없으므로, 여러 조건을 처리할 때는 Select Case 문 사용을 권장합니다.
- Select Case 문은 For 문과 함께 사용해 선택된 범위 안의 셀을 하나씩 비교하며 논리 계산을 할 때 자주 활용됩니다. 이 응용 패턴은 이후 관련 강의에서 자세히 다루겠습니다.
3. GameSheet에 KeyPressAPI 시트모듈 붙여넣기
이전 강의에서 만든 KeyPressAPI 모듈을 GameSheet 시트 모듈 안에 복사하여 붙여넣기 합니다. 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)
- 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
한데 다운해서 되던 파일을 다른곳에 저장하니 음악오류메서지가 나오는데
파일경로 변해그런가요. 대책이 있는지 궁금한데요. 도움을 바래요.
진심바쳐 열심히 강의하시니 정말 고마워요. JINTIE