Corona SDK를 사용하여 첫 번째 Android 게임 작성

작가: Randy Alexander
창조 날짜: 1 4 월 2021
업데이트 날짜: 26 6 월 2024
Anonim
Corona SDK를 사용하여 첫 번째 Android 게임을 작성하세요!
동영상: Corona SDK를 사용하여 첫 번째 Android 게임을 작성하세요!

콘텐츠


Google Play 스토어에서 가장 인기있는 카테고리는 항상 게임이었습니다. 우리 모두 웹 브라우저, 이메일 클라이언트 및 인스턴트 메시징 앱과 같은 주요 생산성 앱을 사용하더라도 게임은 여전히 ​​모바일 경험의 중요한 부분입니다. 따라서 Android 개발을 배우려는 많은 사람들이 게임을 시작하여 시작하고 싶어한다는 것은 놀라운 일이 아닙니다. 또한 솔직히 말해서 게임을 작성하는 것은 생산성 앱을 개발하는 것보다 훨씬 재미 있습니다!

Android의 공식 언어는 Java이고 공식 개발 환경은 Android Studio입니다. Java를 살펴보고 싶다면 Java 기본 자습서를 제안하고 Android Studio를 사용하여 앱을 작성하는 방법을 배우려면 첫 번째 Android 앱 작성에 대한 자습서를 확인하는 것이 좋습니다. 그러나 Java 및 Android 스튜디오 만이 Android 용으로 개발할 수있는 유일한 방법은 아닙니다. 가이드에서 사용 가능한 언어 및 SDK에 대한 개요를 찾을 수 있습니다. Android 앱을 개발하고 싶습니다. 어떤 언어를 학습해야합니까?

프로그래밍 언어 가이드에 언급 된 SDK 중 하나는 주로 게임 작성 용으로 설계된 타사 SDK 인 Corona입니다. Java 대신 Corona는 배우기 쉽지만 강력한 스크립트 언어 인 Lua를 사용합니다. 그러나 Cora는 Lua를 사용하는 유일한 모바일 게임 SDK가 아니며 Cocos2d-X, Marmalade 및 Gideros와 같은 잘 알려진 예가 있습니다.

다운로드 및 설치

Corona를 시작하려면 SDK를 다운로드하여 설치해야합니다. Corona 웹 사이트로 이동하여 다운로드 버튼을 누르십시오. 키트를 다운로드하려면 먼저 계정을 만들어야합니다 (무료). 에뮬레이터에서 프로그램을 실행하는 대신 실제 .apk 파일을 빌드하려면 Java 7을 설치해야하지만 Android SDK를 설치할 필요는 없습니다. Java 7 Development Kit을 설치하려면 Oracle 웹 사이트로 이동하여 "Java SE Development Kit 7u79"섹션을 찾아 PC 버전을 다운로드하십시오.


Corona를 설치하면 활성화해야합니다. 이것은 일회성 프로세스이며 무료입니다. Corona Simulator를 시작하고 라이센스에 동의하십시오. 다운로드에 사용한 이메일 주소와 비밀번호를 입력하고 로그인을 클릭하십시오.

프로젝트 시작

Corona Simulator에서 "New Project"를 클릭하십시오. "Application Name :"필드에 앱 이름을 입력하고 나머지 설정은 기본값으로 유지하십시오. "확인"을 클릭하십시오.

세 개의 창이 나타납니다. 처음 두 가지는 Corona Simulator와 Corona Simular Output입니다. Corona는 또한 프로젝트 파일을 보여주는 파일 탐색기 창을 엽니 다.

프로젝트 디렉토리에있는 대부분의 파일 (일부 23 개)은 응용 프로그램 아이콘 용입니다! 지금 우리에게 가장 중요한 파일은 main.lua앱의 코드를 작성하는 곳입니다.

루아 소개

