* iAd는 UIViewController에만 붙는다. 


iAd 문서

https://developer.apple.com/library/ios/documentation/userexperience/Reference/iAd_ReferenceCollection/_index.html

Google AdMob 문서

https://developers.google.com/mobile-ads-sdk/docs/admob/fundamentals#ios

두 개의 문서를 참조하여 필요한 프레임 워크 및 설정을 하도록 하자. AdMob에서는 Other Linker Flags에서 -ObjC 설정을 안해주면 뭔가 에러를 나니 꼭 문서를 참조해서 설정하도록 하자. 


나머지는 대충 코드를 보면 알수 있다. 설명 생략. 


UIViewController.h

#import <UIKit/UIKit.h>

#import <SpriteKit/SpriteKit.h>

#import "GADBannerView.h"

#import <iAd/iAd.h>



@interface ViewController : UIViewController <ADBannerViewDelegate, GADBannerViewDelegate> {

  ADBannerView* iADBanner; // iAD

  GADBannerView* adMobBanner; // 애드몹

}


- (void)initADBanner;

- (void)hideADBanner;


UIViewController.m

// 광고 생성 초기.

- (void)initADBanner {

  // iAd Banner

  iADBanner = [[ADBannerView alloc] initWithAdType:ADAdTypeBanner];

  iADBanner.frame = CGRectZero;

  iADBanner.delegate=self;

  [self.view addSubview:iADBanner];

  

  // AdMob Banner

  adMobBanner = [[GADBannerView alloc] initWithFrame:CGRectMake(0, 578, 320, 50)];

  adMobBanner.rootViewController = self;

  adMobBanner.delegate = self;

  adMobBanner.adUnitID = @"google AdMob 광고 id";

  [self.view addSubview:adMobBanner];

  

  // 애드몹 광고 request

  GADRequest* requestAd = [GADRequest request];

  

  // test. 테스트 주석

//  [requestAd setTestDevices: [NSArray arrayWithObjects:GAD_SIMULATOR_ID, nil]];

  [adMobBanner loadRequest:requestAd];

}


- (void)hideADBanner {

  for (UIView *subview in [self.view subviews]) {

    if([subview isKindOfClass:[GADBannerView class]]) {

      [subview removeFromSuperview];

    }

    if([subview isKindOfClass:[ADBannerView class]]) {

      [subview removeFromSuperview];

    }

  }}


#pragma mark -

#pragma mark iAD Delegate


- (void)bannerViewDidLoadAd:(ADBannerView *)banner {

  [UIView beginAnimations:@"animateBannerAppear" context:nil];

  [iADBanner setFrame:CGRectMake(0, 0, 320, 50)];

  [UIView commitAnimations];

}


- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error {

  [UIView beginAnimations:@"animateBannerOff" context:nil];

  [iADBanner setFrame:CGRectMake(0, 0, 320, 50)];

  [UIView commitAnimations];

}


#pragma mark -

#pragma mark adMob Delegate


- (void)adViewDidReceiveAd:(GADBannerView *)bannerView {

  [UIView beginAnimations:@"BannerSlide" context:nil];

  [adMobBanner setFrame:CGRectMake(0, 518, 320, 50)];

  [UIView commitAnimations];

}


- (void)adView:(GADBannerView *)bannerView didFailToReceiveAdWithError:(GADRequestError *)error {

  [UIView beginAnimations:@"BannerSlide" context:nil];

  [adMobBanner setFrame:CGRectMake(0, 518, 320, 50)];

  [UIView commitAnimations];

}



광고를 호출하는 곳.m

#import "AppDelegate.h"

#import "ViewController.h"


- (void)loadAdBanner {

  AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;

  ViewController *vc = (ViewController *)delegate.window.rootViewController;

  [vc initADBanner];

}








저작자 표시 비영리
신고
Posted by KraZYeom

게임이 끝나고 iOS 내장된 트위터를 통해서 점수를 보낼 때, 현재 화면을 캡쳐해서 UIImage로 저장하는 방법이다. 



- (void)onShareClicked:(id)sender {

  NSString *scoreString = [NSString stringWithFormat:@"Just scored %ld.", (long)_score];


  SLComposeViewController *tvc = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];

  [tvc setInitialText:scoreString];

// 여기서 부터가 현재 화면을 UIImage로 캡쳐 하는 방법.

  UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, scale);

  [self.view drawViewHierarchyInRect:self.frame afterScreenUpdates:YES];

  UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

  UIGraphicsEndImageContext();

  [tvc addImage:image];

  

  UIViewController *viewController = [UIViewController new];

  [viewController presentViewController:tvc animated:YES completion:nil];        

// 컴플리트핸들러 사용 안해서 뷰를 dismiss 안하면 터치 안됨. -_ -; 삽질 함. 

  tvc.completionHandler = ^(SLComposeViewControllerResult result){

  

    [viewController dismissViewControllerAnimated:YES completion:nil];

  };

  

  [self.view addSubview:viewController.view];

}


저작자 표시 비영리
신고
Posted by KraZYeom

열풍 적인 인기를 얻고 있는 Flappy Bird ... 광고가 너무 자주 나와서! cocos2d v3 를 공부할 겸해서 따라 만들어 보기로 했습니다. 


* 이미지 및 저작권은 원 개발자에게 있습니다. 개인적인 습작 용도로만 사용하세요. 직접 배포할 때는 이미지는 제외합니다. 

* 저는 소스코드 권리만 있습니다. ;-) 

* 한 5일정도 출근전 퇴근후 해서 야금야금 코딩한게 완성. :-) 

- 여기서 소소한 광고 - 

드래곤 라이더 따라 만들기! 를 사시면 쉬운 게임은 그냥 만들 수 있어요~ -_ -;



