반응형

테트리스와 유사한 방식의 게임으로 2048 게임에서 아이디어를 얻어 만들었습니다.

같은 숫자가 가로로는 제거되고 세로로는 합쳐지는 방식 입니다.

라운드 별로 하이넘버의 제한이 있어 라운드를 올라가야 제한이 풀리며 합치기 및 제거 또한 가능해집니다.

콤보시스템을 적용하여 스릴감을 높였습니다.

 

클라이언트를 개발하였습니다.

 

- 개발 기간: Android&iOS 총 3주 

- 개발 인력: 클라이언트 1명, 기획자 1명

- 개발 사용툴

  • cocos2d-x 3.8.1

  • xcode, Android Studio

  • GameCenter, Google Play Service, Admob Ads, In-app,
  • Extension Share, Screenshot share
  • Facebook Account를 이용한 Web Server 기반 월드 랭킹

- Google Play

https://play.google.com/store/apps/details?id=com.handyapps.addone 

 

- Apple Store

https://itunes.apple.com/app/2048-add1/id1023116634

 

 

- 프로모션 동영상 

 

 

 

- 홍보 이미지

 

 

 

 

 

반응형
반응형

테트리스와 비슷한 방식의 게임이나 룰은 전혀 다릅니다.

같은 숫자의 블럭을 합치면 1 높은 숫자의 블럭으로 변합니다.

1라인을 모두 같은 숫자로 만들면 테트리스처럼 라인이 제거 됩니다.

 

클라이언트를 개발하였습니다.

 

- 개발 기간: Android&iOS 총 3주 

- 개발 인력: 클라이언트 1명, 기획자 1명

- 개발 사용툴

  • cocos2d-x 3.8.1

  • xcode, Android Studio

  • GameCenter, Google Play Service, Admob Ads, In-app,
  • Extension Share, Screenshot share
  • Facebook Account를 이용한 Web Server 기반 월드 랭킹

- Google Play

https://play.google.com/store/apps/details?id=com.handyapps.pixelmerge 

 

- Apple Store

https://itunes.apple.com/app/pixel-merge/id1044592359

 

- 프로모션 동영상 

 

 

 

 

 

- 홍보 이미지

 

 

 

 

 

반응형
반응형

윈도우에서 많이 했었던 솔리테어 게임을 모바일로 편하게 재밌게 구성해봤습니다.

크론다이크, 프리셀, 스파이더, 피라미드, 트라이픽스, 트라이웨이 총 6종류의 게임을 개발 하였습니다.

다양한 테마와 편리한 조작방식이 장점 입니다.

 

클라이언트를 개발하였습니다.

 

- 개발 기간: Android&iOS 총 12주 

- 개발 인력: 클라이언트 1명, 기획자 1명, 디자이너 1명

- 개발 사용툴

  • cocos2d-x 2.1.4로 개발되었으나 현재 3.8.1 버전으로 컨버팅하였음.

  • xcode, Android Studio

  • GameCenter, Google Play Service, Admob Ads, In-app, Facebook Share

- Google Play

https://play.google.com/store/apps/details?id=com.handyapps.solitairema

 

- Apple Store

https://itunes.apple.com/app/solitaire-ma-best-popular/id978630989 

 

- 프로모션 동영상 

 

 

 

 

- 홍보 이미지

 

 

 

 

 

 

 

반응형
반응형

신개념 블록 매치 게임으로 블록을 싸대기 때리듯 왼쪽으로 한칸씩밀어

아래 스택에 같은 블록들로 매치시켜 블럭을 제거하는 게임 입니다.

시간과 골드 아이템이 랜덤으로 나오며 시간아이템을 획득하여 플레이 시간을 늘리고

골드를 획득하여 게임 아이템을 구매합니다.

정해진 시간이 다하거나 블럭이 데드라인을 넘어가면 게임이 끝납니다.

많은 블럭을 제거하여 높은 점수를 획득하는 것이 목표 입니다.

 

클라이언트 개발을 하였습니다.

(처음으로 코코스튜디오를 활용하여 개발했습니다.)

 

- 개발 기간: Android&iOS 총 4주 

- 개발 인력: 클라이언트 1명, 기획자 1명, 디자이너 1명

- 개발 사용툴

  • cocos2d-x 3.2 엔진

  • xcode, Android Studio, cocostudio
  • GameCenter, Google Play Service, Unity Ads, Admob Ads

- Google Play

https://play.google.com/store/apps/details?id=com.handyapps.slapslap

 

- Apple Store

https://itunes.apple.com/app/slap!-slap!!/id1006531402

 

 

- 프로모션 동영상 

 

 

 

 

- 홍보 이미지

 

 

 

 

 

반응형
반응형

추억의 게임으로 치매예방에 도움이 되는 게임 입니다.

처음에 모든 카드를 5초간 카드의 앞면을 보여주고 뒷면으로 뒤집힌뒤 카드의 앞면을 기억하여

같은 숫자 1쌍을 찾는 게임 입니다.

같은 숫자 1쌍을 찾을 수록 시간이 증가하며 정해진 시간동안 많은 카드를 찾는 게임 입니다.

 

클라이언트 개발을 하였습니다.

 

- 개발 기간: Android&iOS 총 2주 

- 개발 인력: 클라이언트 1명, 기획자 1명, 디자이너 1명

- 개발 사용툴

  • cocos2d-x 2.2.1 엔진

  • xcode, eclipse
  • GameCenter, Google Play Service, Admob Ads

- Google Play

