반응형

schedule는 많은 곳에서 사용하게 됩니다.

특히 반복적으로 수행해야 하는 곳에서 사용하게 되는데

예를들어 게임내에 시계를 표시해주어야 한다고 가정 했을 때

1초에 한번씩 반복적으로 호출 되면 좋겠죠?


그럴때 사용하는것이 schedule 입니다.

schedule를 사용하는 방법에는 여러가지가 있지만 그중에서 2가지만 사용해 보도록 하겠습니다.

첫번째 사용자가 반복되는 시간을 마음대로 조절할 수 있는 방법 입니다.


[사용자가 원하는대로 호출]

bool HelloWorld::init()

{

    //////////////////////////////

    // 1. super init first

    if ( !Layer::init() )

    {

        return false;

    }

    

    this->_time = 100.0f;

    

    this->schedule(schedule_selector(HelloWorld::gameTime), 1.0f);

    

    return true;

}


1초마다 한번씩 gameTime을 호출 합니다.


void HelloWorld::gameTime(float dt)

{

    --this->_time;

    CCLOG("Game Time: %d", (int)this->_time);

    if (this->_time <= 0) {

        CCLOG("Game Over!");

        this->unschedule(schedule_selector(HelloWorld::gameTime));

    }

}


호출 될때마다 dt만큼 감소시켜주고 0이 되면 스케줄을 중지 합니다.



[매 프레임 마다 호출]

bool HelloWorld::init()

{

    //////////////////////////////

    // 1. super init first

    if ( !Layer::init() )

    {

        return false;

    }

    

    this->_time = 100.0f;

 

    this->scheduleUpdate();


    return true;

}


기본적으로 모든 노드에는 update함수가 있으며 이를 오버라이드 해주면 된다.


    virtual void update(float dt) override;


노드에 있는 update함수를 사용할 때 


void HelloWorld::update(float dt)

{

    this->_time -= dt;

    CCLOG("Game Time: %d", (int)this->_time);

    if (this->_time <= 0) {

        CCLOG("Game Over!");

        this->unscheduleUpdate();

    }

}


동일하게 dt만큼 감소시켜 주면 초당 1씩줄어드는 효과를 볼 수 있다.



둘중 어느 것을 사용해도 되며 

편의를 위해 update를 사용하는 경우가 많습니다.


프레임마다 호출되는 것이 부담을 갈 때는 위에 함수를 사용하여 

원하는 시간마다 호출되게 하는 것이 바람직 합니다.


반응형
반응형

리눅스 계열에서 파일보기 명령어인 "ls" 를 많이 사용 합니다.

"ls" 사용시 옵션인 -al 을 많이 사용하게 되는데 매번 "ls -al"을 치는것이 귀찮습니다.


그러다 보니 많은 분들이 alias에 명령어 단축키인 "ll"을 등록하여 사용중인데 

리눅스 계열을 처음 접해본 분들이 "ll"이 기본 명령어 인줄 알고 쳐봤는데 안된다는 분들이 많습니다.


"ll" 명령어는 기본적으로 없으며 단축 명령어로 등록 해주어야 사용 할 수 있습니다.


쉽게 등록 하는 방법을 알아보겠습니다.

(Mac - Centos에서 등록하는 방법이며 다른 리눅스 계열은 방법이 다릅니다.)


우선 맥북에 Launchpad를 실행 시켜 줍니다.

Launchpad 실행 후 기타 폴더를 열어주세요.


기타 폴더 안에 다음과 같이 터미널이라고 있습니다.


터니널 앱 실행 또는 Spotlight 실행 후 terminal 입력 후 실행


이와 같은 창이 나오며 이곳에 다음과 같이 입력 합니다.

vi ~/.bash_profile 

입력 후 Enter

파일이 최초에는 없을 수도 있습니다.

그냥 없으면 새로만든다는 개념으로 

실행 하시면 됩니다.


최초에는 안에 내용이 아무것도 없을 수 있습니다.

원하시는 단축 명령어를 얼마든지 추가 하실 수 있습니다.

지금은 예제로 하나만 해보도록하겠습니다.

위와 같이 입력해 보세요

alias ll="ls -alv"


입력 하셨다면 저장하고 나가시면 됩니다.

저장하고 나가시면 방법은 esc 클릭 후

:wq

를 입력하시면 하단쪽에 위와 같이 텍스트가 써집니다.

그리고 Enter를 클릭 하세요.



그럼 이제 .bash_profile 이라는 파일이 생겼고

이 파일에 단축 명령어도 추가 하였습니다.

이제 새로 생성한 소스를 적용하는 일만 남았습니다.

위와같이 입력해주세요

source ~/.bash_profile

그리고 Enter를 누르시면 끝납니다.


이제 입력창에 ll이라고 쳐보세요 

위와같이 ls -alv 명령어를 쓴것과 같은 효과를 볼 수 있습니다.


이 외에도 많이 쓰는 명령어들이 있는데

매번 옵션을 붙여 쓰기 귀찮을 때에는

사용자 입맛에 따라 등록해주시고

소스 적용을 해주시면 편안하게 사용할 수 있습니다.


한번알아두면 매우 편리한 기능 이므로

꼭 한번 해보시는 걸 권장합니다.


반응형

'- Linux' 카테고리의 다른 글

리눅스 IP 확인  (0) 2017.10.11
반응형


didFinishLaunchingWithOptions 에 아래와 같이 코딩 해주면 iOS 앱 실행 시 URL을 받을 수 있다.



    //deep link
    NSURL *URL = [launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];
    if (URL)
    {
        //NSLog( @"application didFinishLaunchingWithOptions %@", [URL absoluteString] );
        [[UIApplication sharedApplication] openURL:URL];
    }
    
    // Facebook 지연된 딥 링크와 앱 링크 
    if ( URL == nil )
    {
        [FBSDKAppLinkUtility fetchDeferredAppLink:^(NSURL *url, NSError *error) {
            if (error) {
                NSLog(@"Received error while fetching deferred app link %@", error);
            }
            if (url) {
                [[UIApplication sharedApplication] openURL:url];
            }
        }];
    }


앱이 실행 중일 때는 openURL 함수로 바로 들어 오지만 앱이 종료되어 있을 경우에는 반드시 위와 같이

코딩을 해주어야 Deep link를 사용 가능 하다.


반응형
반응형

'wantsFullScreenLayout' is deprecated: first deprecated in iOS 7.0 

라는 경고 메시지가 나올 경우


wantsFullScreenLayout -> extendedLayoutIncludesOpaqueBars

로 교체 한다.


예)

    //_viewController.wantsFullScreenLayout = YES;

    _viewController.extendedLayoutIncludesOpaqueBars = YES;


교체한다.

반응형

'- iOS' 카테고리의 다른 글

iOS 앱 실행 시 Deep link 관련 문제  (0) 2017.10.17
[iOS] info.plist Key 목록과 사용.  (1) 2017.09.27
반응형

Unified Extensible Firmware Interface(통일 확장 펌웨어 인터페이스) 읽을 때는 유-이-에프-아이 식으로 알파벳을 읽기도 하지만, 유이파이라고 읽기도 한다. 2016년 기준으로 버전 2.6이 최신이다.

BIOS를 대체하는 펌웨어 규격으로, IBM PC XT부터 이어진 바이오스의 제약 사항을 극복하고 새로운 하드웨어를 더 유연하게 지원하기 위해서 개발되었다. 개발은 90년대부터 진행되어 EFI(Extensible Firmware Interface)라는 이름으로 인텔 아이태니엄 시리즈에 사용되었으며, 2005년에 규격을 제 3사에도 공개하여 현재의 이름인 UEFI로 변경되었다. x86 아키텍처에는 2006년 맥북부터 천천히 도입되었다. 인텔 기준 945 이후 칩셋이라면 UEFI 사용이 가능하지만, 메인보드 제조사들은 샌디브릿지용 6 시리즈 칩셋 이전까지는 UEFI를 전격적으로 사용하지 않았다. AMD 쪽은 800 시리즈(AMD 페넘2/AMD FX)부터 사용 가능하다. UEFI 초창기 시절의 일부 염가형 보드는 바이오스 업그레이드로 EFI의 탈을 쓴 일반 BIOS가 온전한 UEFI 지원이 되게 하는 경우도 있다.

BIOS에서 UEFI로 전환되는 시기에는 같은 메인보드 칩셋이라도 모델에 따라 펌웨어 종류가 다르기도 했다. 2008년 MSI에서 EFI를 탑재한 P35 Neo3-EFINITY 메인보드를 내놓았으나, 시기상조라 여겨지면서 신기한 물건 정도로만 이목을 끌었을 뿐 그다지 많이 팔리지는 않았다. 기가바이트는 4 시리즈부터 Hybrid EFI라는 것을 사용하여 UEFI의 기능 중 3TB 이상의 디스크 사용을 위한 GPT 파티션 테이블 및 EFI 부팅만 첨가한 바이오스를 사용했다. AMD 메인보드는 초기 리비전은 바이오스로 내놓다가 후기 리비전에서 UEFI를 사용하는 경우도 있다. 나중엔 제대로 된 UEFI 보드들을 내고, 듀얼 바이오스의 전통을 이어받아 듀얼 UEFI를 지원한다. 애플은 첫 인텔맥부터 모든 모델이 UEFI를 사용한다.