코드를 작성하기 전에 루아를 휘파람 여행해야합니다. Lua 인터프리터 (컴파일 언어가 아니라 스크립트 언어 임)는 Windows, OS X 및 Linux에서 사용할 수 있습니다. 그러나 Corona에 내장되어 있으므로 현재 추가 항목을 설치할 필요가 없습니다. Lua를 사용하는 가장 쉬운 방법은 온라인 라이브 데모를 사용하는 것입니다.

Lua 온라인에 대한 많은 유용한 자습서를 찾을 수 있으며 Lua Reference Manual, Programming in Lua, The.Lua.Tutorial 및 The Tutorials Point Lua Tutorial을 살펴보십시오.


다음은 Lua의 주요 기능 중 일부를 보여주는 작은 Lua 프로그램입니다.

지역 함수 doubleIt (x)는 i = 1,10,1에 대해 x * 2 끝을 리턴합니다 x = doubleIt (i) if (x == 10) if print ( "ten") else print (doubleIt (i)) end end

위의 코드는 함수, 루프 및 if 문의 세 가지 중요한 Lua 구문을 보여줍니다. 함수 doubleIt () 매우 간단합니다. 전달 된 매개 변수를 두 배로 늘립니다. 엑스.

주요 코드는 ...에 대한 1에서 10까지 반복합니다. doubleIt () 각 반복마다. 반환 값이 10 인 경우 (즉, 나는 5) 그런 다음 코드는 "ten"을 인쇄하고 그렇지 않으면 결과를 인쇄합니다. doubleIt ().

코딩 경험이 있다면 예제 코드를 쉽게 따라갈 수 있어야합니다. 기본 프로그래밍을 배우려면 위의 링크를 통해 기술을 연마하는 것이 좋습니다.

게임 작성

코로나에서 기본 프로그램을 작성하는 것은 간단합니다. 하나의 파일 만 있으면됩니다. main.lua, 코로나가 모든 무거운 짐을지게 해주세요. 우리가 작성할 게임은 간단한 "탭"게임입니다. 풍선이나 폭탄으로 화면이 다운됩니다. 플레이어가 풍선을 탭하면 점수를 획득하고 폭탄을 탭하면 점수가 2로 나뉩니다. 편집해야 할 코드를 작성하려면 main.lua. 모든 텍스트 편집기에서이 작업을 수행 할 수 있습니다.

Corona SDK에는 2D 물리 엔진이 내장되어있어 게임 제작이 매우 쉽습니다. 게임 작성의 첫 번째 단계는 물리 엔진을 초기화하는 것입니다.

지역 물리학 = require ( "physics") physics.start ()

코드는 매우 자명하다. 모듈 물리가로드되고 초기화되며 변수에 할당됩니다 물리학. 엔진을 활성화하려면physics.start () 호출됩니다.

다음으로이 간단한 게임뿐만 아니라 더 복잡한 게임에도 유용한 유용한 변수를 만듭니다. 화면 너비의 절반과 화면 높이의 절반에 대한 값을 유지하십시오.

halfW = display.contentWidth * 0.5 halfH = display.contentHeight * 0.5

그만큼 디스플레이 object는 Corona가 전역 적으로 사용할 수 있도록 사전 정의 된 개체입니다.

이제 실제로 화면에 무언가를 일으키는 첫 번째 단계가 있습니다.

로컬 bkg = display.newImage ( "night_sky.png", halfW, halfH)

뿐만 아니라 같은 속성 contentHeightcontentWidth, 디스플레이 객체에는 유용한 기능이 많이 있습니다. 그만큼 newImage () 함수는 이미지 파일 (이 경우 .png)을 읽고 화면에 표시합니다. 표시 객체는 레이어로 렌더링되므로 화면에 배치하는 첫 번째 이미지이므로 코드가 명시 적으로 변경 작업을 수행하지 않는 한 항상 배경이됩니다. 매개 변수 이미지를 가운데에 놓으라고 코로나에게 지시하십시오.

이 시점에서 에뮬레이터에서 코드를 실행하고 배경 이미지를 볼 수 있습니다. 파일을 저장하면 에뮬레이터에서 파일이 변경되었음을 알리고 다시 시작하도록 제안합니다. 그렇지 않으면 File-> Relaunch를 사용하십시오.