https://play.google.com/store/apps/details?id=com.funchgames.memorytraining

 

- Apple Store

https://itunes.apple.com/app/memory-training-puzzle/id925238448

 

 

- 프로모션 동영상 

 

 

 

 

 

- 홍보 이미지

 

 

 

 

 

 

반응형
반응형

힙합 느낌이 나는 남녀 캐릭터가 나와 하염없이 지하로 내려가는 게임 입니다.

장애물을 피해야며 위에서 내려오는 가시장애물에 닿으면 체력이 낮아지기 때문에 받드시 가시 장애물이

내려오기전에 피해야 합니다. 하지만 너무 서둘러 내려가다간 아래로 영원히 떨어져 한번에 죽을 수 있으니 조심해야합니다.

 

클라이언트 개발을 하였습니다.

 

- 개발 기간: Android&iOS 총 3주 

- 개발 인력: 클라이언트 1명, 기획자 1명, 디자이너 1명

- 개발 사용툴

  • cocos2d-x 2.2.1 엔진

  • xcode, eclipse
  • Admob Ads

- Google Play

https://play.google.com/store/apps/details?id=com.funchgames.tunnelfreefall

 

- Apple Store

https://itunes.apple.com/app/tunnel-free-fall/id949055842

 

 

- 프로모션 동영상 

 

 

 

- 홍보 이미지

 

 

 

 

 

 

반응형
반응형

라인 매치 게임은 기존에 뜨고 있는 2048 이라는 퍼즐게임을 보고 아이디어를 얻어 만든 게임입니다.

같은색으로 한줄을 만들면 1라인이 제거되는 게임으로 게임모드에는 무브모드와 타임모드가 있습니다.

미션을 성공할때마다 무드나 타임 카운트가 올라갑니다.

많은 점수를 얻는 것이 목표이며 게임 라운드를 클리어 할 수록 블록 개수가 많아집니다.

 

기획 및 클라이언트 개발을 하였습니다.

 

- 개발 기간: Android&iOS 총 3주 

- 개발 인력: 클라이언트 1명, 디자이너 1명

- 개발 사용툴

  • cocos2d-x 2.2.1 엔진

  • xcode, eclipse
  • GameCenter, Google Play Service, Admob Ads

- Google Play

https://play.google.com/store/apps/details?id=com.funchgames.linematch

 

 

- Apple Store

https://itunes.apple.com/app/line-match/id909201877

 

- 프로모션 동영상

 

 

 

 

- 홍보 이미지

 

 

 

 

 

반응형
반응형

귀여운 토끼가 나와서 앞으로 달려가며 좌우로 움직여 장애물을 피하고 당근을 먹어 체력을 회복하는 간단한 런 게임 입니다. 많은 거리를 달릴수록 높은 점수를 획득하는 게임입니다.

간혹나오는 무적아이템을 꼭 챙기세요!

 

클라이언트 개발을 하였습니다.

 

- 개발 기간: Android&iOS 총 4주 

- 개발 인력: 클라이언트 1명, 기획자 1명, 디자이너 1명

- 개발 사용툴

  • cocos2d-x 2.2.1 엔진

  • xcode, eclipse
  • GameCenter, Google Play Service, Admob Ads

- Google Play

https://play.google.com/store/apps/details?id=com.FunchGames.RabbitRush

 

- Apple Store

https://itunes.apple.com/app/rabbit-rush/id918347714

 

- 프로모션 동영상

 

 

 

 

- 홍보 이미지

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형

이 게임은 정말 단순한 게임으로 현재 숫자가 하이냐 로우냐를 맞추는 게임 입니다.

50%확률의 찍기 게임이며 생명5개 동안 많은 카드를 맞추는 경쟁 게임 입니다.

정말 단순한 게임으로 옛날 오락실에서 하던 햄버거하우스에 배팅하기에서 영감을 얻어 만들어 보았습니다.

 

기획 및 클라이언트 개발을 하였습니다.

 

- 개발 기간: Android&iOS 총 2주 

- 개발 인력: 클라이언트 1명, 디자이너 1명

- 개발 사용툴

  • cocos2d-x 2.2.1 엔진

  • xcode, eclipse
  • GameCenter, Google Play Service, Admob Ads

- Google Play

https://play.google.com/store/apps/details?id=com.funchgames.highlow

(한국스토어에서는 고포류로 분리되어 내렸습니다.)

 

- Apple Store

https://itunes.apple.com/app/high-low/id919803709

 

- 프로모션 동영상

 

 

 

 

- 홍보 이미지

 

 

 

 

반응형
반응형

대부분이 사람들이 윈도우에서 해본 게임이 솔리테어란 게임 중 크론다이크 일 겁니다.

이게임은 솔리테어란 게임 중 Triways 라는 새로운 장르이며 팝캡의 솔리테어 블리츠라는 게임을 보고

영감을 얻어 만든 게임 입니다.

 

게임룰은 간단하며 콤보를 적용하여 스릴감을 높였습니다.

페이스북을 연동하여 월드랭킹을 적용하고 하트 기프트 기능까지 적용하였습니다.

 

클라이언트 개발을 하였습니다.

 

- 개발 기간: 6개월(안드로이드) iOS포함 8개월

 

- 개발 인력: 클라이언트 1명, 서버개발자 1명, 디자이너 1명, 기획자 1명

 

- 개발 사용툴

  • cocos2d-x 2.1.4 엔진
  • xcode, eclipse
  • facabook sdk, in-app
  • iFunfactory Cloud Server(Json을 이용한 BigData(MongoDB) 전송 방식)

 