사용자가 느끼는 가장 큰 차이점은 펌웨어 사용자 인터페이스와 GPT 부팅이다. 진입 방법은 BIOS와 똑같이 Delete나 F2. OEM 컴퓨터나 노트북의 경우 다를 수도 있다. BIOS 시대에는 일부 486-펜티엄 보드에 사용한 AMI 바이오스에서 GUI와 마우스를 지원한 것을 빼면 모든 사용자 인터페이스는 CUI 기반이었다. UEFI로 오면서 GUI 기반 펌웨어를 탑재하는 메인보드 제조사가 많아졌다. 펌웨어 개발사인 AMI의 레퍼런스 UEFI Aptio의 기본값은 CUI이지만 제조사에서 GUI로 변경할 수 있다. 그래서 HP나 페가트론 같은 OEM 업체이거나 인지도 없는 브랜드는 UEFI 메인보드라고 해도 CUI만 사용한다. 심지어 인텔 베이트레일 기반 태블릿 및 삼성 아티브 계열에 들어가는 UEFI는 마우스 조작과 더불어 터치 조작도 지원한다. 태블릿에는 물리 키보드가 없기 때문에 가상 키보드까지 지원한다. 물론 UEFI 펌웨어의 터치 스크린 드라이버는 필수적인 조작만 되면 되기 때문에 OS로 부팅한 상태보다는 터치감이 안 좋을 수 밖에 없다.

BIOS 시절부터 사용한 MBR(Master Boot Record) 기반 파티션 테이블은 주 파티션을 최대 4개까지밖에 잡을 수 없고 그 이상으로 나누려면 논리 파티션을 사용해야 한다. 문제는 OS와 부트로더가 지원하지 않으면 주 파티션에 설치된 OS로만 부팅 가능하며, 전체 디스크 크기가 2TB를 넘어가면 초과분부터는 무슨 짓을 해도 해당 공간을 사용할 수 없다. GPT(GUID Partition Table)는 파티션 정보를 기록하는 방식을 변경하여 주 파티션과 논리 파티션의 구분을 없애고 2TB 이상의 디스크도 사용할 수 있게 되었다. GPT 파티션 테이블에 기록되는 정보가 더 많기 때문에 MBR과 GPT는 서로 호환되지 않는다. 따라서 파티션 테이블 구조를 변경하려면 해당 디스크의 모든 파티션 테이블을 지워야 하기 때문에 데이터가 손실된다. 윈도우 기준 명령 프롬프트로 가서 diskpart-select disk=?-clean-convert GPT 명령으로 파티션 테이블 구조를 변경할 수 있다.



다만 GPT 디스크로 부팅하려면 EFI가 필요힌건 사실이나, 반대로 EFI 부팅=GPT 부팅은 아니다. 디바이스가 BIOS가 아닌 EFI 펌웨어를 사용하기만 한다면 MBR-EFI의 조합도 가능하다. Windows에서 이게 불가능한 이유는 GPT를 권장하기 위해 MBR 디스크에서 EFI 지원을 막아놓았기 때문이다.

이 외에도 후술하는 Secure Boot, 펌웨어 단계에서의 부트로더 관리, OS에서 펌웨어 설정에 접근하는 표준 인터페이스 등 기능이 추가되었다. BIOS 기반 컴퓨터에서 부팅할 때에는 해당 부팅 장치의 MBR에 접근해야 OS 코드가 실행되지만, UEFI 펌웨어는 디스크에 설치된 부트로더 정보를 가지고 있기 때문에 OS 코드의 일부를 UEFI 단계에서 실행할 수 있다. 빠른 부팅을 지원하는 것은 덤. UEFI 메인보드 및 하드웨어, 부팅 속도 Ultra Fast 설정+SSD+UEFI 지원 OS 조합으로 우사인 볼트의 부팅 속도를 체험할 수 있다.심지어 G2030 아이비브릿지+4GB Ram이라도 SSD+Windows 8.1이라면 10초는 커녕 5초도 안되어 암호 입력 화면으로 넘어간다!이제 세계신기록 찍는 일만 남았다 

윈도우의 경우 UEFI 모드로 제대로 설치되면 부팅 단계에서 윈도우 로고 대신 UEFI 제조사(메인보드 및 OEM) 로고가 뜨고 윈도우가 로딩된다. Windows Vista/7은 UEFI 부팅을 지원하지만 모든 기능을 사용할 수는 없으며, Windows 8이나 Windows 8.1 또는 Windows 10에서는 더 많은 기능을 지원한다. macOS는 출시 당시부터 UEFI를 지원했다. 리눅스는 x86 OS 중 가장 먼저 UEFI 부팅을 지원했으며, UEFI를 지원하는 GRUB2 등 부트로더를 사용하면 된다. Windows Phone도 UEFI를 사용한다.

BIOS에 비해서 관리하는 하드웨어 범위가 증가했고, 그만큼 기능도 증가했기 때문에 구현을 제대로 하지 않았을 때 OS에서 문제가 발생할 확률이 더 높아졌다.


반응형
반응형

ifconfig 사용하기


아래와 같이 사용하시면 됩니다.


[root@admin ~]# ifconfig | egrep "(^\\w|inet )"
eth1      Link encap:Ethernet  HWaddr 00:0C:29:A2:8E:A8  
          inet addr:192.168.0.3  Bcast:192.168.0.255  Mask:255.255.255.0
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0

[root@admin ~]# ifconfig | grep "inet "
          inet addr:192.168.0.3  Bcast:192.168.0.255  Mask:255.255.255.0
          inet addr:127.0.0.1  Mask:255.0.0.0
 
[root@admin ~]# ifconfig -a | grep "inet " | grep "Bcast:" | 
awk '{print $2}' | awk -F: '{print $2}'
192.168.0.3


반응형

'- Linux' 카테고리의 다른 글

Mac - Centos 에서 alias ll 설정하기  (0) 2017.12.20
반응형

원본내용

http://baijiahao.baidu.com/s?id=1580576847095185012&wfr=spider&for=pc


1. 제작 기술(품질)이 무척 좋지 않음

    올해의 아이폰8은 양면유리에 중간은 금속테두리 설계를 하였으며, 이전의 아이폰4와 같으나 제작 기술(품질)은 아이폰4에 미치지 못한다.

심지어 많은 네티즌은 자기가 구입한 아이폰8 핸드폰에 무척이나 큰 갈라진 틈이 있다고 하였는데, 이러한 핸드폰은 정말 방수방진이 가능하게 만들었다고 할 수 있는가?


2. 액정 황색 나타남

    아이폰 핸드폰에 황색이 나타나는 것은 오래된 문제라고 할 수 있는데, 이전의 아이폰7도 이랬다.

단지 올해의 아이폰8 액정에 황색이 나타나는 것은 이미 사용에 일정부분 영향을 주고 있으며, Ture Tone기능을 꺼놓은 후에도 여전히 황색이 나타난다.


 

3. 통화품질 안좋음

    통화품질 문제도 애플의 오래된 문제이다.

이전의 아이폰7도 이미 통화 시 잡음이 있어 불만을 가져 왔으나 아이폰8에도 나타나고 있어, 이 문제는 업그레이드를 하여야 하는데 통화 시 심지어 삐리삐리의 새가 우는 소리가 나타나며, 심각할 때는 심지어 통화자의 소리를 들을 수 없다.


4. 후면 유리 쉽게 깨짐

     아이폰8은 양면유리설계로 돌아 갔으나 유리가 쉽게 깨지는 문제를 해결하지 않았다. 네티즌이 말하기를 아이폰8을 구입한지 며칠 되지 않아 땅에 떨어졌는데 뒷면 외피(유리)가 깨졌다고 했으며, 수리비용도 무척이나 높아 자신이 마치 곤경에 처한 느낌이라 하였다.(무척이나 난감한 상황이라는 의미)


5. 배터리 문제

    아이폰8이 시장에 나온 후 이미 6건의 배터리 사고가 나타났는데, 국내(중국)에서도 이미 이러한 사례가 있었다.

아이폰8의 배터리공급상은 작년 삼성노트7의 배터리 공급상일 뿐만 아니라, 아이폰8의 무척이나 많은 부속품도 모두 삼성에서 온 것이다.(삼성의 부품을 사용하였다)


 

아이폰8이 정식으로 판매될 때부터 판매량이 좋지 않다는 소식은 계속해서 애플의 면전에서 맴돌고 있다.

최근 미국회사는 이번 주에 발표하기를 장차 11월 2일 애플의 4사분기 재무재표를 발표한다고 하였다.

많은 분석사들은 애플이 이번 재무재표 중에서 아이폰8의 판매량을 공포할 것이라 여기고 있다.

판매량은 계속해서 무척이나 낮은 상태이며, 작년에 사람들이 몇 백미터의 대오를 이루었는데 바로 아이폰7을 구입하기 위해서였다.

그러나 지금 아이폰8은 몇 사람의 대오만이 있을 분이며, 어떤 경우는 하루 종일 한 사람의 대오도 없다.(찾는 사람이 없다)

아이폰8을 판매한 것이 배달이 되지 않기 때문에(구입 후 반환하였다는 의미) 순펑(택배회사 이름임) 창고에는 아이폰8이 가득 쌓여 있으며, 아직도 많은 사람들이 순펑의 택배에서 배달한 아이폰8을 수령하기를 거부하고 있고, 여기에 더해 많은 사람들이 반품을 하고 있어, 순펑창고에 쌓아 둘 수가 없다.


아이폰8은 기타 방면에서는 상당히 특출하다고 할 수 있으나 이번의 배터리 문제는 대기업의 풍격이 아며, 우리가 희망하는 것은 애플이 최대한 빨리 이러한 것들에 대해 정확하게 답변을 해주는 것이다.