사용자가 풍선을 탭하면 점수를 얻으므로 점수 변수를 초기화하고 화면에 점수를 표시해야합니다.

score = 0 scoreText = display.newText (점수, 반 W, 10)

점수는 상상적으로 명명 된 변수에 유지됩니다 점수,scoreText 점수를 표시하는 객체입니다. 처럼 newImage (), newText () 이 경우 화면에 무언가를 넣으십시오. 이후 scoreText 전역 변수이므로 언제든지 텍스트를 변경할 수 있습니다. 그러나 우리는 곧 그렇게 할 것입니다.

에뮬레이터를 다시 시작하고 화면 상단에 0 점수가 표시됩니다.

왼쪽 : 배경 만. 오른쪽 : 배경과 점수.

이제 좀 더 까다로워 지지만 한 줄씩 설명 할까 걱정하지 마십시오.

local function balloonTouched (event) if (event.phase == "began") then Runtime : removeEventListener ( "enterFrame", event.self) event.target:removeSelf () 점수 = 점수 + 1 scoreText.text = 점수 끝 종료

위의 코드는 balloonTouched () 풍선을 탭할 때마다 호출됩니다. 우리는 아직 풍선을 두 드릴 때마다이 함수를 호출하도록 코로나에게 말하지 않았지만 나중에 올 것입니다. 그러나 그렇게 할 때 호출되는 함수가 있습니다.

탭 또는 터치 이벤트에는 여러 단계가 있으며, 여러 단계는 드래그를 지원합니다. 사용자가 손가락을 물체에 대면 "시작"단계입니다. 손가락을 원하는 방향으로 밀면 "이동"단계입니다. 사용자가 화면에서 손가락을 떼면 "종료"단계입니다.

첫 줄 balloonTouched () "시작"단계에 있는지 확인합니다. 풍선을 제거하고 가능한 빨리 점수를 높이고 싶습니다. "종료"와 같은 다른 단계에 대해 함수가 다시 호출되면 함수는 아무 것도 수행하지 않습니다.

내부만약 문장은 네 줄의 코드입니다. 마지막 두 개를 더 간단하게 다루겠습니다.점수 = 점수 + 1 점수를 1 씩 증가시키고scoreText.text = 점수 새 점수를 반영하도록 화면의 점수 텍스트를 변경합니다. 내가 한 말을 기억해scoreText 전 세계 어디에서나 액세스 할 수있었습니다. 이것이 바로 우리가하는 일입니다.

이제 처음 두 줄입니다. 풍선이나 폭탄이 화면 하단에 떨어지면 여전히 앱의 메모리에 존재하지만 볼 수없는 것입니다. 게임이 진행됨에 따라 오프 스크린 오브젝트의 수가 꾸준히 증가합니다. 따라서 보이지 않는 객체를 삭제하는 메커니즘이 필요합니다. 우리는 그것을 함수라고 부릅니다.오프 스크린아직 작성하지 않았습니다. 이 기능은 게임 도중 프레임 당 한 번 호출됩니다. 풍선을 탭하면 풍선을 삭제하고 풍선이 화면 밖으로 사라 졌는지 확인하는 호출을 제거해야합니다.