- Google Play

https://play.google.com/store/apps/details?id=com.stunsoft.solitairewonderland&hl=ko

 

- Apple Store

클라우드 서버 계약 문제로 3주만에 서비스 내림.

 

- 프로모션 동영상

 

 

 

- 홍보 이미지

 

 

 

 

 

반응형
반응형

얼마전 구글 코리아에 유명하신 장현세님(피처드 담당자)을 만났습니다.


여러가지 피처드에 대한 소식과 질의를 하면서 많은걸 배웠습니다. 

너무 늦은 배움에 그동안 아 그랬구나를 연발하며 ... 아쉬운 점들이 많았습니다.

저같이 늦지 마시라고 모르시는 분들에게 알려 드립니다.


다들 앱을 오픈 할 때 큰기대를 가지고 오픈 하지만 결과는 참담하죠 ...

너무나 많은 앱들 때문에 이 앱이 있는지 조차 모르고 지나가는 경우도 있고 

참 개발 잘했는데 왜 안뜰까 하는 앱도 있고 ..

사실 주관적인 생각으로  이 앱이 왜 떴나..싶은 게임도 있고 ^^


그런 생각을 하면서 하나 같이 피처드에만 올라가면 뜰꺼야 란 생각 갖고 계실 겁니다.!!

항간에 떠도는 소문엔 하루 다운로드 64이상씩 일주일 지속되면 피처드가 된다고 많이들 알고 계시는데 

이건 그냥 소문일 뿐... 


다운로드 중요하긴 하지만 평점 또한 중요하고 시기 또한 중요합니다. 

이제 필수 TIP3가지와 몇가지 부가적인 사항을 알려 드리겠습니다. 


1. 반드시 "targetSdkVersion" 은 최신으로 오픈해라!

이부분은 당연한것 같기도 하고 아닌거 같기도 하지만 구글 입장에서 보면 최신SDK를 내놓고 유저들이나 개발자들이 사용하지 않는다면 

그 버전에 대해 테스트도 안될 것이고 홍보도 안될 것 이므로 구글에서는 필수적인 요소로 내세우고 있습니다. 

현재 23(마시멜로)까지 나와 있는데 저도 사실 얼마전까지는 19버전에 항상 설정해서 오픈 했습니다. 19버전에서 항상 테스트하기 때문에 

23버전이 없는 저로썬 설정을 할수가 없었죠 이번에 23버전 지원되는 기기를 구입하고 테스트하고 변경하였습니다. 

(무조건 최신버전으로 변경만 하는 삼가하세요. 테스트 필수 입니다. 많은것들이 변경되어 있기 때문에 오류가 발생할 수 있습니다.)


2. 평점은 4.0 이상 앱만 피처드 해줄수 있다.!

이부분도 어떻게 보면 당연하다고 말할 수 있는데 구글에서 공식적으로 이 앱은 좋습니다 라고 추천을 해주는 건데 평점 2.5, 3.5 이런 앱을 추천해주는 순간 아마도 피처드의 신뢰도는 떨어질 것이고 그렇게 되면 피처드가 된다고 하더라도 유저들은 신뢰하지 않고 다운로드 하지 않을 겁니다.

구글의 당연한 선택이라고 생각 합니다. 평점 관리 잘해야 할 겁니다. ^^


3. Android Back Key 100% 활용해라 !!

안드로이드에 특징은 백키 입니다. 아이폰엔 없는 안드로이드만에 기능이죠.

그래서 안드로이드에선 이부분을 강조하는 것 같습니다.  모든 부분에 백키를 적용해야한다고 들었습니다.

메인화면에선 백키시 종료가 되어야하고 (팝업창을 띄우거나 토스트로 한번더 누르면 종료됩니다 라는 문구를 띄워야함)

설정팝업이 떠있는 상태에서 백키누르면 다시 메인화면 가야하고 이러한 모든 부분의 백키를 적용해 줘야 합니다.

피처드 검수시 하나라도 빠져있으면 안된다고 합니다. (대기업 피처드 해주는데 이것이 빠져있어 요청을 했고 앱이 워낙 거대해 백키 넣는대만 2달 걸렸답니다. ㅋ)

사소한 부분이라고 넘기지 말고 꼭 적용 합시다. 

한가지 예외가 있다면 무조건 앞으로만 가야 하는 스탭 (예를 들어 How To Play와 같은 부분에선 빼도 된다고 하내요 )에선 빠져도 됩니다.



위 3가지는 피처드 되는 것에 필수 사항이라고 합니다. 

검수시 하나라도 어겨 있으면 피처드에선 제외 된다고 하내요 ^^


그리고 그외에 몇가지더 말씀 드리면 

crush 현상 발생하지않아야 한다고 합니다. 모든 디바이스에 대해 다 테스트를 해볼 순 없죠

단 1건도 일어나지 않는다는건 .. 개발이 잘됐다기보다 다운로드가 없거나 앱 실행유저가 없는것으로 판단 됩니다.

많은 디바이스에서 다운로드 받게 하려고 모든 버전을 허용하기 보다 최대한 테스트 해보고 그에 맞는 min버전을 선택하는 것이 중요하다고 생각 됩니다. 저도 얼마전 facebook 4.x sdk를 적용해 놓고 2.3.3까지 지원된다고 했는데 마구잡이로 crush발생.. facebook4.x sdk가 문제 ...

API레벨 11로 올려 해결 했내요 ^^


그리고 또한가지는 어마어마하게 많은 양의 피처드 요청이 들어 온다고 합니다. 

