카테고리 보관물: 개발

벽돌깨기 게임

개요

예전에 즐겼던 벽돌깨기 게임을 만들어 보면 좋겠다는 생각을 오래전부터 하고 있었습니다. 간단하게 기획하고 실제로 만들어 보기로 했습니다.

개발 과정

개발을 시작했을 때 어렵지 않게 구현을 할 수 있을 것이라고 생각했습니다. 일단 벽돌, 공, 막대 이 세가지 요소를 배치하고 기본적인 로직을 구현했습니다.

메인화면

그 다음 화면의 좌우, 위쪽에 벽을 만들고 공이 벽에 부딪치도록 했습니다.

첫 번째 문제

큰 문제 없이 동작할 것으로 생각하고 테스트 해보니 막대, 벽돌, 벽에 부딪칠 때 어떤 경우에 공이 튕겨 나오지 않고 벽을 따라 이동하는 경우가 있었습니다. 가만히 생각해 보니 입사각이 아주 작은 경우 그렇게 되는 것이 실제 물리 법칙에 맞았습니다. 그러나 게임에서는 진행이 불가능해져서 해결해야 할 문제였습니다.

이리저리 변경해 보다가 문득 이전에 오락실에 있었던 게임은 어떻게 동작했는지 확인해 보았습니다. 실제 물리 법칙을 따르지 않는 것을 확인했습니다.

공이 투사체이므로 ProjectileMovement 를 이용해서 구현했습니다. 공에 원래 없었는데 부자연스러운 동작을 보여 추가했습니다.

두 번째 문제

기본적인 동작은 완료되어 다양한 모양의 스테이지를 추가하는 작업을 진행했습니다. 처음에는 간단하게 코드에 추가해서 테스트 해 보았습니다. 실제 기기에 올려보니 세로 방향이라서 벽돌을 길게 배치할 필요가 있었습니다.

코드에 스테이지 정보가 있으면 나중에 수정하기가 너무 어려울 것 같아서 다른 방법을 알아보게 되었습니다.

이리저리 찾아보니 DataTable 이라는 클래스가 있었습니다. 별도의 파일에 게임에 필요한 정보를 저장해 놓고 그것을 사용할 수 있도록 해 줍니다.

스테이지 정보를 별도의 텍스트 파일로 만들고 그 정보를 읽어서 구현하는 방법으로 진행했습니다.

게임 화면

처음에 생각했던 것 보다는 개발하는데 어려웠습니다. 간단해 보이는데 그 안에서 동작하고 판단하고 처리하는 부분은 쉽지 않았습니다.

다시 한번 쉬운 것은 없고 초기에 문제가 될 것 같은 것을 미리미리 정리해 두는 것이 중요하다고 느꼈습니다.

여기에서 다운로드 받으실 수 있습니다. 광고가 포함되어 있습니다.

Android 13(API level 33) 이상 Storage 관련 오류 해결

개요

새로운 앱을 업로드 하는데 API level 34 이상이어야 했습니다. API level 이 낮은 장비에서 잘 동작해서 34 로 변경 후 구글플레이에 업로드 했습니다. 그런데 앱이 거부되었습니다.

거부 이유

메일의 제목은 조치 필요: 앱이 Google Play 정책을 준수하지 않음 이었습니다. 세부 내용을 확인해 보니 다음과 같았습니다.

발견된 문제: 손상된 기능 정책 위반

비정상 기능 정책을 준수하지 않는 콘텐츠가 포함되어 있습니다.

  • 앱이 로드되지만 응답하지 않음
메일 내용

문제 파악

이미지 까지 첨부되어 있어 확인해 보았습니다. 내용은 Storage 에 쓰기 권한을 요청하는 화면이었습니다.

첨부된 이미지

단순히 SETTINGS 를 눌러 권한을 허용하면 될 것 같은데 뭔가 좀 이상했습니다.

API level 34 를 지원하는 실제 테스트 기기가 없어서 에뮬레이터를 이용해서 테스트 해 보았습니다. 앱을 설치하고 실행하니 위와 같은 화면이 나타났습니다. SETTINGS 를 터치하니 앱의 권한 관리 화면으로 이동 되었습니다. 그런데 권한을 추가할 수 없고 요청된 권한 사항이 없다는 글자만 나타나고 비활성화 되어 있는 상태였습니다.

앱이 위의 화면에서 설정 화면으로 이동만 되고 더 이상 할 수 있는 것이 없어서 정상적으로 실행되지 않는다는 것을 확인했습니다.

문제 해결

이전 API level 에서는 처음에 나타나는 권한 부여만 선택해 주면 문제 없이 동작했습니다. 문제는 API level 33 이상에서 나타나는 것으로 생각되었습니다. 이리저리 찾아보니 AndroidManifest.xml 파일에 권한 관련 설정 부분에 추가 내용이 필요했습니다.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />

android:maxSdkVersion=”32″ 를 위와 같이 추가해서 다시 업로드 하면 문제 없이 앱이 등록되었습니다.