라인event.target:removeSelf () 풍선을 삭제합니다. 터치 이벤트가 발생하면 리스너 기능의 매개 변수 중 하나가행사 매개 변수. 이벤트에 대한 기능과 이벤트 유형을 알려줍니다 (예 :event.phase. 또한 어떤 풍선을 눌렀는지 알려줍니다.event.target. 그만큼removeSelf () 함수는 말한 것을 수행하고 객체 (이 경우 풍선)를 삭제합니다.

그 전의 행은 풍선이 화면 하단에서 떨어진 지 확인하기 위해 모든 프레임에서 호출되는 기능인 "enterframe"리스너를 제거합니다. 우리가 글을 쓸 때 더 자세히 살펴볼 것입니다.오프 스크린 청취자 기능.

요약하자면.balloonTouched ()이것이 터치 순서의 시작인지 확인합니다. 그런 다음 풍선이 화면 하단에서 떨어진 지 확인하기 위해 모든 프레임에서 호출되는 기능인 "enterframe"리스너를 제거합니다. 그런 다음 풍선을 삭제하고 점수를 높이고 새 점수를 표시합니다.

그것은 풍선을위한 것이었고 이제 폭탄과 비슷한 것이 필요합니다.

local function bombTouched (event) if (event.phase == "began") then Runtime : removeEventListener ( "enterFrame", event.self) event.target:removeSelf () score = math.floor (score * 0.5) scoreText.text = 점수 끝

보시다시피 점수가 증가하는 대신 점수에 0.5를 곱한 것 (즉, 2로 나눔)을 제외하고 코드가 매우 유사하다는 것을 알 수 있습니다. 그만큼 math.floor () 함수는 점수를 가장 가까운 정수로 내림합니다. 따라서 플레이어의 점수가 3 점이고 폭탄을 두드리면 새로운 점수는 1.5가 아닌 1이됩니다.

나는 언급했다 오프 스크린 () 이전 기능. 이 기능은 객체가 화면을 벗어 났는지 확인하기 위해 매 프레임마다 호출됩니다. 코드는 다음과 같습니다.

로컬 함수 offscreen (self, event) if (self.y == nil) if end (self.y> display.contentHeight + 50) then end : removeEventListener ( "enterFrame", self) self : removeSelf () end end

컴퓨팅에는 경쟁 조건으로 알려진 상황이 있습니다. 여기에는 두 가지 일이 발생하지만 하나는 먼저 발생하거나 다른 하나는 먼저 발생합니다. 경주입니다. 하나의 일이 항상 먼저 발생하는 것처럼 보이기 때문에 일부 경쟁 조건은 보이지 않지만 올바른 조건에서 다른 일이 먼저 발생하면 시스템이 중단되는 그날 흥미로운 버그가 발생할 수 있습니다!

이 간단한 게임에는 두 가지 일이 서로 매우 가까이있을 수 있기 때문에 경쟁 조건이 있습니다. 오프 스크린 () 풍선이 화면에서 사라 졌는지 확인하기 위해 호출되는 함수. 결과적으로 품번 기호를 삭제하는 코드를 호출 한 다음 오프 스크린 () 함수가 호출됩니다 (초당 30 회 발생). 이 이상한 일련의 사건을 해결하려면 오프 스크린 () 기능은 와이 객체의 가치는 (null) 또는 아닙니다. 만약 그렇다면 그것은 객체가 이미 삭제되었음을 의미합니다. 따라서 우리가 찾고있는 드로이드가 아닙니다.

객체가 여전히 재생중인 경우 위치를 확인한 후 화면에서 50 픽셀 떨어진 경우 해당 객체를 삭제하고 리스너를 제거하여 오프 스크린 () 이 객체에 대해 함수가 다시 호출되지 않습니다. 확인하는 코드오프 스크린 () 모든 프레임은 다음 코드 섹션의 일부입니다.

이 게임의 모든 전제는 새로운 풍선이나 폭탄이 계속 화면을 드롭 다운한다는 것입니다. 따라서 새 풍선이나 새 폭탄을 만들 수있는 기능이 필요합니다.

지역 함수 addNewBalloonOrBomb () local startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0.9) if (math.random (1,5) == 1) then-BOMB! 로컬 폭탄 = display.newImage ( "bomb.png", startX, -300) physics.addBody (bomb) bomb.enterFrame = 오프 스크린 런타임 : addEventListener ( "enterFrame", bomb) bomb : addEventListener ( "touch", bombTouched) else -풍선 로컬 풍선 = display.newImage ( "red_balloon.png", startX, -300) physics.addBody (balloon) balloon.enterFrame = offscreen 런타임 : addEventListener ( "enterFrame", balloon) balloon : addEventListener ( "touch", balloonTouched) 엔드 엔드