그 외에도 앱 들이 하루에도 수십개씩 올라오기 때문에 구글코리아에서 모든 앱을 검수 할 수가 없다고 합니다. (장현세님 포함 3명이라는데....)

구글 코리아 피처드 팀도 못보고 지나치는 경우가 많다고 합니다.

자신의 앱이 위사항을 모두 지켰고 정말 재밌다고 생각 한다면 장현세님께 메일 보내세요 .

바로바로 회신은 못주지만 3일안에는 회신할 수 있도록 노력하신다고 합니다.!! (킹왕짱!!)


그 외에도 당연히 구글에서 지키라는 기본적인 가이드라인은 필수로 지키고 있어야 합니다. 

가이드라인은 구글에 잘 정리되어 있으니 한번 보시면 좋을 것 같습니다.


저도 내 앱이 왜 피처드 안가지... 일주일에 1000다운로드가 넘는데... 왜 !!!!

라고만 생각 하다고 장현세 님의 얘기를 들어보니 안될만 했습니다. 


앞으로 출시 준비하시는 분들 참고하시라고 몇자 적어 보았습니다.

반응형
반응형

현재 JDK는 1.8 버전까지 나와 있습니다.

모든 SDK나 API들이 자신들의 버그를 숨기기 위해서인지 ^^ 최신 버전이 나오면 하위 버전을 다운로드하기 어렵게 만들어 놨습니다.


대신 호환이 안되는 SDK같은 경우에는 어쩔 수 없이 하위 버전도 공개해놓고 있습니다.

예를들어 cocos2d와 같이 3.x와 2.x가 호환이 되지 않기 때문에 

(실제로 2.x에서 3.x로 컨버팅 작업을 해봤는데 약 일주일 이란 시간이 걸렸습니다. 에러는 모두 해결 했지만 

워닝은 그냥 두는 정도 였는데도 말이죠) 2가지 버전 모두 다운로드 할 수 있게 해놓고 있죠.


JDK같은 경우 1.8 버전을 써도 상관 없지만 저와 같은 상황이 있을 수 있습니다.

다른 SDK를 사용하는데 1.8버전에서 컴파일 시 에러가 납니다. 그 SDK는 이제 업데이트도 되지 않고 개발자도 더이상 개발을 진행하지 않는다고 

합니다.


이럴때 어쩔 수 없이 SDK를 변경하지 않는 이상 JDK1.6버전을 사용하여 컴파일 하는 방법뿐이였습니다.

그러나 오라클 사이트에서 1.6찾아봐야 나오지 않습니다. 찾기 힘들 더라구요.


그래서 혹시 저같은 분들 계실 까봐 다운로드 URL 공유합니다.



위에 Url로 들어 가시면 아래와 같이  JDK목록이 나옵니다.



JDK1.6버전을 설치 시 Java SE 6 선택하시면 됩니다.

선택 후 화면에서 Mac OS를 찾으면 없을 겁니다. 그렇다고 설치가 안되는건 아니니 안심하세요 ^^

1.6 버전 때는 dmg 파일 지원을 안해서 그렇지만 1.8 버전에는 dmg 파일 지원을 하기 때문에 설치가 편합니다.


아래와 같은 목록이 나옵니다.



Mac OS는 대부분이 64비트이기 때문에 "Linux x64" 를 다운받으시면 됩니다.

OS X 역시 리눅스 기반으로 만들어진 Centos라는 OS 이기때문입니다.


혹시 Mac OS의 버전이 궁금하신 분들은 

터미널에서 아래 명령어를 실행해보세요.

명령어: sysctl hw | grep 64bit"


아래와 같이  hw.cpu64bit_capable: 1 이 나오면 64bit 입니다.



bin파일은 터미널에서 실행해야 압축이 풀립니다.

터미널로 이동하셔서 아래 명령어를 실행하세요


Kyung-Min-ui-MacBook-Pro:Downloads rudalstb$ chmod 777 jdk-6u45-linux-x64.bin 

Kyung-Min-ui-MacBook-Pro:Downloads rudalstb$ ./jdk-6u45-linux-x64.bin 


설치 보다는 그냥 압축을 풀어 사용하는 방식이며 

압축이 풀린 후 그냥 사용하셔도 됩니다. 


반응형
반응형

게임 개발시 1개의 이미지 파일을 여러번 사용해야 하는 일이 종종 발생합니다.

예를들어 상점 같은 팝업에 아이템 배경이라던가 또는 버튼의 배경이미지 같은 경우

동일한 이미지를 사용하는데 여러번 파일을 로드해야 합니다.



1) 이미지 파일 로드하여 사용

기본적으로 아래와 같은 방식으로 사용하죠.

1
2
    auto sprite1 = Sprite::create("btn_bg.png");
    this->addChild(sprite1);
cs

위와같이 사용할 경우 여러번 호출 시 파일 입출력이 많이 일어나게 되어 속도영향을 줄 수 있습니다.


2) 이미지 파일 메모리에 로드하여 사용

파일I/O를 줄이기 위해 많이 사용되는 파일들은 아래와 같이 메모리에 로드하여 사용 합니다.

1
2
3
    SpriteFrameCache::getInstance()->addSpriteFrame(Sprite::create("btn_bg.png")->getDisplayFrame(), "btn_bg");
    auto sprite1 = Sprite::createWithSpriteFrameName("btn_bg");
    this->addChild(sprite1);
cs

가장 좋은 방법이긴 하지만 메모리에 이미지를 로드하기 때문에 많은 파일을 로드시 메모리가 많이 늘어 납니다.