자세히 생각해 보면, 우리 국산(중국산) 핸드폰 제품도 이미 다양화 되었으며, 애플이 만일 품질보증을 할 수 없는 상태로 핸드폰을 만든다면, 국산핸드폰에게 조만간 초월을 당할 것인데, 여러분은 애플의 배터리 사고를 어떻게 보는가?

반응형
반응형
게임개발 하다보면 콤마가 들어간 숫자 형식은 
거진 들어간다고 보면 됩니다. 
게임머니, 코인, 보석 등 모든 수에 숫자형식은 무조건 필수!
C에서는 직접 함수를 만들어 주었지만 C#에서는 이미 만들어져 있습니다.
아주편리하게 사용할 수 있어요!

int won = 123456890;
Console.WriteLine(string.Format("{0:n0}", won));
Console.WriteLine(string.Format("{0}", won.ToString("n0"))); ;
Console.WriteLine(string.Format("{0:#,##0}", won));
Console.WriteLine(string.Format("{0}", won.ToString("#,##0")));


//결과
//123,456,890
//123,456,890
//123,456,890
//123,456,890

정말 간단하죠 ?
역시 C#편리 합니다. 그레잇!
숫자에 콤마를 넣어 주세요~
반응형
반응형
아래는 info.plist에서 사용되는 키 값에 대한 설명, 자료형, 사용 가능한 버전 기준, 필수여부, 지역화 가능 여부를 표로 정리한 것이다.
  애플이 제공하는 레퍼런스 문서에 이보다 자세하게 나와 있지만, 빠르게 원하는 것만 보기 위해 만들었다.


분류

자료형

버전

필수

지역

설명

Core Foundation 

Bundle creator OS Type code

(CFBundleSignature)

String

 

O 

 

네 글자로 이뤄진 번들 식별 코드

Bundle display name

(CFBundleDisplayName)

String

 

O 

O 

번들의 보여지는 이름

Bundle identifier

(CFBundleIdentifier) 

String

 

O 

 

번들을 구분하기 위한 유일한 식별키

Bundle name

(CFBundleName) 

String

 

O

O 

열여섯 글자 미만으로 이뤄진 번들 이름 또는 어플리케이션 이름

Bundle OS Type code

(CFBundlePackageType) 

String

 

O 

 

번들 종류를 나타내는 코드

Bundle version

(CFBundleVersion)

String

 

O 

 

번들의 빌드 버전

Bundle versions string, short

(CFBundleShortVersionString)

String

  

O 

번들의 릴리즈 버전

Document types

(CFBundleDocumentTypes)

Array

(Dictionary)

   

앱에서 지원하는 문서 형식 목록

Executable file

(CFBundleExecutable)

String

 

O 

 

번들의 실행 파일 이름

Icon file

(CFBundleIconFile) 

String

   

번들 아이콘(iOS 3.2 미만)

Icon files

(CFBundleIconFiles)

Array

(String)

3.2 

  

번들 아이콘(iOS 3.2 이상)

Icon files (iOS 5) or none

(CFBundleIcons)

Dictionary

5.0 

  

번들 아이콘(iOS 5.0 이상)

InfoDictionary version

(CFBundleInfoDictionaryVersion)

String

 

O 

 

Info.plist 형식의 버전

Localization native development region

(CFBundleDevelopmentRegion)

String

 

O 

 

번들의 주 언어 또는 주 지역

Localizations

(CFBundleLocalizations)

Array

(String)

   

지원하는 언어 또는 국가 목록

Localized resources can be mixed

(CFBundleAllowMixedLocalizations)

Boolean

   

다른 프레임워크 또는 프로젝트에서 추가한 지역화 리소스를 사용할지

URL types

(CFBundleURLTypes)

Array

(Dictionary)

   

번들이 지원하는 URL-scheme 목록

Launch Services

Application requires iPhone environment

(LSRequiresIPhoneOS)

Boolean

 

O

 

iOS에서만 실행할 번들인지

MapKit

Maps routing app supported modes

(MKDirectionsApplicationSupportedModes)

Array

(String)

6.0

   

Cocoa

Main nib file base name

(NSMainNibFile)

String

 

O

 

앱의 메인 nib/xib 파일 이름

(UIMainStoryboardFile과 같이 쓸 수 없다)

Main nib file base name (iPad)

(NSMainNibFile~ipad)

String

    

Main nib file base name (iPhone)

(NSMainNibFile~iphone)

String

    

Privacy - Bluetooth Peripheral Usage Description

(NSBluetoothPeripheralUsageDescription)

String

6.0 

 

O 

블루투스가 필요한 이유

(권한 요청 대화 상자에 표시된다)

Privacy - Calendars Usage Description

(NSCalendarsUsageDescription)

String

6.0 

 

O 

캘린더에 접근해야 하는 이유

(권한 요청 대화 상자에 표시된다)

Privacy - Camera Usage Description

(NSCameraUsageDescription)

String

7.0 

 

O 

카메라가 필요한 이유

(권한 요청 대화 상자에 표시된다)

Privacy - Contacts Usage Description

(NSContactsUsageDescription)

String

6.0 

 

O 

연락처에 접근해야 하는 이유

(권한 요청 대화 상자에 표시된다)

Privacy - Location Usage Description

(NSLocationUsageDescription)

String

6.0 

 

O 

위치 정보에 접근해야 하는 이유

(권한 요청 대화 상자에 표시된다)

Privacy - Microphone Usage Description

(NSMicrophoneUsageDescription)

String

7.0 

 

O 

마이크가 필요한 이유

(권한 요청 대화 상자에 표시된다)

Privacy - Motion Usage Description

(NSMotionUsageDescription)

String

7.0 

 

O 

모션센서6가 필요한 이유

(권한 요청 대화 상자에 표시된다)

Privacy - Photo Library Usage Description

(NSPhotoLibraryUsageDescription)

String

6.0 

 

O 

앨범에 접근해야 하는 이유

(권한 요청 대화 상자에 표시된다)

Privacy - Reminders Usage Description

(NSRemindersUsageDescription)

String

6.0 

 

O 

미리 알림에 접근해야 하는 이유

(권한 요청 대화 상자에 표시된다)

none

(NSUbiquitousDisplaySet)

String

   

앱의 저장소를 관리하기 위해 iTunes-Connect의 앱 등록 과정에서 입력한 식별자

Exported Type UTIs

(UTExportedTypeDeclarations)

Array

(Dictionary)

5.0 

  

앱에서 내보낼 수 있는 UTI 형식 목록

Imported Type UTIs

(UTImportedTypeDeclarations)

Array

(Dictionary)

   

앱에서 가져올 수 있는 UTI 형식 목록

none

(GKGameCenterBadgingDisabled) 

Boolean

7.0 

  

게임센터의 벳지에 앱에서 발생되는 이벤트가 표시되지 않도록 할지

none

(GKShowChallengeBanners) 

Boolean

7.0 

  

앱 내에서 게임센터의 '도전 과제' 배너를 표시할지

UIKit

Application does not run in background

(UIApplicationExitsOnSuspend)

Boolean

4.0 

  

앱을 종료할 때 백그라운드로 보내지 않고 완전히 종료시킬지

Application presents content in Newsstand

(UINewsstandApp)

Boolean

5.0 

  

앱이 뉴스가판대에 콘텐츠를 제공하는지

Application supports iTunes file sharing

(UIFileSharingEnabled)

Boolean

3.2 

  

아이튠즈가 앱과 파일 공유를 하도록 허용할지

Application uses Wi-Fi

(UIRequiresPersistentWiFi)

Boolean

 

O

 

앱이 Wi-Fi 연결을 필요로 하는지

Fonts provided by application

(UIAppFonts)

Array

(String)

3.2 

  

앱 전용 서체 목록

Icon already includes gloss effects

(UIPrerenderedIcon)

Boolean

   

이미 번들 아이콘에 광택 효과가 있는지

Initial interface orientation

(UIInterfaceOrientation)

String

3.2 

O

 

앱이 구동될 때 사용할 인터페이스의 방향

Launch image

(UILaunchImageFile)

String

3.2 

  

앱이 구동될 때 나타날 인트로 이미지

Launch image (iPad)

(UILaunchImageFile~ipad)

String

3.2 

   

Launch image (iPhone)

(UILaunchImageFile~iphone)

String

3.2 

   

none

(UILaunchImages)

Array

(Dictionary)

7.0 

   

Main storyboard file base name

(UIMainStoryboardFile)

String

5.0 

O

 

앱의 메인 storyboard 파일 이름

(NSMainNibFile과 같이 쓸 수 없다)

Main storyboard file base name (iPad)

(UIMainStoryboardFile~ipad)

String

5.0 

   

Main storyboard file base name (iPhone)

(UIMainStoryboardFile~iphone)

String

5.0 

   

Renders with edge antialiasing

(UIViewEdgeAntialiasing)

Boolean

3.0 

  

픽셀 경계에 정렬되지 않은 레이어를 그릴 때 안티 앨리어싱을 적용할지

Renders with group opacity

(UIViewGroupOpacity)

Boolean

3.0 

  

서브 레이어가 슈퍼 레이어의 블투명도를 상속받아 사용할지

Required background modes

(UIBackgroundModes)

Array

(String)

4.0 

  

백그라운드에서 앱이 제공하는 서비스 목록 또는 멀티테스킹의 형태

Required device capabilities

(UIRequiredDeviceCapabilities)

Array

(String)

3.0 

O

 

앱 실행에 필요한 요구조건들

Targeted device family

(UIDeviceFamily) 

Number 

