PPT - 앱 인벤터 2
Download
Report
Transcript PPT - 앱 인벤터 2
PART 1
앱 인벤터 프로젝트
05 무당벌레 추적
게임 앱의 인기
성공 스토리
<앵그리 버드> 출시 첫 해 5천만 건 이상 다운로드
<무당벌레 추적> 앱을 만들어보자.
1인칭 게임: 사용자는 무당벌레가 되어 게임에 몰입
폰을 기울여 무당벌레를 움직인다.
무엇을 만드는가?
<무당벌레 추적>앱에서 사용자가 할 수 있는 동작들
폰을 기울여 무당벌레를 이동시킴
생명력은 에너지 막대를 통해 확인
진딧물을 잡아먹으면 에너지 회복
자신을 잡아먹으려는 개구리를 피해 다님
무엇을 배우는가?
<무당벌레 추적>앱을 만들며 배우는 것들
여러 개의 ImageSprite를 사용하며, 이들의 충돌을 알아냄
OrientationSensor 컴포넌트로 폰의 기울음을 알아내고, ImageSprite 위치 조정
ImageSprite의 영상을 바꿈
Canvas 컴포넌트에 선분을 그림
하나의 Clock 컴포넌트로 여러 이벤트를 동시 제어
변수를 사용하여 상태 표시 (무당벌레의 에너지 상태)
매개변수를 가진 프로시저
and 블록
프로젝트 생성
프로젝트를 만들고, 라이브 테스팅 연결
프로젝트 이름은 “LadybugChase”
Screen1의 Title 속성은 “무당벌레 추적”
무당벌레, 진딧물, 죽은 무당벌레, 개구리 이미지와 개구리 울음소리 파일 다운로드
파일을 Media 영역에 추가
컴포넌트 설계
<무당벌레 추적> 앱이 사용할 컴포넌트 목록
컴포넌트 초기 배치
점진적 프로그래밍 기법 적용
프로그램 일부분을 만들어 테스트한 후, 제대로 작동하면 다른 부분으로 확장하는 방식
여기서는 먼저 무당벌레를 이동시키는 부분을 만들어봄
• Canvas 컴포넌트 끌어옴
• ImageSprite를 하나 끌어옴
• OrientationSensor 끌어옴
• Clock 끌어옴
컴포넌트 초기 배치
ImageSprite(Ladybug)의 속성들
Interval: 이동 주기, 여기서는 10밀리 초로 설정
Heading: 이동하는 방향을 0~360 사이의 각도 단위로 표시
(0은 오른쪽, 90은 위쪽, 180은 왼쪽, 270은 아래쪽)
Speed: 매 주기마다 이동할 거리
무당벌레 이동시키기
UpdateLadybug 프로시저
OrientationSensor 사용
• Magnitude: 기운 정도를 0~1 범위로 표시
• Angle: 기운 방향을 각도 단위로 표시
Speed는 Magnitude에 100을 곱했으므로 0~100 화소로 설정됨
에너지 막대 표시하기
Canvas 컴포넌트 추가
Width는 Fill parent, Height는 1화소로 설정 (두께가 1인 막대)
빨간 막대를 그려 넣어 에너지 수준 표시
에너지 변수 생성하기
에너지 막대 표시하기
에너지 막대 그리기
절차
• (0,0)에서 (EnenrgyCanvas.Width,0)까지 하얀 선을 그려, 이전 에너지 지움
• (0,0)에서 (enenrgy,0)까지 빨간 선을 그려, 새로운 에너지 표시
‘선을 그린다’는 같은 일을 하는데 단지 선의 길이와 색깔만 다름
매개변수를 가진 프로시저
에너지 막대 표시하기
DrawEnergyLine 프로시저를 만드는 절차
1. to procedure do 블록을 끌어옴
2. 프로시저 이름을 DrawEnergyLine으로 변경
3. 파란 창을 클릭하여 [그림 5-6]과 같이 띄움
4. 매개변수 color 추가
5. 매개변수 length 추가
6. 창을 닫음
7. do 부분을 [그림 5-7]처럼 채움
에너지 막대 표시하기
DisplayEnergy 프로시저
DrawEnergyLine을 두 번 호출하여 에너지 막대를 새로 그려줌
리팩토링
굶어죽음 처리하기
게임 종료를 처리하는 GameOver 프로시저
Enabled 속성을 false로 설정하여 스프라이트의 동작 중단
스프라이트의 Picture 속성을 죽은 무당벌레 이미지로 바꾸어 게임 종료 효과 얻음
굶어죽음 처리하기
UpdateLadybug 프로시저의 확장
에너지 수준을 하나 줄인다.
새로운 에너지 막대를 그린다.
energy가 0이면 게임을 끝낸다.
굶어죽음 처리하기
진딧물 추가하기
진딧물로 게임을 더 신나게!
게임을 좀 더 신나게 하려면 진딧물이 캔버스 여기저기에 나타나야 함
무당벌레가 진딧물을 먹으면 에너지 막대는 1만큼 증가
잡아 먹히면 순간 사라졌다가 임의 위치에 다시 나타남
진딧물을 나타내는 ImageSprite 추가
Picture 속성을 진딧물 이미지로 설정
Interval 속성을 10으로 설정하여 무당벌레와 마찬가지로 10밀리 초마다 이동
Speed 속성을 2로 설정하여 무당벌레가 잡을 수 있을 정도로 조정
진딧물 추가하기
진딧물 이동시키기
실험 결과 대략 50밀리 초에 한 번씩 방향을 바꾸면 좀 더 재미있는 게임으로
Clock1의 타이머가 10밀리 초로 설정되어 있으므로, 타이머 다섯 번 반복에 해당
두 가지 구현 방법
• TimerInterval이 50밀리 초인 또 다른 Clock을 사용
• 또는 그냥 Clock1을 사용하며, random fraction 블록으로 조정
여기서는 두 번째 방법 사용
진딧물 추가하기
프로그램은 어떻게 작동하는가?
타이머가 끝나면 Clock1.Timer 이벤트 발생
10밀리 초로 설정되어 있으므로 이벤트가 초당 100번 발생
• 이벤트가 발생하면 UpdateLadybug와 UpdateAphid를 순서대로 호출
UpdateAphid는 0~1 사이의 난수 생성
• 난수가 0.2보다 작으면(1/5 확률로 발생) 진딧물 방향을 0~360도 사이로 바꿈
무당벌레의 진딧물 먹기
EatAphid 프로시저가 할 일
음식을 먹었으므로 무당벌레의 에너지를 50만큼 증가
진딧물은 먹혔으므로 사라짐 (ImageSprite가 실제로 사라지는 것이 아니라 Visible 속성
을 false로 설정)
진딧물의 Enabled 속성을 false로 바꿔 움직임 멈춤
잠시 후 임의 위치에 진딧물 다시 나타남
무당벌레와 진딧물의 충돌 감지하기
프로그램은 어떻게 작동하는가?
Ladybug.CollidedWith 이벤트는 무당벌레가 다른 ImageSprite와 충돌할 때마다 발생
• 매개변수 other에는 충돌한 ImageSprite의 이름이 저장되어 있음
• 현재는 다른 ImageSprite가 Aphid뿐이므로 굳이 누구와 충돌했는지 확인 불필요
하지만 명시적으로 확인하는 방어적 프로그래밍이 바람직함
• Aphid의 Visible 속성도 확인해야 한다. 왜?
무당벌레와 진딧물의 충돌 감지하기
진딧물 재등장시키기
UpdateAphid 확장
진딧물의 방향을 바꿀 뿐 아니라 재등장시키도록 [그림 5-11]의 UpdateAphid를 확장
프로그램은 어떻게 작동하는가?
• 만일 visible이 참이어서 진딧물이 살아있을 때는, then에서 20%확률로 방향을 바꿈
• 진딧물이 죽은 상태이면, else에서 5%확률로 (20번에 한번 꼴) 재등장
[다시 하기] 버튼 추가하기
개구리의 무당벌레 추적하기
개구리를 나타내는 스프라이트 Frog 추가
Interval을 10, Speed를 1로 설정하여 다른 것들보다 느린 움직임 효과
Clock1.Timer에 call UpdateFrog 추가
프로그램은 어떻게 작동하는가?
10% 확률로 개구리 방향을 무당벌레 쪽으로 돌려놓음
방향 계산은 아크탄젠트 atan2 이용
무당벌레 잡아먹기
Ladybug.CollidedWith 확장
진딧물 뿐만 아니라 개구리와의 충돌도 처리할 수 있게 확장
그림 5-17 무당벌레와 개구리의 충돌을 처리하는 코드 추가
무당벌레 귀환시키기
RestartButton.Click 확장
소리와 진동 효과 추가
밋밋한 게임에 소리와 진동 효과를 추가해 좀 더 재미있게!
전체 앱 프로그램
전체 앱 프로그램
전체 앱 프로그램
확장해 보기
감사합니다.