그래서  사용이 끝나고 나면 아래와 같이 제거해 주는것이 좋습니다.

1
SpriteFrameCache::getInstance()->removeSpriteFrameByName("btn_bg");
cs

하지만 간혹 빼먹을 수도 있고 귀찮아서 하지 않는 경우도 있습니다.( 머 요즘 하드웨어 성능이 좋으니..허허..)


[ 여기서 잠깐 ]

잠시 안드로이드 앱 마켓 시장에 대해 얘기해보겠습니다. (주관적인 제생각으로)  

안드로이드 시장이 급격하게 변화되고 있습니다.

안드로이드 버전이 벌써 API 23(마시멜로 6.0)까지 출시가 되었습니다.

그러나 구글 통계에 따르면 안드로이드 API레벨 9 ~ 11 (버전 2.3 ~ 3.0)를 사용하는 사용자가 아직도

게임 전체에서 16%나 사용한다는 점입니다.

(4.x 버전사용자가 50%이상으로 가장 많다고 합니다.)


Facebook SDK 4.x 버전을 사용하려면 안드로이드 API 11 이상 필요합니다. (API 10이하는 Crash 발생)

많은 분들이 높은 Facebook SDK버전을 사용하기 위해 안드로이드 2.x 를 버려야 하나 생각하지만... 

결국 페북 3.x버전을 사용 중이 더군요.


그만큼 2.x수요가 높다는걸 알 수 있습니다.

2.x 버전을 사용하는 스마트폰의 성능은 갤럭시2 ~ 갤럭시노트1 정도 수준이하라는 점이죠.

모바일 게임에서 최적화 작업이 리소스를 줄여 50M이하로 용량을 줄이는 작업도 있지만 

속도 개선 및 메모리 관리도 아직은 중요한 것 같습니다. 

[ /여기서 잠깐 ]


3) 이미지파일 로드 한번으로 복사하여 사용하기

파일로드 한번으로 여러개를 복제하여 사용할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    auto sprite1 = Sprite::create("btn_bg.png");
    this->addChild(sprite1);
    
    auto sprite2 = Sprite::createWithSpriteFrame(sprite1->getSpriteFrame());
    this->addChild(sprite2);
 
    auto sprite3 = Sprite::createWithSpriteFrame(sprite1->getSpriteFrame());
    this->addChild(sprite3);
    
    Sprite* sprite[10];
    for (int i = 0; i < 10++i) {
        sprite[i] = Sprite::createWithSpriteFrame(sprite1->getSpriteFrame());
        this->addChild(sprite[i]);
    }
 
    // 원본제거
    sprite1->removeFromParent();
cs

Frame을 복사했기 때문에 sprite1이 소멸되어도 나머지 sprite는 영향을 받지 않습니다.

그리고 가장 편한 점은 모든 Node들은 autorelease() 되기 때문에 추가로 Frame을 제거해야 하는 일도 없습니다.



단 1회 사용하는 이미지는 1번사용해도 무관합니다.

계속 메모리에 상주하며 사용해야 하는 이미지들은 2번째 방법을 사용하면되고

팝업이나 특정부분에서만 사용하는 이미지들은 3번째 방법을 사용하면 좋을 것 같습니다.




반응형
반응형

게임 개발을 하다보면 ScrollView, ListView, TableView는 거의 필수로 들어 갑니다.

cocos2d-x 2.x 부터 ScrollView에 Menu를 붙여 사용할 때  Menu부분을 터치하여 스크롤 하면

스크롤이 안먹는 문제? 가 있었습니다.


3.9버전까지 오면서 수정 안되는걸 보면 cocos애들은 그방법이 더 옳다고 생각하는것 같내요.

현재 나온 ui::Widget에 있는 Button과 ScrollView를 사용하면 정상동작하고 보너스로 스크롤바 까지 보여줍니다.


2.x 버전을 사용하는 분들이나 3.x버전을 사용하고 있지만 기존에 ScrollView를 사용하시는 분들을 위해

Menu 부분을 터치하고 스크롤하여도 스크롤이 동작하는 소스를 공유합니다.


저는 이번 새로운 프로젝트에서 ui::Widget으로 갈아 탔지만 이전 프로젝트까지 잘 사용했던 소스 입니다.


ScrollView를 상속받아 새로 만드시는 분들도 계신데 그 방법보다 Menu를 상속받아 새로 만드는 방법이 간단해서

이 방법으로 소개 합니다.


- cocos2d-x 3.x 버전에서 사용 가능한 소스 입니다. (2.x 버전은 시간나는대로 올리겠습니다.)


[ ScrollMenu.h ]

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
33
34
35
36
37
38
39
//  cocos2d-x 3.x 버전에서 사용 가능 합니다.
 
//  ScrollMenu.h
//  Solitaire
//
//  Created by Kyung-Min Park on 2015. 4. 6..
 
#ifndef __ScrollMenu__
#define __ScrollMenu__
 
#include <stdio.h>
#include <cocos2d.h>
 
using namespace cocos2d;
 
class ScrollMenu:public Menu
{
public:
    virtual bool onTouchBegan(Touch* touch, Event* event);
    virtual void onTouchEnded(Touch* touch, Event* event);
    virtual void onTouchMoved(Touch* touch, Event* event);
    
    static ScrollMenu* createWithArray(const Vector<MenuItem*>& arrayOfItems);
    static ScrollMenu* createWithItem(MenuItem* item);
    static ScrollMenu* createWithItems(MenuItem *firstItem, va_list args);
    static ScrollMenu* create(MenuItem* item, ...);
 