or

Array

(Number)

3.2 

  

앱 실행이 가능한 제품군 하나 또는 목록

Status bar is initially hidden

(UIStatusBarHidden)

Boolean

   

상태 바를 숨길지

Status bar style

(UIStatusBarStyle)

String

 

O

 

상태 바 스타일

Status bar tinting parameters

(UIStatusBarTintParameters)

Dictionary

7.0 

  

상태 바 색

Supported external accessory protocols

(UISupportedExternalAccessoryProtocols)

Array

(String)

3.0 

  

앱이 지원하는 외부 액세사리와 통신하는데 사용되는 프로토콜 목록

Supported interface orientations

(UISupportedInterfaceOrientations)

Array

(String)

3.2 

  

앱이 지원하는 인터페이스 방향

Supported interface orientations (iPad)

(UISupportedInterfaceOrientations~ipad)

Array

(String)

3.2 

   

Supported interface orientations (iPhone)

(UISupportedInterfaceOrientations~iphone)

Array

(String)

3.2 

   

View controller-based

status bar appearance

(UIViewControllerBasedStatusBarAppearance)

Boolean

7.0 

  

상태 바가 그려지는 방식을 컨트롤러의 설정에 따라 다르게 할지



+ Bundle OS Type code(CFBundlePackageType)에 사용되는 값들.  


APPL : 어플리케이션

FMWK : 프레임워크 또는 라이브러리

BNDL : 로드 가능한 번들(다른 문자가 들어가도 된다)



Document types(CFBundleDocumentTypes)의 요소 구성.     


 

자료형

 지역화

설명

 none

 (CFBundleTypeIconFiles)

 Array

 

 해당 문서 형식에 사용될 아이콘 이미지 파일 이름 목록

 (아이콘 사이즈 규격은 여기를 참조)

 Document Type Name

 (CFBundleTypeName)

 String

O 

 문서 형식의 이름

 Document Content Type UTIs

 (LSItemContentTypes)

Array 

 

 문서 형식에 대한 UTI



Icon files (iOS 5) or none(CFBundleIcons)의 요소 구성.   


 키

자료형

버전

 필수

설명

 CFBundleIconFiles

Array or String 

5.0 

 O

 아이콘 파일 이름 또는 목록

 UIPrerenderedIcon

Boolean 

5.0 

 

 아이콘 파일에 광택 효과가 들어가 있는지



+ Localization native development region(CFBundleDevelopmentRegion)에 사용되는 값들.    

Canada : en_CA                         France : fr_FR                    Japan : ja_JP                    United Kingdom : en_GB

Canada (French) : fr_CA            Germany : de_DE               Korea : ko_KR                  United States : en_US

China : zh_CH                            Italy : it_IT                           Taiwan : zh_TW



+ Localizations(CFBundleLocalizations)에 사용되는 값들.   

en, fr, de, ko, ja, nl, it, es, pt, da, fi, nb, sv, zh-Hans, zh-Hant, ru, pl, tr, uk, ar, hr, cs, el, he, ro, sk, th, id, ms, ca, hu, vi



+ URL Types(CFBundleURLTypes)의 요소 구성.    


자료형

 필수

 지역화

설명

 Document Role

 (CFBundleTypeRole)

 String

O

 

 URL에 대하여 앱의 수행할 일

Editor : 읽기, 쓰기, 저장

Viewer : 읽기, 출력

Shell : 다른 앱 위에 특정 일을 수행

None : 신호만 받음

 Document Icon File Name

 (CFBundleURLIconFile)

String 

 

 

 URL을 수행함에 있어 사용될 아이콘 이미지 파일 이름

 URL Identifier

 (CFBundleURLName)

 String

 

O 

 URL을 식별할 수 있는 이름

 (보통 번들 식별키를 접두로 쓰고 뒤에 이름을 붙인다)

 URL Schemes

 (CFBundleURLSchemes)

Array 

 

 

 URL 값



Maps routing app supported modes(MKDirectionsApplicationSupportedModes)에 사용되는 값들.    


Airplane, Bike, Bus, Car, Ferry, Pedestrian, StreetCar, Subway, Taxi, Train, Other



Exported/Imported Type UTIs(UTExportedTypeDeclarations, UTImportedTypeDeclarations)의 요소 구성.    


 키

자료형

버전

필수

지역화

설명

 Conforms to UTIs

 (UTTypeConformsTo)

 Array


O

 

 이 형식이 속하는 범주를 나타내는 UTI 목록

 (자세한 내용은 여기를 참조)

 Description

 (UTTypeDescription)

String

 

 

 내보내기 형식에 대한 설명

 Identifier

 (UTTypeIdentifier)

String

 

 

 

 내보내기 형식에 대한 UTI

 none

 (UTTypeSize64IconFile)

 String

 

 

 

 이 형식에 대한 아이콘(작은 것)

 none

 (UTType320IconFile)

String

 

 

 

 이 형식에 대한 아이콘(큰 것)

 Equivalent Types

 (UTTypeTagSpecification)

 Dictionary

 

O

 

 이 형식에 매핑되는 MIMEType, OSType codes8, pastboard types과 확장자 정보



Required background modes(UIBackgroundModes)에 사용되는 값들.    

버전

설명 

 Audio and AirPlay

 (audio)

4.0

 - 앱은 백그라운드 재생(오디오 한정)을 지원한다.

 - 백그라운드로 빠져나간 상태에서도 재생을 유지한다.

  (동지재생에 대한 부분은 별도의 코드로 해결해야함)

 Location updates

 (location)

4.0

 - 앱은 사용자 위치정보 기반으로 서비스를 제공한다.

 - OS에 의해 주기적으로 위치 정보를 업데이트 받는다.

 - 업데이트 받을때 마다 앱을 깨운다.

 Voice over IP

 (voip)

4.0

 - 앱 Voice-over-iP 서비스를 제공한다.

 - 시스템 부팅 및 설치 후 또는 실행 후로 부터 OS가 네트워크를 감시하여 앱에 연관된 통화가 걸려오면 앱을 깨운다.

 - 백그라운드 재생이 가능하다.

 Background fetch

 (fetch)

7.0

 - 앱은 백그라운드 다운로드를 사용한다.

 - 앱의 콘텐츠를 업데이트할 때 OS에서 일정 시간을 할애하여 백그라운드 작업을 통해 콘텐츠를 다운 받을 수 있도록 한다.

 - 이 백그라운드 다운로드는 OS 차원에서 관리한다.

 Remote notification

 (remote notification)

7.0

 - 앱은 향상된 푸쉬 서비스를 지원한다.

 - 기존 푸쉬는 메시지를 받아오는 시점이 사용자가 화면을 슬라이드해서 메시지를 보기로 선택한 후 이지만, 이것은 푸쉬를 받으면 곧바로 메시지를 다운받고 기존 푸쉬처럼 사용자에게 알려준다.

 Newsstand downloads

 (newsstand content)

5.0

 - 앱은 뉴스 가판대를 서비스한다.

 - 원하는 시점에 새 콘텐츠를 받을 수 있도록 백그라운드 다운로드를 지원한다.

 - 다운로드 처리는 뉴스 가판대 프레임워크를 사용한다.

 External accessory communication

 (external accessory)

5.0 

 - 앱 iOS 기반의 기기를 대상으로 통신을하는 블루투스 액세사리 또는 iOS 디바이스 커넥터를 이용한 서비스를 제공한다.

 - 정기적으로 기기와 통신한다.

 - 이 모드를 사용할 경우 추가적으로 UISupportedExternalAccessoryProtocols 값 입력을 요한다. 자세한 내용은 여기를 참조.

 Uses Bluetooth LE accessories

 (bluetooth central)

5.0

 - 앱은 블루투스 액세사리 연동(중앙장치 모드)을 지원한다.

 - CoreBluetooth 프레임워크를 사용하여 정기적으로 통신한다.

 Acts as a Bluetooth LE accessory

 (bluetooth peripheral)

6.0 

 - 앱은 블루투스 액세사리 연동(주변장치 모드)을 지원한다.

 - CoreBluetooth 프레임워크를 사용하여 정기적으로 통신한다.

 - 블루투스 사용에 대한 경고 창을 띄운다.



Required device capabilities(UIRequiredDeviceCapabilities)에 사용되는 값들.   


 값

버전

설명

 telephony

3.0

 전화 기본 앱이 있어야 한다. (전화가 가능한 기기여야 한다)

 wifi

3.0

 네트워크에 액세스할 수 있어야 한다. (Wi-Fi 연결이 가능한 기기여야 한다)

 sms

3.0

 메시지 기본 앱이 있어야 한다. (iMessage 또는 SMS, MMS를 보낼 수 있는 기기여야 한다)

 still-camera

3.0

 카메라가 탑재된 기기여야 한다.

 auto-focus-camera

3.0

 자동 초점 기능을 지원하는 카메라가 탑재된 기기여야 한다.

 front-facing-camera

3.0

 전면부 카메라가 탑재된 기기여야 한다.

 camera-flash

3.0

 카메라 플래쉬가 탑재된 기기여야 한다.

 video-camera

3.0

 비디오 촬영이 가능한 카메라가 탑재된 기기여야 한다.

 accelerometer

3.0

 가속도계가 탑재된 기기여야 한다.

 gyroscope

3.0

 자이로스코프가 탑재된 기기여야 한다.

 location-services

3.0

 CoreLocation 프레임워크를 사용할 수 있는 기기여야 한다.

 (높은 수준의 정확도를 요하지 않는 위치 서비스에 해당됨)

 gps