Flappy Bird도 걍 배낀거였구나. ㅠㅠb 배낀게 나쁘게 보지는 않는다. 때와 운이 작용해야 한다. 


2월 12일 월요일 07시 39분 

SpriteKit으로 포팅 완료. 

화면 캡쳐 및 트윗 완료. 

zOrder는 zPosition으로 줘야 한다. insertSubview:atIndex로 해서 오랫동안 삽질을... 

order값 주는 과정에서 레이어를 왔다갔다 하다가 계산산 scale값을 0 이 되서... 한참 동안 삽질.

* 사운드가 하나 이상하게 재생된다. -_ -; 이건 뭐 내 탓이 아니오! 





2월 10일 월요일 23시 56분 

빅토르 안이 동메달 딴 기념으로.. 심심해서 우울증엔 코딩이 최고져...; 

간단한 코드이기에 SpriteKit 으로 포팅 마음 먹고 삽질에 삽질을 해서 대충 75%정도 구현은 된 듯.

SpriteKit이 지원하는게 딱히 많이 없어서 내일 자세히 살펴봐야 할 듯. 

* cocos2d도 CCActionMove, SpriteKit도 SKAction move가 적용되어 있으면 스프라이트가 position으로 이동하지 않는다. 이걸로 몇 분 잡아 먹은듯. 





2월 8일 토요일 23시 41분 

점수 + 화면 트위터 공유 기능 추가. :-) 9줄이면 되다니. 몇 분만에 후다닥. 구글+스텍오버플로우님께 감사의 말을..

참조 : http://stackoverflow.com/questions/19721779/how-to-take-screenshot-in-cocos2d-iphone 

이젠 정말 그만 둬야지 




2월 8일 토요일 18시 48분

완성. NSUserDefault 사용해서 걍 점수 관리. highScore는 하나 밖에 없으니.

적당하게 소스 다듬고 공개. 




2월 8일 토요일 16시 46분

iOS -> OS X 으로 걍 소스만 복&붙 했더니. 사이즈 계산 방법 때문에 이런저런 문제가 많아서 걍 아이 5 사이즈로 보이게 설정. 
.xib 열고 싸이즈 적당하게 수정하고 resize를 안되게 막아야함. 
잘됨. 그런데 v3 문제인지 잘꺼짐. ㅠ 




2월 8일 토요일 16시 19분

전체 화면으로 보면 대충 게임 로직이 눈에 보입니다. -_ -; 




2월 8일 토요일 16시 04분

Cocos2d v3 for Mac 을 사용해서 포팅 완료. 근데 엄청 문제가 많다. v2로 옮겨서 해볼까...; 

심지어 커널 패닉까지 일어남. ㅠㅠ 




2월 8일 토요일 14시 10분

이런 저런 버그 잡음. 화면에 밖에 나가면 메모리에서 삭제 해야하는데 안해서. Array에서만 삭제했는... 

밖으로 뛰쳐 나가는 버그 잡은... (딸이 싫어하겠지만..) 

코드 좀 정리. 메소드 하나에 뭉쳐넣은거나 빼야하는데...; 


* 최고 점수 및 점수에 따른 메달 부여만 하면 끝.




2월 8일 토요일 08시 42분

사운드 적용 했음. SimpleSoundEngine 이 없어지고 v3에서는 OALSimpleAudio로 변경되었음. 사용법은 거의 똑같음. 

몇 가지 버그가 존재함. 하늘 경계선을 넣자. 

동영상을 보면 sprite 갯수가 계속해서 늘어나는데 뭔가 다시 삭제를 안하고 있는 듯. 




2월 8일 토요일 03시 05분

나름 대충 게임 원본 스타일과 거의 비슷하게 완성 한 것 같습니다. 사운드만 입혀주고 마지막에 점수 에니메이션만 살짝 넣어주면 되겠네요. 게임에 ㄱ 도 모르고 코딩을 하는지라 제대로 효율적으로 구현한지는 모르겠습니다. 




2월 7일 금요일 09시 38분

뭔가 물리엔진으로 통통 새를 튀게 하기 힘들다. 

원래 앱과도 다른 느낌.. 걍 Chipmunk 들어내고 시간에 따라 걍 위로 아래로 움직이게 바꿈.

나름 원래 앱과 비슷비슷하다. 만족! 


* 삽질 : OS X 상의 시뮬레이터 OpenGL 성능과 iPhone 기기의 OpenGL ES 성능이 달라서... 시뮬레이터 상에서는 프레임이 30프레임이하로 떨어저서 버버버벅인다. 아래 동영상 처럼 iPhone 에서 돌리니 60프레임 나와서 부드럽게 동작.

그렇다고 내가 OpenGL을 직접 건들이는건 아님 -_ - cocos2d에서 하는거라... 




2월 6일 금요일 23시 16분

파이프 추가. 파이프에도 물리값 주기 그러면 자동으로 충돌이 구현된다. 하지만 튕김.




2월 5일 수요일 23시 05분

Chipmunk 물리엔진 새와 바닥에 적용. 뭔가 impulse, force 값을 줘서 통통 튀게 했지만 통통까지는 마음에 드는데...

계속해서 통통하면... 가속도 값을 조정하는거라 이상하게 날아감. 




2월 5일 수요일 21시 42분

버튼을 클릭하는 느낌을 주긴했는데 꼼수라서 뭔가 이상함.

그리고 게임씬으로 이동 추가




2월 5일 수요일 21시 39분

버튼을 클릭하는 느낌을 주긴했는데 꼼수라서 뭔가 이상함.

그리고 게임씬으로 이동 추가




2월 4일 화요일 09시 50분

일단 메뉴 화면에 새와 타이틀의 애니메이션만 넣기



저작자 표시 비영리
신고
Posted by KraZYeom