    bool init();
    bool initWithArray(const Vector<MenuItem*>& arrayOfItems);
    
private:
    bool isTouching;
 
    Vec2 m_touchesStart;
    Vec2 m_touchesEnd;
};
 
#endif /* defined(__ScrollMenu__) */
 
cs



[ ScrollMenu.cpp ]

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//  cocos2d-x 3.x 버전에서 사용 가능 합니다.
 
//  ScrollMenu.cpp
//  Solitaire
//
//  Created by Kyung-Min Park on 2015. 4. 6..
 
#include "ScrollMenu.h"
 
bool ScrollMenu::init()
{
    return initWithArray(Vector<MenuItem*>());
}
 
bool ScrollMenu::initWithArray( const Vector<MenuItem*>& arrayOfItems )
{
    if (Layer::init()) {
        _enabled = true;
 
        Size sizeVisible = Director::getInstance()->getWinSize();
        
        this->ignoreAnchorPointForPosition(true);
        setAnchorPoint(Vec2(0.5f, 0.5f));
        this->setContentSize(sizeVisible);
        
        setPosition(Vec2(sizeVisible.width/2, sizeVisible.height/2));
        
        int count = 0;
        
        for (auto& item : arrayOfItems) {
            this->addChild(item, count);
            count++;
        }
        
        _selectedItem = nullptr;
        _state = Menu::State::WAITING;
        
        setCascadeColorEnabled(true);
        setCascadeOpacityEnabled(true);
        
        auto touchListener = EventListenerTouchOneByOne::create();
        touchListener->setSwallowTouches(false);
        touchListener->onTouchBegan = CC_CALLBACK_2(ScrollMenu::onTouchBegan, this);
        touchListener->onTouchMoved = CC_CALLBACK_2(ScrollMenu::onTouchMoved, this);
        touchListener->onTouchEnded = CC_CALLBACK_2(ScrollMenu::onTouchEnded, this);
        touchListener->onTouchCancelled = CC_CALLBACK_2(ScrollMenu::onTouchCancelled, this);
        _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);
        
        return true;
    }
    return false;
}
 
ScrollMenu* ScrollMenu::createWithArray( const Vector<MenuItem*>& arrayOfItems )
{
    auto ret = new ScrollMenu();
    if (ret && ret->initWithArray(arrayOfItems)) {
        ret->autorelease();
    }
    else {
        CC_SAFE_DELETE(ret);
    }
    return ret;
}
 
ScrollMenu* ScrollMenu::createWithItem( MenuItem* item )
{
    return ScrollMenu::create(item, nullptr);
}
 
ScrollMenu* ScrollMenu::createWithItems( MenuItem *item, va_list args )
{
    Vector<MenuItem*> items;
    if( item ) {
        items.pushBack(item);
        MenuItem *= va_arg(args, MenuItem*);
        while(i) {
            items.pushBack(i);
            i = va_arg(args, MenuItem*);
        }
    }
    return ScrollMenu::createWithArray(items);
}
 
ScrollMenu* ScrollMenu::create( MenuItem* item, ... )
{
    va_list args;
    va_start(args,item);
    
    ScrollMenu *ret = ScrollMenu::createWithItems(item, args);
    
    va_end(args);
    
    return ret;
}
 
bool ScrollMenu::onTouchBegan(Touch* touch, Event* event)
{
    m_touchesStart = touch->getStartLocation();
    
    return Menu::onTouchBegan(touch, event);
    
}
 
void ScrollMenu::onTouchMoved(Touch* touch, Event* event)
{
    Menu::onTouchMoved(touch, event);
    
}
 
void ScrollMenu::onTouchEnded(Touch* touch, Event *event)
{
    // move은 가로 or 세로로 얼마만큼 Move되었나를 체크하여 그 이상이면 버튼 동작을 해지 합니다.
    // 값이 낮을수록 민감하게 반응하지만 너무 낮으면 버튼 터치가 힘들 수 있습니다.
    float move = 30.f;
    
    m_touchesEnd = touch->getLocation();
    Vec2 difference = m_touchesEnd - m_touchesStart;
    
    if (difference.x > move || difference.y > move ) {
        Menu::onTouchCancelled(touch, event);
    }
    else if (difference.x < -move || difference.y < -move) {
        Menu::onTouchCancelled(touch, event);
    }
    else {
        Menu::onTouchEnded(touch, event);
    }
}
 
 
cs

다른 부분은 수정할 부분이 없는데 float move = 30.f 이부분만 필요에 따라 수정하시면 됩니다.

값을 수정해 가며 스타일에 따라 테스트 해보시면 편합니다.



[ 사용 예제 ]

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
33
34
bool HelloWorld::init()
{
    if ( !Layer::init() ) return false;
    
    Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();
 
    // ScrollView 생성
    ScrollView* scrollView = ScrollView::create(Size(visibleSize.width, visibleSize.height));
    scrollView->setDirection(ScrollView::Direction::HORIZONTAL);
    scrollView->setContentOffset(Vec2(00));
    scrollView->setContentOffsetInDuration(Vec2(00), 10.f);
    scrollView->setPosition(visibleSize * 0.5f);
    this->addChild(scrollView);
 
    // Menu 생성
    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));
 
    //auto menu = Menu::create(closeItem, NULL);
    // 기존에 Menu를 ScrollMenu로 변경만 하면 됩니다.
    auto menu = ScrollMenu::create(closeItem, NULL);
    menu->setPosition(Vec2::ZERO);
    this->addChild(menu, 1);
    
    // ScrollView에 버튼 붙이기
    scrollView->addChild(menu);
 
    return true;
}
cs