3.0

 GPS 또는 AGPS가 탑재된 기기여야 한다.

 (이 값은 'location-services'와 같이 사용해야 한다)

 magnetometer

3.0

 자력계가 탑재된 기기여야 한다.

 gamekit

4.1

 Game Center 기본 앱이 있어야 한다.

 microphone

3.0

 내장 마이크 탑재된 또는 외장 마이크를 연결한 기기여야 한다.

 opengles-1

3.0

 OpenGL ES 1.1을 지원할 수 있는 기기여야 한다.

 opengles-2

3.0

 OpenGL ES 2.0을 지원할 수 있는 기기여야 한다.

 opengles-3

7.0

 OpenGL ES 3.0을 지원할 수 있는 기기여야 한다.

 armv6

3.1

 ARMv6 명령어 셋을 지원하는 기기여야 한다.

 armv7

3.1

 ARMv7 명령어 셋을 지원하는 기기여야 한다.

 peer-peer

3.1

 블루투스를 통해 Peer-to-Peer 통신이 가능한 기기여야 한다.

 bluetooth-le

5.0

 저에너지형 블루투스 장치가 탑재된 기기여야 한다.



Targeted device family(UIDeviceFamily)에 사용되는 값들.    

1 : 아이폰, 아이팟 터치 제품군            2 : 아이패드 제품군            3 : 애플TV 제품군



Status bar style(UIStatusBarStyle)에 사용되는 값들.     

Gray style (default)            Transparent black style(alpha of 0.5)            Opaque black style



Supported interface orientations(UISupportedInterfaceOrientations)에 사용되는 값들.    


Portrait (bottom home button)

Portrait (top home button)

Landscape (left home button)

Landscape (right home button)



출처: http://padgom.tistory.com/entry/iOS-infoplist-Key-목록과-사용 [Padgom]

반응형
반응형

소수점 이하를 올림하거나 내림하는 함수 입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <math.h>
 
int main(void)
{
    double x = 1.5;
    printf("ceil(%f) =%f\n", x, ceil(x));
    printf("floor(%f) =%f\n", x, floor(x));
    return 0;
}
 
//결과값
// ceil(1.5) = 2
// floor(1.5) = 1
cs


ceil은 올림 함수 이고

floor은 내림 함수입니다.


유용하게 사용할 수 있습니다.


반응형
반응형

TEXTURE FORMATS SUPPORTED BY COCOS2D-X

FormatAlphaPixel FormatHardware DecodedMipMapAlpha PremultipliedPlatform
PNGARGB888/RGBA8888/I8/IA88N/AN/AYesAll
JPGN/ARGB888/I8N/AN/AN/AAll
WebPARGBA8888N/AN/ANoAll
TIFFARGBA8888N/AN/AYesAll
TGAARGB5A1/RGB888/RGBA8888/I8N/AN/ANoAll
PVRv2APVRTC2/PVRTC2A/PVRTC4/PVRTC4APowerVR GPUANoiOS
PVRv3APVRTC2/PVRTC2A/PVRTC4/PVRTC4APowerVR GPUAFlag DependentiOS
ETC1N/ARGB888GLES 2.0 GPUN/AN/AAll(SD)
ATITCAATC_RGB/ATC_EXPLICIT_ALPHA/ATC_INTERPOLATED_ALPHAAdreno GPUANoAll(SD)
S3TCAS3TC_DXT1/S3TC_DXT3/S3TC_DXT5YANoAll(SD)

Note:
A: Available
N/A: Not Available
Yes: Available and Enabled
No: Available and Disabled
SD: Soft Decoder on unsupported platforms

  • The hardware decoded devices may supported more than what listed in the table. Please refer to Configure::support* to check if it is available on the running device.
  • PVR supports more pixel formats in practice, but we are just listing the most common types.
  • For software decoder, the files are always loaded into Texture2D with RGBA8888 decoded.


왠만한 이미지들은 cocos2d-x에서 모두 지원합니다.

저거 이외에 이미지를 로드해야할 이유는 크게 없다고 보는데

가끔 유니티 사용하는 디자이너들이 PSD파일이 바로 로드 되니깐 

즉시 사용하는 경우가 종종 있는데 좋은 방법은 아닌것 같습니다.


반응형
반응형

예전에 n승을 구하기 위해 재귀함수를 만들어 호출했던 기억이 남니다.