함수의 첫 번째 줄은 풍선이 어디에서 떨어질지를 결정합니다. 엑스 평면. 풍선이나 폭탄이 항상 중간에 떨어지면 그다지 흥미롭지 않습니다! 그래서startX 화면 너비의 10 %-90 % 사이의 난수입니다.

다음으로 1과 5 사이의 임의의 숫자가 선택됩니다.숫자가 1이면 폭탄이 떨어집니다. 2, 3, 4 또는 5이면 풍선이 떨어집니다. 이것은 폭탄이 약 20 % 떨어질 것임을 의미합니다.

폭탄과 풍선 코드는 매우 비슷합니다. 먼저 이미지 (폭탄 또는 풍선)가newImage().엑스 위치는startX 그 동안 와이 위치가 -300으로 설정되었습니다 (예 : 화면 상단에서). 그 이유는 객체가 화면 영역 외부에서 가시 영역으로 떨어지고 바닥에서 떨어지기를 원하기 때문입니다. 우리는 2D 물리 엔진을 사용하고 있기 때문에 물체에 약간의 초기 거리를 두는 것이 좋으므로 약간의 속도를 얻을 수 있습니다.

전화physics.addBody () 에 의해로드 된 이미지를 가져옵니다 newImage () 물리 엔진의 물체로 바꿉니다 이것은 매우 강력합니다. 모든 이미지 파일은 전화만으로 중력과 충돌에 반응하는 바디로 만들 수 있습니다physics.addBody ().

폭탄 또는 풍선 코드의 마지막 세 줄은 청취자를 설정합니다. 설정enterFrame property는 모든 프레임을 호출하는 함수와런타임 : addEventListener () 설정합니다. 마지막으로 전화balloon : addEventListener () 폭탄이나 풍선을 만지면 어떤 함수를 호출할지 코로나에게 알려줍니다.

이제 게임이 거의 완료되었습니다. 두 줄의 코드가 더 필요합니다.

addNewBalloonOrBomb () timer.performWithDelay (500, addNewBalloonOrBomb, 0)

첫 번째 줄은 명시 적으로 전화하여 첫 번째 폭탄이나 풍선을 쓰러 뜨립니다.addNewBalloonOrBomb (). 두 번째 줄은 호출 할 타이머를 설정합니다addNewBalloonOrBomb () 0.5 초마다 (500 밀리 초) 이것은 새로운 풍선이나 폭탄이 0.5 초마다 떨어짐을 의미합니다.

이제 에뮬레이터에서 게임을 실행할 수 있습니다.

이 게임의 전체 프로젝트 소스 코드 인 main.lua의 전체 목록은 GitHub에서 확인할 수 있습니다.

-------------------------------------------------- -----------------------------------------떨어지는 풍선과 폭탄 게임- 게리 심즈 (Gary Sims)-------------------------------------------- -----------------------------------------------시작 물리 엔진 로컬 물리학 = require ( "physics") physics.start ()-화면 너비와 높이의 절반을 반으로 계산 halfW = display.contentWidth * 0.5 halfH = display.contentHeight * 0.5-배경을 로컬로 설정 bkg = display.newImage ( "night_sky.png", halfW, halfH)-스코어 점수 = 0 scoreText = display.newText (score, halfW, 10)-플레이어가 풍선을 탭하면 호출-로컬 함수를 1 씩 증가시킵니다. event) if (event.phase == "began") Runtime : removeEventListener ( "enterFrame", event.self) event.target:removeSelf () score = score + 1 scoreText.text = score end end-호출시 호출 폭탄이 플레이어에 의해 태핑 됨-페널티 지역 기능으로 점수의 절반입니다. bombTouched (event) if (event.phase == "began") Runtime : removeEventListener ( "enterFrame", event.self) event.target:removeSelf () score = math.floor (score * 0.5) scoreText.text = score end end-떨어진 객체 삭제 화면의 하단 로컬 기능 offscreen (self, event) if (self.y == nil) if end (self.y> display.contentHeight + 50)를 종료 한 다음 Runtime : removeEventListener ( "enterFrame", self) self : removeSelf () end end-새 떨어지는 풍선 또는 폭탄 로컬 함수 추가 addNewBalloonOrBomb ()-GitHub 리포지토리에서 red_ballon.png 및 bomb.png를 찾을 수 있습니다. startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0.9) if (math.random (1,5) == 1)이면-BOMB! 로컬 폭탄 = display.newImage ( "bomb.png", startX, -300) physics.addBody (bomb) bomb.enterFrame = 오프 스크린 런타임 : addEventListener ( "enterFrame", bomb) bomb : addEventListener ( "touch", bombTouched) else -풍선 로컬 풍선 = display.newImage ( "red_balloon.png", startX, -300) physics.addBody (balloon) balloon.enterFrame = offscreen 런타임 : addEventListener ( "enterFrame", balloon) balloon : addEventListener ( "touch", balloonTouched) end end-이제 새 풍선 또는 폭탄 추가 addNewBalloonOrBomb ()-0.5 초마다 새 풍선 또는 폭탄을 계속 추가 timer.performWithDelay (500, addNewBalloonOrBomb, 0)