ListView, TableView에서도 사용 가능 합니다.


문제있으면 알려주세요 ^^

2.x 버전도 곧 올리겠습니다.


(추가적으로 ui::Widget에 있는 ScrollView와 Button을 이용한 방법도 올리겠습니다.)

반응형
반응형
이미 모두 알고 계시거나 간단한 건데 어떤분이 질문을 해서 글 남깁니다.

ScaleTo Action class 를 가지고 액션처리를 하는데 
ScaleXTo 나 ScaleYTo class 는 왜 없냐 라고 질문을 주셨습니다.

그런 class는 없지만 똑같은 기능을 하는 함수는 있습니다.

액션을 생성할 때 여러가지 방법이 있습니다.
방법은 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
    // 동시에 X 와 Y 를 변경하는 생성 방법.
    auto actionScale = ScaleTo::create(1.0f, 2.0f);
    
    // X 만 변경하는 생성 방법
    auto actionScaleX = ScaleTo::create(1.0f, 2.0f, 1.0f);
    
    // Y 만 변경하는 생성 방법
    auto actionScaleY = ScaleTo::create(1.0f, 1.0f, 2.0f);
    
    // X 가 먼저 변하고 Y 가 변경되는 방법
    auto actionSequence = Sequence::create(actionScaleX,
                                           actionScaleY,
                                           NULL);
 
cs


ScaleTo를 생성할 때 X 값과 Y 값을 따로 지정이 가능 합니다.

Z 값도 변경 가능한데 아직 써보지는 못했내요 ^^

cocos2d-x가 찾아보면 편리한 기능이 엄청 많은 것 같습니다.
한번쯤 엔진 소스를 구경해 보는 것도 개발에 많은 도움이 됩니다.

 


반응형
반응형

Label을 쓰다보면 같은 크기내에 텍스트를 더 많이 노출 시켜야 할 때도 있습니다.

Label의 크기를 지정하면 자동 줄바꿈이 되기도 하지만 게임에서 일정 부분에만 노출되어야 하는 텍스트들도 존재합니다.

그래서 Label의 폰트 크기를 50으로 사용했다가 텍스트가 Label의 크기를 넘어갈 때는 폰트 사이즈를 40으로 변경해야 합니다.


Label안에 당연히 setFontSize 같은 함수가 있을 줄 알았는데...

아무리 찾아봐도 안보이내요. ㅠ_ㅠ


cocos2d-x 2.x 버전에서는 setFontSize(float size) 함수가 있어서 편했는데 

cocos2d-x 3.x 와서 없어진듯 ㅠㅠ


조금은 불편하지만 방법은 있습니다.


<Label 폰트 사이즈 변경 방법>

1
2
3
4
5
6
7
8
9
10
11
12
// 폰트 크기 48 Label 생성.    
auto label = Label::createWithTTF("Test Font Size""NanumGothic.ttf"48);     
   
// TTF폰트 정보 가져오기.    
TTFConfig config = m_labelNumber->getTTFConfig();   
     
// 원하는 폰트 사이즈로 변경.    
config.fontSize = 38;       
 
// 변경한 폰트 정보를 다시 입력.    
label->setTTFConfig(config);
 



cs


폰트 크기를 정해놓고 줄이는 방법도 있지만

크기에 맞게 폰트사이즈를 조절 할 수 있다면 얼마나 좋을까요?

아직 cocos2d-x에는 기능이 없는것 같습니다.

없으면 만들면 돼죠^^;;


그래서 간단하게 자동 폰트 사이즈  변경하는 방법을 만들어 봤습니다.

그렇게 효율적인 방법은 아니지만 간단하게 사용 가능 합니다.

(더 효율적인 방법이 있으면 알려주세요 ㅠ_ㅠ)


<Label 폰트 사이즈 자동 조절>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
    // label을 생성.
    auto label = Label::createWithTTF("Test Font Size""NanumGothic.ttf"48);
 
    // TTF폰트 정보 가져오기.
    TTFConfig config = m_labelNumber->getTTFConfig();
 
    // label의 Width가 96보다 작을 때까지 반복.
    while (label->getContentSize().width > 96.f)
    {
        // 현재 label의 크기가 96보다 크다면 폰트사이즈를 1 줄인다.
        config.fontSize = --config.fontSize;
        
        // 폰트 사이즈가 1보다 작으면 끝냄.
        if (config.fontSize < 1break;
        
        // 폰트 사이즈를 줄이고 TTF설정을 저장.
        label->setTTFConfig(config);
    }
cs



위 처럼 해주면 label의 Width 크기가 96보다 작을 때까지 폰트사이즈를 줄입니다.

너무 많은 텍스트를 넣으면 1보다 작아져 안되겠지만...


숫자 2~4자리 정도 가변적으로 폰트사이즈를 조절해야할 경우 유용하게 사용할 수 있습니다.




반응형
반응형

항상 최신 버전을 사용하고 싶은 욕심에 3.6버전에서 3.8.1을 파일을 cocos2d 폴더만 복사하여 덮어 씌우기를 했다.

기분 좋게 컴파일을 했는데 아래와 같은 에러가 발생했다.

Undefined symbols for architecture x86_64:

“_iconv“, referenced from:

cocos2d::FontAtlas::conversionU16TOGB2312(std::__1::basic_string<char16_t, std::__1::char_traits, std::__1::allocator > const&, std::__1::unordered_map, std::__1::equal_to, std::__1::allocator<std::__1::pair > >&) in libcocos2d iOS.a(CCFontAtlas.o)

“_iconv_close“, referenced from:

cocos2d::FontAtlas::~FontAtlas() in libcocos2d iOS.a(CCFontAtlas.o)

“_iconv_open“, referenced from:

cocos2d::FontAtlas::conversionU16TOGB2312(std::__1::basic_string<char16_t, std::__1::char_traits, std::__1::allocator > const&, std::__1::unordered_map, std::__1::equal_to, std::__1::allocator<std::__1::pair > >&) in libcocos2d iOS.a(CCFontAtlas.o)

ld: symbol(s) not found for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)