1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
double pow(int x, int n)
{
    if(0 <= n)
        return n? (n * pow(x, n - 1)) : 1;
    else
        return x? (double)1 / (double)pow(x, (-1* n) : 0;
}
 
cs


이런식으로 함수를 만들어서 n이 0이 될 때까지 재귀호출하는 방식

아니면 다른 방법으로는 반복문을 만들어서 돌리는 방식도 있습니다.

2가지 같은 방식이라고 보셔도 됩니다. 


좀 더 편해진 방식이 비트 연산자를 이용한 방식이죠 

1
= 1 << n;
cs

위와 같이 간단하게 구할 수도 있습니다.


마지막으로 가장 간단한 방법인데 

math.h에 pow 함수가 이미 만들어져 있습니다.


1
2
3
4
5
6
7
8
#include <math.h>
int main(){
    int n = 2;
    int x = 2;
    
    k = pow(x,n);
    return 0;
}
cs


간다하게 사용하시면 됩니다.

모두 결과는 같습니다.

반응형
반응형

티스토리에 반응형 스킨을 사용하다 보면 티스토리 모바일 스킨을 사용 하지 않게 됩니다. 반응형이 알아서 조절해주기 때문에 이쁘게 나오기도 하는 장점도 있지만 모바일 스킨을 사용하지 않고 반응형으로 PC와 모바일을 같이 사용하게 되면 코드도 하나로 통일 할 수있는 장점이 있습니다.


제가 발견한 단점은 모바일 전용 애드센스를 사용할 수 없다는 점이 단점이었습니다. 반응형 애드센스 광고를 삽입해도 되지만 문제는 PC에서는 광고3개 모바일에서는 광고 2개까지만 삽입할 수 있다는 것이 문제가 되었습니다. 반응형으로 3개를 적용하자니 모바일에서 정책위반으로 짤릴 수도 있기 때문 입니다.


그래서 제가 선택한 방법은 상단에 PC와 모바일에서 같이 사용할 수 있는 반응형 애드센스 1개

를 삽입하고 하단에는 사각형 광고를 PC에서는 2개  모바일에서는 1개만 노출해주는 방법으로

해보았습니다.


시작전에 3개의 광고를 생성하세요.

1. 반응형 광고 1개

2. 직사각형 광고 2개 (저는 300x250 광고2개로 사용. 336x280사용하셔도 됩니다.)


1
2
3
4
5
6
7
8
9
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-xxxxxxxxxxxxxxxx"
     data-ad-slot="xxxxxxxxxx"
     data-ad-format="auto"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
cs


상단에 반응형 애드센스 광고를 1개 배치합니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<style>
    .ad1 {width: 0px; height: 0px;}
    .ad2 {width: 0px; height: 0px;}
    @media (min-width: 350px) { .ad1 { width: 300px; height: 250px; }}
    @media (min-width: 400px) { .ad1 { width: 336px; height: 280px; }}
    @media (min-width: 720px) { .ad1 { width: 336px; height: 280px; }}
    @media (min-width: 810px) { .ad1 { width: 300px; height: 250px; } .ad2 { width: 300px; height: 250px; margin-left: 1%;}}
    @media (min-width:1120px) { .ad1 { width: 300px; height: 250px; } .ad2 { width: 300px; height: 250px; margin-left: 1%;}}
    @media (min-width:1200px) { .ad1 { width: 336px; height: 280px; } .ad2 { width: 336px; height: 280px; margin-left: 1%;}} 
</style
 
<div class="adstyle1" style="text-align: center; margin-bottom:80px;">
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- 하단 광고 1 -->
<ins class="adsbygoogle ad1"
     style="display:inline-block"
     data-ad-client="ca-pub-xxxxxxxxxxxxxxxx"
     data-ad-slot="xxxxxxxxxx"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
 
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- 하단 광고 2 -->
<ins class="adsbygoogle ad2"
     style="display:inline-block"
     data-ad-client="ca-pub-xxxxxxxxxxxxxxxx"
     data-ad-slot="xxxxxxxxxx"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script
</div>
cs


하단에 직사각형 배너를 배치하는데 브라우저 크기에 따란 직사각형 배너의 크기를 변경하고 모바일 태블릿 최대 Width 가 800이기 때문에 800까지는 광고가 1개만 810이상이면 2개가 나오도록 설정하는 스크립트 입니다.




위 소스를 적용하면 모바일에선 상단에 광고1개 하단에 광고1개

PC에서는 상단에 광고1개 하단에 광고 2개가 나오도록 되어 있습니다.



조금씩 수정하면서 더 많은 것들을 할 수 있으니 자신에 스타일에 맞게 코드를 수정하여 적용하시면 유용하게 사용하실 수 있을거라 생각 됩니다.


반응형

'- Ads' 카테고리의 다른 글

[ Ads] 성인광고 Adsense 대체하여할 경우 정보  (10) 2016.06.29
반응형

Adsense는 자신들은 성인광고를 노출 하면서 

성인 컨텐츠에 자신들의 광고를 적용하면 가이드라인에 준수하지 못하였다면서

경고를 주고 수정하지 않을 경우 계정차단까지 시킵니다.

참으로 어처구니가 없더군요.


자신들의 성인광고는 도대체 어디에 노출 시키란 말인가요...

자신들의 이미지만 챙기고 사용자들의 이미지는 실추 시키는 꼴이죠


대부분의 Adsense 성인광고로 검색하시면 성인광고 차단에 관해서만 있을 뿐 

Adsense 대신 사용할 성인광고는 검색이 되지 않더군요.


그래서 직접 찾아 본 결과 괜찮은 정보 사이트가 있어 공유 합니다.


http://adswikia.com/top-10-best-adult-advertising-networks/


해외에서 사용하고 있는 성인광고 Top10 입니다.


가입도 어렵지 않으며 Adsense보다 쉽고 빠르게 승인 받을 수 있어 사용하기 용이 합니다.

한국분들이 사용하려면 한가지 애매한 부분이 있는데  Tax ID를 넣으라고 나옵니다. 

Tax ID를 발급받아서 넣을 수 도 있지만 번거롭고 쉽지 않죠.

그러나 방법은 있습니다. 대부분이 Tax ID대신 Passport ID(여권번호) 를 넣어도 됩니다.

여권 번호를 넣으라고 하니 이상한 사이트 아닌가? 혹시나 여권 도용에 사용되지 않을까 염려가 많으신데

제가 4군데 정도 가입하고 넣어서 사용중인데 아직까지는 별탈 없이 진행되고 있습니다.


또한가지 수익입금에 대한 부분인데 대부분이 Paypal을 지원하고 있습니다.

Paypa에 비지니스로 가입하시고 은행연결하시면 문제 없이 잘 됩니다.

Paypal은 한국도 지원하기 때문에 가입하기 어렵지 않습니다.


그럼 이제 제가 사용한 4가지 사이트에 대한 일주일 사용에 대한 간단한 리뷰 남겨 봅니다.


1. exoclick

제일 많은 광고주와 사용자를 보유 하고 있습니다. 

또한 성인광고부터 일반적인 광고까지 모두 사용할 수 있습니다.

단점은 어설픈 성인 사이트는 성인광고를 사용할 수 없습니다. 예를들어 중요 부위가 전부 노출 되는 정도는 되야 성인광고가 

승인됩니다. 저같은 경우 섹시한 게시물 이였는데 성인사이트 부적합 판정을 받아 사용 불가 하였습니다. 

그리고 Sexy and Erotic으로 분류하여 승인을 받고 광고를 한 결과 아래와 깉은 수치가 나옵니다.

참담합니다. 애드센스였으면 적어도 20~50불은 벌었을텐데요 

성인 광고로는 해보지 못하고 일반적인 광고로만 했을 경우 수치 입니다. 참고하세요


2. eroAdvertising

exoclick다음올 많은 사용자와 광고주들을 보유하고 있다고 합니다. 

하지만 exoclick와 비슷한 수준의 수입 이구요

그래도 다행인것은 섹시한 게시물로도 성인 광고 인증은 되더라구요 

아래 수입 공유 합니다.

exoclick만큼 사용해보진 않았지만 37클릭에 0.000이라는 수치에 과감하게 접었습니다.


3. AdXpansion

eroAdvertising과 매우 유사합니다. 사이트 승인도 잘해주고 성인광고도 거침없이 나오고 

하지만 클릭수가 너무 적어 포기 했습니다.

데이터가 적긴 하지만 eroAdvertising에 비하면 적은 클릭수죠


4. juicyAds (추천)

제가 추천하고 싶은 사이트 입니다. 

현재까지 수입 젤 좋고 계속 이용중 인데요 

성인광고 잘나오고 클릭율 좋고 수입 가장 좋아서 선택 했습니다. 4개 사이트 뿐이 테스트 안해 봤지만 

10개의 사이트 모두 해보려다가 다른 사이트에 비해 워낙 수입이 좋아서 여기서 멈췄습니다. 

위 사이트들 보다 큰 회사는 아니지만 머니머니해도 수입율이 젤 중요한거 아니겠습니까

클릭율도 좋구요 CPC가 가장 높은 것 같았습니다. 

그리고 이사이트에 장점하나는 내 사이트에 광고 공간을 팔 수 있다는 점 입니다.

내 사이트에 트래픽수를 보여주고 일주일간 배너를 달아주는데 1000불 이런식으로 제가 가격을 선택하여 

광고주들이 보고 괜찮다 싶으면 광고배너를 사는 시스템이죠 

나중에 트래픽이 높아지면 도전해보려고 합니다. 


그외에 추천 드리고 싶은 사이트는(구글링 검색한 결과롤 토대로) TrafficJunky , PlugRush 정도 ? 

제가 테스트틀 짧게 하여 (인내심 부족 ㅠㅠ) 정확한 데이터가 아닐 수 있습니다.


이보다 더 좋은 사이트나 더 좋은 성과를 내는 사이트가 있다면 공유 부탁 드립니다.

서로서로 돕고 살자구요 ^^


궁금하신 점은 댓글 달아 주세요.


반응형

'- Ads' 카테고리의 다른 글

[ Ads ] 티스토리 반응형 스킨에 애드센스 광고 조절  (0) 2016.09.29
반응형

[ rpm Install 방법 ]

1. 터미널을 실행 합니다.

2. 터니널에 아래 내용을 복사하여 붙여넣기 하고 실행 합니다.

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null

3. 위 명령어 실행이 끝나면 아래 명령어를 터니멀에 다시 붙여 넣기 합니다.

brew install rpm


[ RPM 설치/확인/제거 ]

설치

rpm -ivh 패키지명

확인

rpm -qa | grep 패키지명 

제거

rpm -ev 패키지명


반응형
반응형

괜찮은 사이트 소개 합니다.

유니코드 변환 사이트 인데요 

사용법도 간단하고 성능 우수 합니다.

아래와 같이 테스트 해보았습니다.


<한글 입력 후 변환>


<유니코드 입력 후 변환>


엄청나내요 


http://r12a.github.io/apps/conversion/


반응형
반응형

현재 작업 중인 유니티 버전이 4.x라서 페이스북 유니티 플러그인 6.2.2 버전을 사용 했습니다.

현재 최신 버전은 7.5.0 버전인데 이 버전은 유니티 5이상에서 사용 가능합니다.

메소드 명이 조금 다르거나 할 뿐이지 큰 차이는 없을 겁니다.


기본 페이스북 앱 만들기와 페이스북 플러그인 연동 작업을 완료 했다는 전제하에 핵심 부분만 적도록 하겠습니다.


우선 페이스북 내 앱에서 오픈그래프를 선택하시고 개체 유형 탭을 선택

맨 아래 있는 개체 유형 추가 버튼을 클릭하여 "Gift"라는 개체를 생성 합니다.


그 다음 오브젝트에 아이디를 가져와야 하는데 

이부분에서 많이 헤맸었내요 ㅠ_ㅠ


개발자 페이지 맨 아래 보면 아래와 같이 메뉴가 있습니다.

TOOLS에 개체 브라우저를 클릭 합니다.



개체브라우저를 열고 App에서 자신의 앱을 선택 하고 Type을 클릭하면 방금 생성한 Gift라는 개체가 있습니다. 


이 개체를 선택 하면 아래와 같은 화면이 나옵니다.

Id를 메모해 둡니다.


방금 메모 하신 Id를 아래 object_id에 넣으시고 호출 하시면 됩니다.


public void SendHeartGift(string userid){

string[] users = {userid};

FB.AppRequest (

"Test Send Heart Gift",

OGActionType.Send,

"Object_id",

users,

"Gift",

"",

SendHeartGiftCallback);

}



그러면  userid에게 알림 메시지가 보내집니다.

그후 받은 유저쪽에서는 아래 코드를 이용하여 선물박스를 열었을 때 페이스북에서 받은 하트를 페이스북으로 요청합니다.


public class FBGift {

public string data;

public string fbId;

public string createTime;

public string from;

public string name;

public string fromId;

}


// Gift 리스트를 가져옵니다.

public void GiftList() {

this._listGift.Clear ();

FB.API ("me/apprequests?fields=from,message,data&limit=200", 

Facebook.HttpMethod.GET,

GiftListCallback);

}

private void GiftListCallback(FBResult result) {


if (result.Error == null) {

JSONNode root = JSON.Parse(result.Text.ToString());

JSONArray data = root["data"].AsArray;

for( int i = 0; i < data.Count; ++i ) {

FBGift cGift = new FBGift();

JSONNode gift = data[i];

if( gift == null ) {

continue;

}

cGift.data = gift["data"].Value.ToString();

cGift.fbId = gift["id"].Value.ToString();

cGift.createTime = gift["created_time"].Value.ToString();

JSONNode from = gift["from"];

cGift.name = from["name"].Value.ToString();

cGift.fromId = from["id"].Value.ToString();

this._listGift.Add(cGift);

}

this.onGiftListComplete();

} else {

this.onGiftListError("GifList", result.Error);

}

}




마지막으로 하트 받기를 하였으면 받은 유저쪽에서 리스트에서 object_id를 이용하여 삭제를 해주어야 무한하트를 막을 수 있습니다.


아래 코드를 이용하여 삭제해 줍니다.


public void DeleteRequestId(string id) {

string path = "/" + id;

FB.API (path, 

Facebook.HttpMethod.DELETE,

DeleteRequestIdCallback);

}


private void DeleteRequestIdCallback(FBResult result) {

if (result.Error == null) {

Debug.Log("Delete Request id: " + result.Text);

} else {

Debug.LogError("Delete Request id: " + result.Error);

}

}


개발중에 대충 적어 보았습니다.

궁금한점 있으시면 댓글 남겨 주세요.

반응형

'- Unity And C#' 카테고리의 다른 글

[C#] 숫자 콤마(,) 넣기 (금액표시 유용)  (0) 2017.09.28
반응형


로그인과 같은 기능을 추가할 때 EditBox를 사용하는데 

안드로이드는 Back키가 있어 키보드를 내릴 수 있지만 iOS는 키보드를 내릴 방법이 없습니다.

간혹 오픈되어 있는 앱들을 설치하여 사용할 때도 iOS같은 경우 키보드를 내리지 못해 다음 단계로 

넘어가지 못한 다던가 그러한 문제가 발생하여 유저들로 부터 깊은 빡침을 받게 합니다.


유저들은 이런거 못참습니다. 

바로 삭제 해버리죠 ^^


스토어에 삭제 수가 점점 늘어 나길래 원인 분석을 하다보니 이와 같은 문제가 있다고 판단하여 

강제로 키보드를 내리는 방법을 구글링으로 찾아 보았으나 좋은 방법을 찾진 못했습니다.

그래서 엔진 쪽을 살펴 보다보니 좋은 방법이 떠올라 글 남깁니다.


엔진 쪽을 자세히 보니 ui::EditBox를 살펴보니 키보드를 활성화 시키는 방법은 있었습니다.

UIEditBox.cpp 파일을 보면 다음과 같은 부분이 있습니다.


1
2
3
4
5
6
7
void EditBox::touchDownAction(Ref *sender, TouchEventType controlEvent)
{
    if (controlEvent == Widget::TouchEventType::ENDED) {
        _editBoxImpl->openKeyboard();
    }
}
 
cs


touchDownAction에 EventType을 ENDED를 주면 키보드를 강제 활성화 시킵니다.

사용법은 아래와 같이 touchDownAction 함수를 호출해주면 됩니다.

1
m_EditBox->touchDownAction(m_EditBox, cocos2d::ui::Widget::TouchEventType::ENDED);
cs
< Keyboard Open >


하지만 아무리 찾아 봐도 키보드를 Close하는 부분은 빠져 있습니다.
cocos2d쪽에서 다른 문제가 생길 수 있어 해놓지 않은 것 인지 
아직 이런 문제를 파악하지 못해 수정을 안한 것인지...
버전업이 되다 보면 알 수 있겠내요. ^^


그래서 키보드를 Close하는 부분을 소스에 간단하게 추가해봤습니다.
1
2
3
4
5
6
7
8
void EditBox::touchDownAction(Ref *sender, TouchEventType controlEvent)
{
    if (controlEvent == Widget::TouchEventType::ENDED) {
        _editBoxImpl->openKeyboard();
    } else if (controlEvent == Widget::TouchEventType::CANCELED) {
        _editBoxImpl->closeKeyboard();
    }
}
cs

EventType을 CANCELED로 주면 키보드를 강제로 비활성화 하도록 수정했습니다.


touchDownAction를 호출할 때 Event Type을 CANCELED로 주면 키보드가 Close 됩니다.


1
m_EditBox->touchDownAction(m_EditBox, cocos2d::ui::Widget::TouchEventType::CANCELED);
cs

< Keyboard Close >



엔진을 수정하여 사용하게 되면 나중에 어떤 문제가 생기거나 엔진 버전 업이 될 경우 손이 많이 가게 됩니다.

수정한 부분을 간혹 잊어 버리고 엔진을 덮어 써버릴 경우 백업을 하지 않았다면 소스가 날아가 버립니다. ㅠ

하지만 이런 어쩔수 없는 상황에서는 수정해서 사용할 수 밖에 없습니다.



반응형
반응형

cocos2d-x를 이용하여 Youtube동영상을 재생하는 웹화면을 개발 중인데 

cocos2d-x 3.3 이상부터 Webview를 지원하여 걱정없이 개발 하고 있었습니다.


개발 다 끝내고 iOS테스트 완료 하였습니다.. 

Android 테스트하는데... 좌절하고 말았습니다.


3가지 문제가 발생했습니다.


  1. 유투브 동영상 전체화면을 지원불가.
  2. 동영상 전체화면까지 수정했으나 전체화면에서 가로/세로 화면전환 불가.
  3. Webview를 remove하여도 동영상 사운드 계속 재생.

어찌어찌 짧은 Java실력으로 cocos2dx Java Source 수정하여 3가지 모두 해결보았습니다.

1, 2번 문제 부터 해결해 보도록 하겠습니다. 


cocos2d에 아래 경로로 가시면 Cocos2dxWebView.java 파일이 있습니다.

"프로젝트명"/cocos2d/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxWebView.java

이 파일을 아래의 소스로 교체 합니다.


[ Cocos2dxWebView.java File ]


package org.cocos2dx.lib;

 

import android.annotation.SuppressLint;

import android.app.Activity;

import android.app.ProgressDialog;

import android.content.Context;

import android.content.pm.ActivityInfo;

import android.graphics.Bitmap;

import android.os.Build;

import android.util.Log;

import android.view.Gravity;

import android.view.MotionEvent;

import android.view.View;

import android.view.ViewGroup;

import android.view.Window;

import android.view.WindowManager;

import android.webkit.JsResult;

import android.webkit.WebChromeClient;

import android.webkit.WebSettings;

import android.webkit.WebView;

import android.webkit.WebViewClient;

import android.widget.FrameLayout;

import android.widget.Toast;

 

import java.lang.reflect.Method;

import java.net.URI;

import java.util.concurrent.CountDownLatch;

 

class ShouldStartLoadingWorker implements Runnable {

    private CountDownLatch mLatch;

    private boolean[] mResult;

    private final int mViewTag;

    private final String mUrlString;

    

    ShouldStartLoadingWorker(CountDownLatch latch, boolean[] result, int viewTag, String urlString) {

        this.mLatch = latch;

        this.mResult = result;

        this.mViewTag = viewTag;

        this.mUrlString = urlString;

    }

    

    @Override

    public void run() {

        this.mResult[0] = Cocos2dxWebViewHelper._shouldStartLoading(mViewTag, mUrlString);

        this.mLatch.countDown(); // notify that result is ready

    }

}

 

public class Cocos2dxWebView extends WebView {

    private static final String TAG = Cocos2dxWebViewHelper.class.getSimpleName();

    

    private int mViewTag;

    private String mJSScheme;

    

    public Cocos2dxWebView(Context context) {

        this(context, -1);

    }

    

    @SuppressLint("SetJavaScriptEnabled")

    public Cocos2dxWebView(Context context, int viewTag) {

        super(context);

        this.mViewTag = viewTag;

        this.mJSScheme = "";

        

        this.setFocusable(true);

        this.setFocusableInTouchMode(true);

        

        this.getSettings().setSupportZoom(false);

        this.getSettings().setJavaScriptEnabled(true);

        this.getSettings().setDisplayZoomControls(true);

        

        // `searchBoxJavaBridge_` has big security risk. http://jvn.jp/en/jp/JVN53768697

        try {

            Method method = this.getClass().getMethod("removeJavascriptInterface", new Class[]{String.class});

            method.invoke(this, "searchBoxJavaBridge_");

        } catch (Exception e) {

            Log.d(TAG, "This API level do not support `removeJavascriptInterface`");

        }

        

        this.setWebViewClient(new Cocos2dxWebViewClient());

        //this.setWebChromeClient(new WebChromeClient());

 

        // 새로만든 Chromeclient를 추가.

        this.setWebChromeClient(new ChromeClient((Cocos2dxActivity)getContext()));

    }

    

    public void setJavascriptInterfaceScheme(String scheme) {

        this.mJSScheme = scheme != null ? scheme : "";

    }

    

    public void setScalesPageToFit(boolean scalesPageToFit) {

        this.getSettings().setSupportZoom(scalesPageToFit);

    }

    

    class Cocos2dxWebViewClient extends WebViewClient {

        @Override

        public boolean shouldOverrideUrlLoading(WebView view, final String urlString) {

            Cocos2dxActivity activity = (Cocos2dxActivity)getContext();

            

            try {

                URI uri = URI.create(urlString);

                if (uri != null && uri.getScheme().equals(mJSScheme)) {

                    activity.runOnGLThread(new Runnable() {

                        @Override

                        public void run() {

                            Cocos2dxWebViewHelper._onJsCallback(mViewTag, urlString);

                        }

                    });

                    return true;

                }

            } catch (Exception e) {

                Log.d(TAG, "Failed to create URI from url");

            }

            

            boolean[] result = new boolean[] { true };

            CountDownLatch latch = new CountDownLatch(1);

            

            // run worker on cocos thread

            activity.runOnGLThread(new ShouldStartLoadingWorker(latch, result, mViewTag, urlString));

            

            // wait for result from cocos thread

            try {

                latch.await();

            } catch (InterruptedException ex) {

                Log.d(TAG, "'shouldOverrideUrlLoading' failed");

            }

            

            return result[0];

        }

        

        @Override

        public void onPageFinished(WebView view, final String url) {

            super.onPageFinished(view, url);

            Cocos2dxActivity activity = (Cocos2dxActivity)getContext();

            activity.runOnGLThread(new Runnable() {

                @Override

                public void run() {

                    Cocos2dxWebViewHelper._didFinishLoading(mViewTag, url);

                }

            });

        }

        

        @Override

        public void onReceivedError(WebView view, int errorCode, String description, final String failingUrl) {

            super.onReceivedError(view, errorCode, description, failingUrl);

            Cocos2dxActivity activity = (Cocos2dxActivity) getContext();

            activity.runOnGLThread(new Runnable() {

                @Override

                public void run() {

                    Cocos2dxWebViewHelper._didFailLoading(mViewTag, failingUrl);

                }

            });

        }

    }

    

    public void setWebViewRect(int left, int top, int maxWidth, int maxHeight) {

        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,

                                                                             FrameLayout.LayoutParams.WRAP_CONTENT);

        layoutParams.leftMargin = left;

        layoutParams.topMargin = top;

        layoutParams.width = maxWidth;

        layoutParams.height = maxHeight;

        layoutParams.gravity = Gravity.TOP | Gravity.LEFT;

        

        this.setLayoutParams(layoutParams);

    }

    

    // 전체화면 가능한 ChromeClient를 WebVhromeClient를 상속받아 새로 만듬...

    public final class ChromeClient extends WebChromeClient {

        private View mCustomView;

        private Activity mActivity;

        

        public ChromeClient(Activity activity) {

            this.mActivity = activity;

        }

        

        @Override

        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {

            result.confirm();

            return super.onJsAlert(view, url, message, result);

        }

        

        private int mOriginalOrientation;

        private FullscreenHolder mFullscreenContainer;

        private CustomViewCallback mCustomViewCollback;

        

        @Override

        public void onShowCustomView(View view, CustomViewCallback callback) {

            

            if (mCustomView != null) {

                callback.onCustomViewHidden();

                return;

            }

            

            mOriginalOrientation = mActivity.getRequestedOrientation();

            

            FrameLayout decor = (FrameLayout) mActivity.getWindow().getDecorView();

            

            mFullscreenContainer = new FullscreenHolder(mActivity);

            mFullscreenContainer.addView(view, ViewGroup.LayoutParams.MATCH_PARENT);

            decor.addView(mFullscreenContainer, ViewGroup.LayoutParams.MATCH_PARENT);

            mCustomView = view;

            mCustomViewCollback = callback;

            //mActivity.setRequestedOrientation(mOriginalOrientation);

            

            // 기존의 프로젝트의 Orientation을 따르는 것이 아니라 전체화면일 경우는 Sensor의 의해 Orientation결정

            mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

        }

        

        @Override

        public void onHideCustomView() {

            if (mCustomView == null) {

                return;

            }

            

            FrameLayout decor = (FrameLayout) mActivity.getWindow().getDecorView();

            decor.removeView(mFullscreenContainer);

            mFullscreenContainer = null;

            mCustomView = null;

            mCustomViewCollback.onCustomViewHidden();

            

            mActivity.setRequestedOrientation(mOriginalOrientation);

        }

        

    }

    

    static class FullscreenHolder extends FrameLayout {

        

        public FullscreenHolder(Context ctx) {

            super(ctx);

            setBackgroundColor(ctx.getResources().getColor(android.R.color.black));

        }

        

        @Override

        public boolean onTouchEvent(MotionEvent evt) {

            return true;

        }

    }

    

}

 


위 소스로 교체시 WebView에서 동영상 전체화면과 가로/세로는 해결 됩니다.


그 다음 WebView종료시 계속 재생되는 사운드가 문제인데 이부분은 아래 파일을 수정해야 합니다.

"프로젝트명"/cocos2d/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxWebViewHelper.java


[ Cocos2dxWebViewHelper.java File ]


public static void removeWebView(final int index) {

    sCocos2dxActivity.runOnUiThread(new Runnable() {

        @Override

        public void run() {

            Cocos2dxWebView webView = webViews.get(index);

            if (webView != null) {

                webViews.remove(index);

                sLayout.removeView(webView);

                

                // webview를 Destory 해야 사운드 재생이 멈춘다.

                webView.destroy();

                webView = null;

            }

        }

    });

}


removeWebView Method를 위와 같이 수정시 WebView를 remove할 경우 사운드 재생이 멈춥니다.

또는 setStopWebView와 같은 Method를 새로 만들어 사운드 재생만을 멈추게 할수도 있습니다.


위 2가지를 수정하면 정상적으로 유투브 동영상을 재생할 수 있습니다.

cocos2d에서 하루 빨리 수정해주었으면 하내요 ^^


그전에 조금이나마 도움이 될 수 있을 것 같아 공유합니다.


근데 더 큰 문제 점이 있었내요.

Android 문제를 해결 하고 마켓에 올렸는데

유투브 동영상을 제 앱에서 바로 실행하면 앱이 거절 당한다는 메시지가 날라 왔습니다.

유투브 동영상으로 수입을 벌면 안된다는 얘기더군요.


결국 유투브 동영상을 제 앱에 웹브라우저 에서 실행하면 안되고 

유투브 사이트로 이동하여 플레이 하는 걸로 변경하여 해결해야 했습니다.


막상 이렇게 해결 하고 나니 제 앱이 쓸모가 없어졌내요. ㅠㅠ

구글이 점점 앱 제한이 커지는 것 같습니다. 


그래도 안전을 위한 구글에 선택이니 믿고 따라야죠. ^^

반응형
반응형

cocos2d-x에서 std::thread를 이용하여  multi thread를 사용하다보면 종종 에러가 나는 경우가 있습니다.

그 이유는 cocos object들이 별도의 thread를 돌리고 있기 때문인데 특히 통신 부분에서 많이 문제가 

발생하는 것 같습니다.


게임 만들다보면 thread를 꼭 써야 하는 예를 들어 로딩화면에서 로딩 프로그레스가 계속 돌면서 이미지를 

로드한다거나 사운드를 로드한다거나 하면 쓰레드를 쓰지 않고 그냥 실행시 로딩 프로그레스가 멈춰 있는

문제가 발생합니다. 


문제가 있는데 그럼 cocos2d는 thread를 쓰지 말라는 건가요?

아닙니다. 그래서 cocos2d-x scheduleer에서 편하게 사용할 수 있도록 만들어 놨습니다.

당연히 mutex도 걸려 있습니다.


저 같은 경우 Json Parsing에 이용하였는데 보통은 Game Loading부분에 많이 이용 합니다.

요즘 TextureCache::addImageAsync 라는 기능이 있어 이미지 로딩부분이 더 편해졌습니다만

그래도 알아보도록 하죠.


#include "HelloWorldScene.h"

 

USING_NS_CC;

 

Scene* HelloWorld::createScene()

{

    // 'scene' is an autorelease object

    auto scene = Scene::create();

    

    // 'layer' is an autorelease object

    auto layer = HelloWorld::create();

 

    // add layer as a child to scene

    scene->addChild(layer);

 

    // return the scene

    return scene;

}

 

// on "init" you need to initialize your instance

bool HelloWorld::init()

{

    //////////////////////////////

    // 1. super init first

    if ( !Layer::init() )

    {

        return false;

    }

    

    Size visibleSize = Director::getInstance()->getVisibleSize();

    Vec2 origin = Director::getInstance()->getVisibleOrigin();

 

    /////////////////////////////

    // 2. add a menu item with "X" image, which is clicked to quit the program

    //    you may modify it.

 

    // add a "close" icon to exit the progress. it's an autorelease object

    auto closeItem = MenuItemImage::create(

                                           "CloseNormal.png",

                                           "CloseSelected.png",

                                           CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));

    

    closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,

                                origin.y + closeItem->getContentSize().height/2));

 

    // create menu, it's an autorelease object

    auto menu = Menu::create(closeItem, NULL);

    menu->setPosition(Vec2::ZERO);

    this->addChild(menu, 1);

 

    /////////////////////////////

    // 3. add your codes below...

 

    // add a label shows "Hello World"

    // create and initialize a label

    

    auto label = Label::createWithTTF("Hello World", "fonts/Marker Felt.ttf", 24);

    

    // position the label on the center of the screen

    label->setPosition(Vec2(origin.x + visibleSize.width/2,

                            origin.y + visibleSize.height - label->getContentSize().height));

 

    // add the label as a child to this layer

    this->addChild(label, 1);

 

    // add "HelloWorld" splash screen"

    auto sprite = Sprite::create("HelloWorld.png");

 

    // position the sprite on the center of the screen

    sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

 

    // add the sprite as a child to this layer

    this->addChild(sprite, 0);

    

    

    std::string data;

    

    // 스케줄러에 Thread로 이용할 함수를 넣어준다.

    // 인자값도 편하게 넘길 수 있어 사용하기 좋다.

    auto scheduler = Director::getInstance()->getScheduler();

    scheduler->performFunctionInCocosThread(CC_CALLBACK_0(HelloWorld::JsonParsingList, this, data));

    

    

    return true;

}

 

 

void HelloWorld::menuCloseCallback(Ref* pSender)

{

    Director::getInstance()->end();

 

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

    exit(0);

#endif

}

 

void HelloWorld::JsonParsingList(std::string data)

{

    //Json Parsing 작업을 하면 됩니다.

}


주석을 달아 놓았습니다. 분석하시기 편하실 겁니다. 

Json파싱 외에도 여러 부분에 사용할 수 있는데 가장 대표적인 예가 리소스 로딩 부분일 것 같습니다.


코코스가 무료 엔진 중에 정말 잘 만들어진 것 같습니다.

코코스를 계속 사용하다보면 정말 무궁무진한 기능들이 내포 되어 있습니다.

하지만 우리는 cocos2d-x에는 엄청 많은 기능이 있는데 모르고 넘어가는 때가 많습니다.


다음 포스팅은 파일 다운로드에 대해 써볼까 합니다.

3.9버전에서 curl사용을 안하고 Downloader를 만들었더라구요 

사용해 봤는데 쉽고 좋내요 ^^

시간되는대로 올려 보겠습니다.


반응형

+ Recent posts