다음 단계

다음 단계는 실제 안드로이드 기기에서 게임을하는 것입니다. .apk 파일을 빌드하려면 File-> Build for Android…를 클릭하고 필드를 채우십시오. 결과는 장치에 복사 한 다음 설치할 수있는 .apk 파일입니다. 알 수없는 출처에서 앱을 설치할 수 있도록 장치를 구성했는지 확인해야합니다. Amazon Appstore를 설치하기 위해 이것을 설정해야하기 때문에 Amazon에는 이에 대한 좋은 문서가 있습니다. Corona에는 Android 장치에서 앱을 서명, 빌드 및 테스트하는 방법에 대한 가이드도 있습니다.

게임이 장치에 성공적으로 설치되면 다음으로해야 할 일은 게임을 개선하는 것입니다. 예를 들어, 풍선이나 폭탄을 두드리는 모든 것을“팝”또는“뱅”사운드를 추가해보십시오. 코로나에는 다음과 같은 API가 있습니다.media.playEventSound ().

아니면 세 번째 유형의 객체를 추가하려고 시도하지 마십시오. 현재 점수를 두 배로 늘리는 슈퍼 부스트 또는 배경 음악은 어떻습니까?

마무리

SDK가 OpenGL과 같은 것을 처리하고 내장 2D 물리 엔진을 포함하기 때문에 Corona로 게임을 작성하는 것은 매우 간단합니다. 또한 Lua는 배우기 쉽고 프로그래밍 경험이 가장 적은 사람에게는 어렵지 않아야합니다. Coronalabs 웹 사이트에는 많은 안내서와 자습서를 포함하여 많은 문서가 있습니다.

100 줄 미만의 코드에는 실제 게임이 있습니다. 좋습니다. 상을받지는 않지만 Corona SDK의 강력 함과 유연성을 보여줍니다.

291t에 오신 것을 환영합니다! 지난주 헤드 라인은 다음과 같습니다.Google은 강력한 음성 녹음기 앱을 구형 Pixel 기기로 이식하고 있습니다. 뉴스는 이번 주 초에 나왔습니다. 다른 Pixel 4 소프트웨어 기능이 종종 과장된 천체 사진 모드를 포함하여 구형 Pixel 장치에도 적용되기 때문에 이치에 맞습니다. 우리는이 앱이 궁극적으로 더 많은 ...

CE 2019가 하루도 채 걸리지 않아 LG의 디스플레이 암은 거대한 TV에서 휴대용 디스플레이에 이르는 11 개의 OLED 및 LCD 디스플레이를 발표했다.먼저 88 인치 8K Crytal ound OLED 디스플레이가 있는데, 여기에는 3.2.2 채널 사운드 시스템이 내장되어 있습니다. 즉, 화면 자체에서 소리가 나옵니다. 전용 스피커가 없습니다....

우리의 선택