원인은 FontAtlas에서 libiconv.dlib를 사용해서 문제였다.

3.6에서는 사용하지 않았는데 어떤 이유인지는 모르지만 3.8.1부터는 libiconv.dlib를 사용하기 때문에 라이브러리에 추가를 해줘야 한다.


[방법] 

프로젝트 → 「General」→ 「Linked Frameworks and Libraries "에"libiconv.dlib "을 추가 또는 "libiconv.tbd"를 추가하면 문제 해결





처음부터 3.8.1올 프로젝트를 생성하거나 라이브러리가 이미 추가되어 있으면 문제 없겠지만 

cocos2d폴더만 덮어 씌우기를 했기때문에 발생한 문제이다.



반응형
반응형

프로젝트를 새로 생성하자마자 컴파일을 하면 아래와 같은 에러가 발생한다.


ld: in /Users/rudalstb/Library/Developer/Xcode/DerivedData/TestGame-hfnevdaxcjkgjodopextjiscsyhu/Build/Products/Debug-iphonesimulator/libcocos2d iOS.a(ftbase.ios8_x86_64.o), building for iOS simulator, but linking in object file built for OSX, for architecture x86_64


clang: error: linker command failed with exit code 1 (use -v to see invocation)


아무것도 안했는데 에러 발생!


cocos2d-x 포럼에서 뒤져 보니깐 3.8 버전에서 문제가 있는 것 같다.


참고: http://discuss.cocos2d-x.org/t/cocos2d-x-v3-8-rc0-ios-simulator-linking-error/23635


간단하게 수정 가능하다.


"프로젝트"/cocos2d/external/freetype2/prebuilt/ios/libfreetype.a"

위 폴더로 이동하여 libfreetype.a 파일을 cocos2d-x 3.7 버전에 파일로 교체해주면 완료.


위와 같이 수정시 매번 프로젝트 생성시마다 교체해줘야 하므로 아예 cocos2-x 원본 파일을 교체해주면 

한번 교체로 쭈~~~~~~~욱 쓸수 있다.


cocos2d-x 3.9 버전이 곧 출시되니 지금은 불편하더라도 참자!


[ 2015-11-3 추가 내용 ]

cocos2d-x 3.8.1 버전이 나왔내요~ 

이버전에서는 문제가 해결되었습니다. 3.9 나오기전까지 3.8.1 쓰면될 듯 합니다.

반응형
반응형

cocos2d-x에서 android를 컴파일 하다 보면 아래와 같은 에러가 날 때가 있다.

*** non-numeric second argument to `wordlist' function: '9 19'.  Stop.


아래 파일을 확인해보자.

proj.android/jni/Application.mk


APP_PLATFORM을 살펴보자.

APP_PLATFORM += android-9 android-19


위와 같이 되어 있다면 수정해주자.

APP_PLATFORM += android-19


다시 컴파일 하면 정상적으로 된다.


Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 9 in ./AndroidManifest.xml    

라는 경고가 뜨긴 하는데 신경쓸 필요 없다.








반응형
반응형

iOS 모바일 게임에 Admob을 붙여 출시 준비중 이였는데

iOS 9 로 업그레이드 되면서 콘솔에 신경쓰이게 하는 로그가 있었다.


바로 이놈 이었다.

-canOpenURL: failed for URL: "kindle://home" - error: "(null)"


계속 로그에 찍히는데 어디서 나는 오류 인지 알 수가 없었다.


구글신에게 여쭤 보았으나...

해답은 보이지 않았고 이것 저것 다해 보았으나 해결 되지 않았다.

<key>LSApplicationQueriesSchemes</key>

<array>

<string>kindle</string>

<string>kindle://home</string>

</array>

info.plist에 Schemes도 추가해 보았다.

그래도 안된다.


<key>NSAppTransportSecurity</key>

<dict>

<key>NSAllowsArbitraryLoads</key>

<true/>

</dict>

사용하는 SDK에서 요구하는 데로 위와 같이도 해보았는데 해결이 안되었다.


결국 로그를 하나씩 심어 가며 체크 한 결과 

원인은 Admob !


iOS SDK 7.4.1을 사용중 이었는데 

iOS SDK 7.5.1로 변경하니 바로 오류 수정...아 하루동안 얼마나 삽질 했는데 해결은 1분만에...ㅎㅎ


원인은 아래와 같은 이유 였다.


iOS 9 부터 UIApplication에 canOpenURL을 제한 하는 것 같다. Schemes에 등록도 해야하고 복잡해 진것 같고

openURL 사용을 권장하는 것 같다. 


자세한 내용은 모르지만 하루종일 삽질한 시간이 아까워 남겨본다.


iOS에서 사용하는 모든 SDK는 업그레이드 하시길 바랍니다.


감사합니다.




반응형

+ Recent posts