2013 여름방학부산광역시정보영재교육원강좌 스마트폰앱개발기초 교육자료및프로젝트결과보고서 기간 : 2013.7.20~7.26 대상 : 중 3 창의성반 지도 : 동의과학대학교김종현교수 1
수업목차 1. Objective-C 기초 (1) Hello World 작성 (2) 기본클래스작성, property 변수, 메소드 (3) Wizard 게임 (4) Island Survival 게임 2. ios 앱프로그래밍기초 (1) Story Board 사용법 - Hello iphone 작성 (2) Hello Fun 앱제작 - IBOutLet, IBAction 이해및활용 (4) 프로그래밍문제해결 - Hello Fun 앱 upgrade 3. Tap Me 게임앱제작 - 다함께 Tap Me 게임제작 - UILabel, UIButton, NSTimer, UIAlertView.. - 게임알고리즘 4. 기초프로젝트수행 (2 인 1 조 or 1 인 ) (1) Tap Me 게임창의적기능추가 5. 수업참고자료 : A Tutorial series about ios for high school students (1) http://www.raywenderlich.com/5600/ios-for-high-school-studentsgetting-started (2) http://www.raywenderlich.com/11079/ios-for-high-schoolstudents-text-adventure-game (3) http://www.raywenderlich.com/25561/ios-for-high-schoolstudents-making-your-first-ios-app-part-1 (4) http://www.raywenderlich.com/27191/ios-for-high-schoolersmaking-your-own-ios-app-part-2 2
Day 1. Objective-C 기초 (Wizard Game) ( 예제프로그램 1) Wizard Game // Wizard Gmae #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) @autoreleasepool // 변수선언 ( 정의 ) float strengh; // 힘 ( 강함 ) float intelligence; // 지능 float speed; // 속도 float alchemy_skill; // 연금술기술, alchemy: 연금술, skill: 기술 float sum; // 합계 float avg; // 평균 NSLog(@"What is your strength(1-10)?"); scanf("%f", &strengh); NSLog(@"What is your intelligence(1-10)?"); scanf("%f", &intelligence); NSLog(@"What is your speed(1-10)?"); scanf("%f", &speed); NSLog(@"What is your alchemy skill(1-10)?"); scanf("%f", &alchemy_skill); sum = strengh + intelligence + speed + alchemy_skill; avg = (strengh + intelligence + speed + alchemy_skill) / 4; NSLog(@"sum = %f avg = %f", sum, avg); //Here are the logical statements that determine a response based on the user's input for various skills! if (strength >= 8 && intelligence >= 8 && (alchemy_skill + speed)/2 < 7) NSLog(@"You are a clever brute. You are known for your defense of Aristotle's logic, while being equally admired by competent athletes. In the gladiator ring, your intelligence outmatches beings of even greater strength."); if (speed >= 8 && intelligence >= 8 && (alchemy_skill + strength)/2 < 7) NSLog(@"You are an assassin. Your sharp blade and agile mind gleam in the shadows.being not particularly confrontational, you wear an aura of mystery."); if (alchemy_skill >= 8 && intelligence >= 8 && (strength + speed)/2 < 7) NSLog(@"You are a cleric. You summon mysterious powers to heal and protect."); 3
if (avg >= 8 && avg <= 9) NSLog(@"You are a mage, apprenticed to a great wizard. master of the universe."); One day you may be a if (avg >= 5 && avg <= 7) NSLog(@"You are a commoner. You will live a long life, and tend to your property."); if (avg >= 1 && avg <= 4) NSLog(@"You are a peasant. Your lord is cruel. He does not compensate you for the work that you accomplish. You only dream of being successful. :("); return 0; ( 프로그래밍문제 ) 게임종료및새로하기추가 위의 Wizard 프로그램은 " 프로그램종료 " 하는부분이없다. NSLog(@"1.Restart Game. 2.STop"); 을출력하여게임세로하기와게임종료하는부분을추가하여수정하시오. 4
Day 2. Objective-C 기초 ( 클래스작성 ) 1. 클래스, 메소드선언과정의 ( 프로그래밍예제 ) 클래스정의및사용 5
// main.m // MyClass #import <Foundation/Foundation.h> // interface 정의 @interface MyClass : NSObject // 멤버변수정의 int a; int b; // 메소드정의 - (void)seta:(int)x; - (void)setb:(int)y; - (int)add; @end // implementation 정의 @implementation MyClass - (void)seta:(int)x a = x; - (void)setb:(int)y b = y; - (int)add return a + b; @end int main(int argc, const char * argv[]) @autoreleasepool // 객체 ( 혹은인스턴스 ) 생성및메모리할당 MyClass *myclass = [[MyClass alloc] init]; [myclass seta:15]; [myclass setb:20]; NSLog(@"Sum is %i", [myclass add]); return 0; 6
결과값은? 2. 다중인수메소드 (Multiple Parameter Method) ( 프로그래밍예제 1) 다중인자 // main.m // MultiPara #import <Foundation/Foundation.h> @interface MultiPara : NSObject // 다중인수정의 - (int)sum:(int)a andb:(int)b andc:(int)c; @end @implementation MultiPara - (int)sum:(int)a andb:(int)b andc:(int)c return a + b + c; @end int main(int argc, const char * argv[]) @autoreleasepool MultiPara *class = [[MultiPara alloc] init]; NSLog(@"Sum is %i", [class sum:5 andb:10 andc:20]); return 0; 7
( 프로그래밍예제 2) main.m 에있는클래스정의를헤드화일 (.h) 과구현화일 (.m) 으로 분리하는방법 MyClass.h #import <Foundation/Foundation.h> @interface MyClass : NSObject // 다중인수선언 -(int)sum:(int)a andb:(int)b andc:(int)c; @end MyClass.m #import "MyClass.h" @implementation MyClass -(int)sum:(int)a andb:(int)b andc:(int)c return a + b + c; @end maim.m #import <Foundation/Foundation.h> #import "MyClass.h" int main(int argc, const char * argv[]) @autoreleasepool MyClass *class = [[MyClass alloc]init]; NSLog(@"Sum is : %i", [class sum:5 andb:7 andc:10]); return 0; Output: Sum is : 22 ( 프로그래밍예제 3) 사칙계산기 (Calculator) 만들기 // Calculator.h // Calaculator #import <Foundation/Foundation.h> @interface Calculator : NSObject double accmulator; // 계산값의누적 // 메소드정의 - (void)setaccmulator:(double)value; - (double)accumlator; 8
// 사칙연자사메소드정의 - (void)add:(double)value; - (void)minus:(double)vlaue; @end // Calculator.m #import "Calculator.h" @implementation Calculator - (void)setaccmulator:(double)value accmulator = value; - (double)accumlator return accmulator; - (void)add:(double)value accmulator = accmulator + value; - (void)minus:(double)value accmulator = accmulator - value; @end // main.m // Calaculator // // Created by Jonghyun Kim on 13. 7. 21.. // Copyright (c) 2013 년 Jonghyun Kim. All rights reserved. // #import <Foundation/Foundation.h> #import "Calculator.h" int main(int argc, const char * argv[]) @autoreleasepool Calculator *deskcalc; deskcalc = [[Calculator alloc] init]; [deskcalc setaccmulator:0]; [deskcalc add:100]; [deskcalc minus:25]; NSLog(@"Result is %f", [deskcalc accumlator]); return 0; 9
( 결과값은?) ( 프로그래밍문제 ) 위 Calculator 프로그램을사칙연산이가능하도록곱하기 (multi), 나누기 (divide) 메소드를추가하고, 연산된값을초기화 (0) 할수있는 (accmulator 의 값을 0) clear 메소드를추가하라. 3. Property 변수 - 멤버변수를클래스외부에서사용하기위하여세터 (setter) 와게터 (getter) 메소드제공 - 프로퍼티를이용하면메소드호출 ([ ]) 대신에점 (.) 을이용해서접근가능함 - 헤더파일에는 @property 지시자를사용하여선언, 구현화일에는 @synthesis 지시자를사용하여점 (.) 연산자이용시사용할게터와세터메소드를컴파일러가 자동생성하도록함. 최근 ios 6.0 부터는 @synthesis 됨 ( aut( 결과값은?) 를사용하지않아도 ( 프로그램예제 ) Rectangle 클래스정의, 인스턴스변수, 인스턴스메소드 // main.m // Rectangle #import <Foundation/Foundation.h> @interface Rectangle : NSObject int width; // 넓이 int height; // 높이 - (void)setwidth:(int)newwidth; - (int)width; - (void)setheight:(int)newheight; - (int)height; - (int)size; @end @implementation Rectangle - (void)setwidth:(int)newwidth width = newwidth; - (int)width 10
return width; - (void)setheight:(int)newheight height = newheight; - (int)height return height; - (int)size return width * height; @end int main(int argc, const char * argv[]) @autoreleasepool Rectangle *r = [[Rectangle alloc]init]; [r setheight:10]; [r setwidth:20]; NSLog(@" 사각형의넓이는 : %i", [r size]); return 0; ( 프로그래밍문제 2) 위프로그램예제를 property 변수를사용하여다시프로그래밍하시오. // main.m // Rectangle #import <Foundation/Foundation.h> @interface Rectangle : NSObject int _width; int _height; - (int)size; // property 변수선언 @property int width, height; @end 11
@implementation Rectangle - (int)size return _width * _height; @end int main(int argc, const char * argv[]) @autoreleasepool Rectangle *r = [[Rectangle alloc]init]; //[r setheight:10]; //[r setwidth:20]; r.height = 10; r.width = 20; NSLog(@" 사각형의넓이는 : %i", [r size]); return 0; ( 프로그래밍문제 3) 위 Calculator 프로그램을사칙연산이가능하도록곱하기 (multi), 나누기 (divide) 메소드를추가하고, 연산된값을초기화 (0) 할수있는 (accmulator 의 값을 0) clear 메소드를추가하라. 12
Day 3. Story Board 를사용한 ButtonFun 제작 1. Story Board 2. ButtonViewController.h // ButtonFunViewController.h // ButtonFun #import <UIKit/UIKit.h> @interface ButtonFunViewController : UIViewController @property (strong, nonatomic) IBOutlet UILabel *mylabel; - (IBAction)buttonPressed:(id)sender; @end 3. ButtonViewController.m // ButtonFunViewController.m // ButtonFun #import "ButtonFunViewController.h" @implementation ButtonFunViewController 13
- (IBAction)buttonPressed:(id)sender NSString *title = [sender titleforstate:uicontrolstatenormal]; NSString *newstr = [NSString stringwithformat:@"%@ is pressed", title]; _mylabel.text = newstr; @end 4. 시뮬레이터결과 ( 프로그래밍문제 ) 두개의버튼 (Left, Right) 를각각선택하면 Label 에아래와같이 출력하도록하시오. 14
15
Day 4. Mini 프로젝트 : Tap Me 게임제작 01 < 내용 > "Ray Wenderlich 의 ios for High School" 의 Tap Me 앱소스를다음과같이창의적인기능을추가하여수정함 1. "Tap Me" 버튼을최초터치할때 Timer 가작동을시작함 2. 최종결과값을보여주는 UIAlertView 에 "Game Stop" 가능추가 3. 게임랭킹을보여주는기능을작성해보기바람 ( 게임스코어를배열등에저장...) 4. 기타등등좋은아이디어를추가하기... < 앱스크린 > 16
< 스토리보드 > 17
< 소스코드 > // TapMeViewController.h // TapMe #import <UIKit/UIKit.h> @interface TapMeViewController : UIViewController <UIAlertViewDelegate> NSInteger count; // 현재 tap count 기록 NSInteger seconds; // 현재시간기록 NSTimer *timer; // 타이머클래스변수 bool timeron; // ON 이면타이머작동, OFF 이면타이머중지 @property (strong, nonatomic) IBOutlet UILabel *scorelabel; @property (strong, nonatomic) IBOutlet UILabel *timerlabel; - (IBAction)buttonPressed:(id)sender; @end // TapMeViewController.m #import "TapMeViewController.h" @interface TapMeViewController () @end @implementation TapMeViewController - (void)viewdidload [super viewdidload]; // Do any additional setup after loading the view, typically from a nib. // 타이머메소들실행... [self setupgame]; - (void)didreceivememorywarning [super didreceivememorywarning]; // Dispose of any resources that can be recreated. - (IBAction)buttonPressed:(id)sender timeron = true; // 버튼을누르면타이머작동시작 count++; self.scorelabel.text = [NSString stringwithformat:@"score\n%i", count]; - (void)setupgame timeron = false; // Timer Switch Off seconds = 30; count = 0; // 화면초기화 _timerlabel.text = [NSString stringwithformat:@"time: %i", seconds]; // 타이머가동 timer = [NSTimer scheduledtimerwithtimeinterval:1.0f target:self // 내자신이객체에서타이머호출 selector:@selector(substracttime) userinfo:nil 18
repeats:yes]; - (void)substracttime if(timeron) seconds--; // Timer 작동 _timerlabel.text = [NSString stringwithformat:@"time: %i", seconds]; if (seconds == 0) [timer invalidate]; // UIAlertView 를사용하여최종 score 를출력... NSString *finalscore = [NSString stringwithformat:@"you scored %i points",count]; UIAlertView *alert = [[UIAlertView alloc] initwithtitle:@"time is up" message:finalscore delegate:self cancelbuttontitle:@"play Again" otherbuttontitles:@"game Stop", nil]; [alert show]; timeron = false; - (void)alertview:(uialertview *)alertview clickedbuttonatindex:(nsinteger)buttonindex if (buttonindex == 0) [self setupgame]; else if (buttonindex == 1) exit(0); @end 19
Day 5~6. Mini 프로젝트 : Tap Me 게임제작 02 * 프로젝트결과보고서양식을다운로드받아잘작성하여, 김종현 교수 (jhkim@dit.ac.kr) 로보내기바람 ( 파일명 : 장서현 _ 프로젝트 _ 보고서.docx). 1. 그림, 사운드등리소스파일 (TabMe_Resources.zip) 첨부 2. 앱스크린 3. 게임음악 ( 오디오 ) 처리 - <AVFoundation/AVFoundation.h> - AVAudioPlayer 클래스사용법 4. 소스코드 // TabMeViewController.h // MyTabMe01 #import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> @interface TabMeViewController : UIViewController <UIAlertViewDelegate> NSInteger count; 20
NSInteger seconds; NSTimer *timer; // AVAudioPlayer 객체선언 AVAudioPlayer *buttonbeep; // 버튼터치할때음원 AVAudioPlayer *secondbeep; // Timer 음원 AVAudioPlayer *backgroundmusic; // 게임빽그라운드음원 @property (strong, nonatomic) IBOutlet UILabel *scorelabel; @property (strong, nonatomic) IBOutlet UILabel *timerlabel; - (IBAction)buttonPressed:(id)sender; @end // TabMeViewController.m // MyTabMe01 #import "TabMeViewController.h" @implementation TabMeViewController - (void)viewdidload [super viewdidload]; //self.view.backgroundcolor = [UIColor purplecolor]; // ADD THIS!! self.view.backgroundcolor = [UIColor colorwithpatternimage:[uiimageimagenamed:@"bg_tile.png"]]; self.scorelabel.backgroundcolor = [UIColor colorwithpatternimage: [UIImage imagenamed:@"field_score.png"]]; self.timerlabel.backgroundcolor = [UIColor colorwithpatternimage: [UIImage imagenamed:@"field_time.png"]]; // 오디오설정메소드 (setupaudioplayerwithfile) 을실행하여 AVAudioPlater 객체생성 buttonbeep = [self setupaudioplayerwithfile:@"buttontap" type:@"wav"]; secondbeep = [self setupaudioplayerwithfile:@"secondbeep" type:@"wav"]; backgroundmusic = [self setupaudioplayerwithfile:@"hallofthemountainking"type:@"mp3"]; [self setupgame]; - (AVAudioPlayer *)setupaudioplayerwithfile:(nsstring *)file type:(nsstring *)type // 1. 오디오파일명을인자로받아 PC 파일시스템에있는오디오파일의위치를찾음 (path) NSString *path = [[NSBundle mainbundle] pathforresource:file oftype:type]; NSURL *url = [NSURL fileurlwithpath:path]; NSLog(@"%@", url); // 2. 인자로받은오디오파일이존재하지않을때예외처리 NSError *error; // 3. 오디오파일이있는위치 (path) 와파일을사용하여 AVAudioPlayer 객체생성 AVAudioPlayer *audioplayer = [[AVAudioPlayer alloc] initwithcontentsofurl:urlerror:&error]; // 4. 오디오파일이존재하지않을때예외처리 if (!audioplayer) NSLog(@"%@",[error description]); // 5. 메소드을호출한곳으로객체를넘겨줌 return audioplayer; 21
- (IBAction)buttonPressed:(id)sender NSLog(@"button pressed!!!"); //_scorelabel.text = @"Pressed"; count ++; _scorelabel.text = [NSString stringwithformat:@"score\n%i", count]; [buttonbeep play]; // Timer 설정 - (void)setupgame seconds = 30; count = 0; [backgroundmusic setvolume:0.3]; [backgroundmusic play]; _timerlabel.text = [NSString stringwithformat:@"time: %i", seconds]; _scorelabel.text = [NSString stringwithformat:@"score\n%i", count]; timer = [NSTimer scheduledtimerwithtimeinterval:1.0f target:self selector:@selector(subtracttime) userinfo:nil repeats:yes]; - (void)subtracttime seconds--; _timerlabel.text = [NSString stringwithformat:@"time: %i", seconds]; [secondbeep play]; if (seconds == 0) [timer invalidate]; UIAlertView *alert = [[UIAlertView alloc] initwithtitle:@"time is up!" message:[nsstring stringwithformat:@"you scored %i points", count] delegate:self cancelbuttontitle:@"play Again" otherbuttontitles:nil]; [alert show]; - (void)alertview:(uialertview *)alertview clickedbuttonatindex:(nsinteger)buttonindex [self setupgame]; @end 22
수업후기 1. 프로젝트내용 프로젝트과제인어플리케이션은일정시간을두고얼마만큼가운데의버튼을클릭하는지를게임으로만든것입니다. 이름은 TapMe 이며, 디자인은미국의고등학생들을위한 ios 프로그래밍자료인 (http://www.raywenderlich.com/25561/iosfor-high-school-students-making-your-first-ios-app-part-1) 에서참고하였습니다. 주어진시간은 30 초이며이시간내에최대한많이누를수록점수 (Score) 가많이올라갑니다. 원래어플리케이션을실행하자마자바로타이머가작동하였으나, 버튼을클릭하는순간부터시간이흘러야점수를확실하게측정할수있다고판단하여첫클릭을하는순간부터시간이흐르도록설정하였습니다. 시간이모두흐르면끝났다는메세지와함께점수를보여주고, 메세지의버튼을누르면 Time 은다시 30 으로리셋이되며 Tap Me! 버튼을누를때까지흐르지않는, 즉어플리케이션을실행했던그순간으로돌아갑니다. 어플리케이션을만들고테스트하던중, 30 초가지날때까지계속기다리는것이불편하여서리셋 (Reset) 기능을넣었습니다. 처음리셋버튼을넣을때각함수에대해연결하는방법을몰랐지 ios 6 프로그래밍 을보고공부하였고 Reset 기능을추가할수있었습니다. 하단에 Reset 버튼을누르게되면다시맨처음상태로돌아가고, 다시시작할수있습니다. 점수를데이터로저장하는방법을찾아보았지만결국알수없었고어쩔수없이 어플리케이션이켜져있는동안가장높은기록을 Max 값에넣어두었습니다. 그리고 시간이끝나면나오는메세지에함께뜨도록만들었습니다. 디자인작업을할때 Retina 와 non-retina 를각자따로작업해주었고, 그결과 디자인이모든아이폰에맞도록만들었습니다. 23
2. 프로젝트소감 처음으로 Xcode 를통해서게임을만들어보았습니다. Tap Me! 어플리케이션을만들기시작했을때는내가과연이런걸만들수있을까하는생각과안드로이드버전으로도만들어봤는데 ios 버전이라고못만들게뭐가있는가하는생각이겹쳐있었습니다. 계속만들면서프로그래밍실력이느는것을느꼈고저는프로그래밍에자신감이붙을수있었습니다. 그리고기본과제에만만족하는것이아닌, 제가원하는여러가지기능을추가시켰습니다. 예를들어 Reset 버튼이나 Max 값에들어있는기록을들수있는데, 이런기능을추가시키면서공부할수있어서더욱보람찼습니다. 이어플리케이션은처음만든게임인만큼정이들어있습니다. 그래서조금더 수정하고다듬어서제자신만의독특한어플리케이션을만들고싶습니다. 나아가 24
제가지금까지필요했던어플리케이션을누구에게의존하여만들어달라고하는게 아니라제가직접만들어서실용적으로사용하고싶습니다. 그리고이 어플리케이션으로다른사람들을돕고싶습니다. - 중 3 창의성반김기홍작성 - 25
프로젝트최종보고서 26
부산광역시정보영재교육원여름방학집중기수업프로젝트보고서 제목 : 아이폰 Tap Me 게임앱개발 이름 : 김기홍소속 : 중 3 창의성반지도 : 동의과학대학교김종현교수님날짜 : 2013. 7.20 ~ 7.26 27
1. 아이폰결과화면 28
2. 프로젝트내용이어플리케이션은일정시간을두고얼마만큼가운데의버튼을클릭하는지를게임으로만든것입니다. 이름은 TabMe 이며, 디자인은 (http://www.raywenderlich.com/25561/ios-for-high-school-students-making-your-first-ios-app-part- 1) 에서참고하였습니다. 주어진시간은 30 초이며이시간내에최대한많이누를수록점수 (Score) 가많이올라갑니다. 원래어플리케이션을실행하자마자바로타이머가작동하였으나, 버튼을클릭하는순간부터시간이흘러야점수를확실하게측정할수있다고판단하여첫클릭을하는순간부터시간이흐르도록설정하였습니다. 시간이모두흐르면끝났다는메세지와함께점수를보여주고, 메세지의버튼을누르면 Time 은다시 30 으로리셋이되며 Tap Me! 버튼을누를때까지흐르지않는, 즉어플리케이션을실행했던그순간으로돌아갑니다. 어플리케이션을만들고테스트하던중, 30 초가지날때까지계속기다리는것이불편하여서리셋 (Reset) 기능을넣었습니다. 처음리셋버튼을넣을때각함수에대해연결하는방법을몰랐지 ios 6 프로그래밍 을보고공부하였고 Reset 기능을추가할수있었습니다. 하단에 Reset 버튼을누르게되면다시맨처음상태로돌아가고, 다시시작할수있습니다. 점수를데이터로저장하는방법을찾아보았지만결국알수없었고어쩔수없이어플리케이션이켜져있는동안가장높은기록을 Max 값에넣어두었습니다. 그리고시간이끝나면나오는메세지에함께뜨도록만들었습니다. 디자인작업을할때 Retina 와 non-retina 를각자따로작업해주었고, 그결과디자인이모든아이폰에맞도록만들었습니다. 3. 소감처음으로 Xcode 를통해서게임을만들어보았습니다. Tab Me! 어플리케이션을만들기시작했을때는내가과연이런걸만들수있을까하는생각과안드로이드버전으로도만들어봤는데 ios 버전이라고못만들게뭐가있는가하는생각이겹쳐있었습니다. 계속만들면서프로그래밍실력이느는것을느꼈고저는프로그래밍에자신감이붙을수있었습니다. 그리고기본과제에만만족하는것이아닌, 제가원하는여러가지기능을추가시켰습니다. 예를들어 Reset 버튼이나 Max 값에들어있는기록을들수있는데, 이런기능을추가시키면서공부할수있어서더욱보람찼습니다. 이어플리케이션은처음만든게임인만큼정이들어있습니다. 그래서조금더수정하고다듬어서제자신만의독특한어플리케이션을만들고싶습니다. 나아가제가지금까지필요했던어플리케이션을누구에게의존하여만들어달라고하는게아니라제가직접만들어서실용적으로사용하고싶습니다. 그리고이어플리케이션으로다른사람들을돕고싶습니다. 29
부산광역시정보영재교육원여름방학집중기수업프로젝트보고서 제목 : 아이폰 Tap Me 게임앱개발 이름 : 김나영소속 : 중 3 창의성반지도 : 동의과학대학교김종현교수날짜 : 2013.07.22-2013.07.26 30
1. 아이폰결과화면 Tap Me 앱첫실행화면 1 회클릭 = 스코어 1, 타이머동시시작 30 초경과점수결과, 재시작클릭, 첫화면으로리셋재시작여부팝업창 (* 게임종료클릭시게임종료 ( 아이폰바탕화면으로..) ) 31
2. 내용 ( 소스파일캡쳐 ) 32
33
34
3. 소감아직프로그래밍실력이많이부족하고개인적으로 x-code 를사용하여게임을만들어본적이없어서 Tap Me 앱을만들어낼수있을까하는생각이먼저들었지만프로젝트로친구들, 선생님과함께할수있는기회가주어져서많이배울수있는기회가되었습니다. 새로운코드를배운것은물론이고게임을만들면서발생하는오류들을찾아내서고칠때왜이런오류가났을까에대해생각하게되고프로그래밍을할때구조를어떤식으로짜야하는지조금더감을잡을수있게된것같았습니다. 그리고이게임을만들면서외부이미지나사운드파일을처음첨부해보았는데첨부한파일을스토리보드에서적용시키지않고코드로적용시키는것도신기했습니다. 제손으로직접만들어낸첫작품이라부족한모습도많이보이지만그래도조금이나마발전했다는생각이들어서매우보람찬시간이였고지금까지배운것으로만들수있는앱이몇개되지않는다는생각이들지만꾸준히공부하여서제가상상하던게임이나실생활에필요하다고생각되는앱들을스스로개발할수있고, 주변에서원하는기술들을만들수있는정도의능력을갖추고싶습니다. 지금보다더크게발전해나갈 IT 계에기여할수있는사람이되었으면좋겠습니다. 35
부산광역시정보영재교육원중 3 창의성반 여름방학집중기수업프로젝트보고서 제목 : 아이폰 Tap Me 게임앱개발 이름 : 김준엽소속 : 중 3 창의성반지도 : 동의과학대학교김종현교수님날짜 : 2013.7.20 ~ 7.26 1. 아이폰결과화면 36
2. 내용 37
3. 소감 현재삼성, LG 등에서제작하고있는안드로이드폰이현재아이폰보다매출이더증가한다고한다. 그래서인지우리주변사람들을보면스마트폰중에서교육용을제외하고는아이폰을쓰는사람은그렇게많지않다. 그때문인지나도아이폰에대한관심이낮아지게될뿐만아니라 ios 프로그래밍은잘하지못했다. 나도처음맥을이용해서 ios 프로그래밍을할때는선생님설명을잘따라가지못하면어쩌나, 어려울것같은데등의걱정이많이생겼었다. 하지만김종현교수님께서는복잡해보이는코드를쉽게설명해주셨다. 또 Tap me 라는간단한게임을만들면서, 겉으로는간단해보일지몰라도실제로만들때들어가는코드가엄청많다는것을새삼느끼게되었다. 기회가된다면, 집에맥을사서직접다양한앱을만들어보고싶다. 38
ios 아이폰어플만들기 프로젝트보고서 중 3 컴퓨터창의성반손하은 1. 결과화면 39
2. 프로젝트내용 Xcode 와 object-c 를이용한 app 만들기 -code 넣기 ( 프로그램기반, 변수지정등등.. 매우많음 ) - 이미지삽입 ( 배경화면설정, 버튼모양 ) - 클릭시이벤트 ( 숫자적립 ) -Label 이용 ( 정적 : 이름띄우기, 동적 : 시간, 점수 - 꾸미는법 ( 색넣기그림넣기등등 ) -timer 넣기 ( 시간이지날수록숫자차감, 0 이되면끝 ) - 알림창 ( 게임이끝날시, 다시 or 끝의선택화면 ) - 클릭시이미지변화 =Tap me: 버튼을 30 초동안터치해서점수올리는게임. 3. 소감 40
작년에했던 ios 기반앱만들기와는조금달라서신기했고작년보다조금더어려웠다. 작년에는 object 를많이이용하고그기능자체로대부분만들었는데이번에는우리가코드를집적입력하는것이대부분이라서그런것같다. 자꾸에러가많이나서좀힘들기도했고갑자기생각대로안되서애먹었고특히 timer 가안되서결국친구들과선생님도움도많이받았지만마지막에내가만든결과물을보니신기하고보람있었다. 다만결국마지막까지버튼주변의하얀바탕은안없어져서그게좀아쉽다. 다음에도이런기회가있다면좀더어렵고재밌는걸만들어서지금보다 UI 를좀예쁘게꾸며보고싶. 지금은폰을바꿔서이앱이안들어가겠지만다음에혹시다시아이폰으로바꾸게된다면탈옥해서앱을넣어봐야겠다 41
부산광역시정보영재교육원중 3 창의성반여름방학집중기수업프로젝트보고서 제목 : 아이폰 Tap Me 게임개발 이름 : 우정규소속 : 중 3 창의성반지도 : 동의과학대학교김종현교수님날짜 : 2013.7.20~ 7.26 1. 아이폰결과물사진 42
2. 내용 43
(Screenshots, Lectures) [Head File] [Main File] 44
45
46
47
[Story Board] [ 설명 ] 이것은 TabMe 라는이름을가진어플리케이션이다. 싱글뷰를이용해만들었으며, 기본적인베이스는두개의라벨 ( 시간표시, 점수표시 ) 와버튼한개 ( 누르면점수가올라감 ) 로이루어져있다. 어플을실행하게되면, 맨위의아이폰결과화면첫번째화면처럼뜨며, 가운데의 Tap Me! 버튼을누르게되면맨위의 time 부분이 30 초부터카운트다운되며, bgm 이나오게된다. 또한 Tap Me! 버튼을누를때마다, 스코어가증가한다. 타이머가다끝나고난뒤에는, 시간이끝났다는알림이뜨며, 그밑에는자기가세운스코어가표시되고, 게임을계속할것인가아니면종료할것인가를결정하는두개의버튼이있다. 만약전자를누르게된다면맨처음화면으로리셋되어돌아가고, 후자를누르게된다면어플리케이션이종료된다. 48
소스는전체적으로는간단한편이나, bgm 부분과알람창부분, 그리고타이머부분의소스가조금복잡해서힘이들었다. 맨처음소스는어플을실행시키자마자바로게임이시작되게소스가구성되어있었는데, 불편함이느껴졌다. 처음에는 Integer 로변수 a 와 b 를선언하여, a 는타이머와관련, b 는 bgm 과관련해서 tab me 버튼을누를때타이머와 bgm 이시작되게소스를구성했다. 하지만나중에김종현교수님이 bool 함수를이용해서소스를짜게되면더간단하게될수있다는말을듣고, a = s, b = bg 로고쳐서 bool 로선언한뒤, 소스를짜보았다. 하이스코어를저장하여보여주는부분도만들어보려는했으나, 배열을이용해야하여복잡하고어려워만들지못하였다. 3. 소감평소에어플리케이션이라는것을매우흥미롭게생각해왔었고, 한번쯤은나도만들어보고싶다는생각을항상했었었다. 정보영재원에들어와서, 2 학년때 objective-c 와 x-code 를접하게되면서, ios 어플을어느정도는만들정도가되었다. 이번에김종현교수님과함께한 TabMe 어플만들기프로젝트는나에게는아주흥미로운것이었다. 조금더많은기능들을넣어보고싶었으나, 아직실력이부족할뿐만아니라, 주어진시간이부족하여많은기능을넣는부분은실패하고말았다. 기본적인 Tab Me 소스를보니, 바로어플이시작되자마자, 게임이시작되고, 게임이끝난후다시하기를누르니바로또게임이시작되는불편함이존재했다. 그에관련해서따로 start 버튼을만들어보았으나, 그보다는 tab me 버튼을눌렀을때게임이시작되는것이어떻겠느냐는의견을듣고그에맞추어서수정하게되었다. 평소학원을다니거나내신대비를한다고좋아하는어플만들기를할기회가거의없었는데, 이렇게집중기동안 ios 어플을만들어보게되어정말좋았다. 1 년전에배운것을거의까먹은상태라처음에는조금힘들었으나, 계속하다보니자신감이붙었고, 재미있다는생각이들었다. 이제까지는스트레스를게임이나 tv 보기, 웹서핑하기등으로풀었었는데, 이렇게좋아하는어플을만드는것도하나의좋은취미이자스트레스해소법이될수도있겠다고생각했다. 짧은기간이었지만 ios 어플만들기를강의해주신동의과학대학교김종현교수님께감사드린다. 49