레이블이 Cocos2d-x인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Cocos2d-x인 게시물을 표시합니다. 모든 게시물 표시

2017년 2월 12일 일요일

Cocos2d-x 설치 및 프로젝트 생성

Cocos2d-x 설치 및 프로젝트 생성
2016년 12월 6일 화요일
기존의 글이 링크가 제대로 되지 않아 중복하여 업로드 합니다.
Cocos2d-x는 멀티 플랫폼을 지원하는 2D 게임 프레임워크이다.
장점 :
API를 배우고 사용하기 쉽고 간단하다.
작은 용량으로 게임 개발에 필요한 거의 모든 기능을 제공한다.
오픈소스 프로젝트이므로 무료로 사용할 수 있다.
OpenGL ES 1.1/2.0에 최적화되어 있다.
멀티 플랫폼을 지원한다.
개발 최소 사양 : Windows의 경우 7+, VS 2012+


Cocos2d-x 설치
다운로드 : http://www.cocos2d-x.org/
최신버전 3.13.1을 사용함.
코코스 2d-x는 별도의 설치과정이 없으며 압축을 푸는 것으로 설치는 끝난다.
c://cocos2d-x-3.13.1에 압축을 풀었다. 
Python 설치
프로젝트를 생성하기 전에 추가적으로 해야 할 작업이 하나 있다.
프로젝트를 만들 때 필요한 파일인 cocos.py를 실행하기 위해서는 '파이썬'이 필요하다.
맥 PC의 경우 기본적으로 설치되어 있다고 한다. 하지만 윈도우 사용자의 경우 별도로
설치를 해주여야 한다.
다운로드 : https://www.python.org/
설치 후 Path의 환경변수에 파이썬이 설치된 경로를 추가한다.
설치 경로인 c://Python27을 추가하였다.
프로젝트 생성
C:\cocos2d...\tools\cocos2d-console\bin (cocos.py 파일이 있는 경로)로
이동 후 명령프롬프트를 연다.
"C:\cocos2d-x-3.13.1\tools\cocos2d-console\bin>cocos new HelloHyun -p com.sample.project -l cpp -d c:/cocos2d-x-3.13.1/projects"
를 입력하여 프로젝트를 생성한다.
cocos new [프로젝트 이름] -p [패키지명] -l [개발할 언어] -d [프로젝트 만들 경로]
지정한 폴더로 이동을 하면 프로젝트 이름으로 입력한 폴더가 생성된 것을 볼 수 있다.
폴더의 내부는 이렇다.
2016-12-06  오후 10:07    <DIR>          .
2016-12-06  오후 10:07    <DIR>          ..
2016-12-06  오후 10:07                75 .cocos-project.json
2016-12-11  오후 10:55    <DIR>          Classes // Cocos2d-x로 구현한 게임 소스가 위치한 폴더
2016-12-06  오후 10:07             5,503 CMakeLists.txt
2016-12-06  오후 10:07    <DIR>          cocos2d // Cocos2d-x 라이브러리 소스가 위치한 폴더
2016-12-06  오후 10:05    <DIR>          proj.android
2016-12-06  오후 10:05    <DIR>          proj.android-studio
2016-12-06  오후 10:07    <DIR>          proj.ios_mac
2016-12-06  오후 10:05    <DIR>          proj.linux
2016-12-06  오후 10:05    <DIR>          proj.tizen
2016-12-06  오후 10:11    <DIR>          proj.win10 // 윈도우10의 경우 사용하는 것이라고 적혀 있지만. 빌드가 되지 않는다.
2016-12-29  오후 09:23    <DIR>          proj.win32 // 윈도우 프로젝트 파일이 위치한 폴더
2016-12-06  오후 10:07    <DIR>          proj.win8.1-universal
2016-12-06  오후 10:05    <DIR>          Resources // 리소스 파일이 위치한 폴더
               2개 파일               5,578 바이트
              13개 디렉터리  854,379,499,520 바이트 남음
Win32폴더의 생성된 프로젝트를 빌드 후 실행하면 오른쪽과 같은 화면을 볼 수 있다.


Cocos2d-x 안드로이드 포팅 (apk 만들기)

1. JDK 설치


오라클 홈페이지에서 JDK를 받아서 설치한다.
자신의 OS에 맞는 버전을 다운로드 받은 후 설치를 한다. Windows x64를 선택했다.
 

환경변수 설정
 사용자 변수에 [새로만들기] 클릭하여 JAVA_HOME 의 값을 JDK설치 경로(C:\Program Files\Java\jdk1.8.0_121)로 넣어준다.


밑의 시스템 변수에서 Path를 찾아 편집을 한다. 변수 값 뒤에 C:\Program Files\Java\jdk1.8.0_121\bin; 를 넣어준다.

그리고 시스템 변수에서 [새로만들기]를 클릭하여 시스템 변수를 하나 더 정의한다.
변수 이름 : CLASSPATH
변수 값 : .;%JAVA_HOME%\lib\tools.jar



2. NDK 설치

안드로이드 개발자 홈페이지에서 NDK를 다운로드 받아 압축을 풀기만 하면 된다.

파일을 실행하면 압축이 풀리며 적당한 위치로 옮겨 놓는다.
C:\android-ndk 에 두었다.


3. 안드로이드 SDK  & 안드로이드 스튜디오 설치

안드로이드 스튜디오와 같이 있는 것이 편할것 같아 SDK 포함버전으로 다운받았다.

아래쪽에 SDK만 따로 받을수도 있는 것 같다.



기본값으로 인스톨 중..


안드로이드 스튜디오에서 SDK를 다운받는다. 혹은 C:\Users\admin\AppData\Local\Android\sdk\SDK Manager.exe를 실행시켜도 가능하다.
기본 SDK 경로는 : C:\Users\admin\AppData\Local\Android\sdk



4. ANT 설치

안드로이드 SDK 컴파일과 NDK 컴파일을 한번에 하기 위해서 3.0 버전부터는 ANT를 추가로 설치해야 한다.

압축을 풀고 c:/apache-ant 에 두었다.


5. Cocos2d-x NDK, SDK, ANT 경로 설정



ANT의 경우 bin 폴더까지의 경로를 입력해야 한다.

다시 명령어를 입력하면 셋팅 결과를 확인 할 수 있다.



6. 안드로이드 컴파일

proj.android 이동 후 cocos compile -p android --android-studio 명령어를 입력하여 컴파일을 실행한다.

변경된 파일이 있다면
\proj.android\jni\Android.mk
\proj.android-studio\app\jni\Android.mk
를 수정하여 준다. 경로가 조금 다르므로 주의해서 넣어준다.
mk 파일 수정할때 오류가 발생하므로 띄어쓰기와 tab 에 주의한다.

컴퍼일러가 다르기 때문에 Visual Studio 에서 문제 없던 소스코드에서 오류가 발생할 수 있다.
메시지를 읽고 수정해주면 된다.

빌드툴의 22.0.1 버전이 없다는 메시지가 뜨므로..  SDK 메니저를 통하여 해당 버전의 빌드 툴을 다운받았다.


빌드 성공.







예전 방법 참고..

코코스2d-x 환경설정

코코스2d의 메인폴더에 setup.py파일을 실행하여 환경을 설정한다.
명령 프롬프트를 실행 후 코코스 2d-x 메인 폴더에서 다음과 같이 입력한다. python setup.py
setup이 실행되면 먼저 코코스 콘솔 루트의 경로가 추가되며
NDK의 경로와 안드로이드 SDK 경로를 입력할 때는 adt 폴더 하위에 있는 sdk 폴더까지 입력해야 하며
ANT의 경로를 입력할 떄도 apache-ant 폴더 하위에 있는 bin 폴더를 입력해야 한다.

모든 입력이 완료되면 pc를 재부팅하여 환경설정을 적용한다.

안드로이드 컴파일을 위해서 먼저 새로운 프로젝트를 만든다.
코코스2d-x 환경 설정으로 코코스 콘솔 루트 경로가 추가되었으므로 프로젝트를 만드록 싶은 경로에서 바로 cocos 배치 파일을 실행하면 된다.
이렇게 새로운 프로젝트를 생성한 후 명령 프롬프트를 실행하고 하위폴더인 proj.android로 이동한다.
이동한 후 다음과 같이 입력하여 안드로이드 컴파일을 실행한다.
cocos compile test -p android
컴파일 할 때도 프로젝트 만들때 사용하였던 cocos 배치파일을 사용하며 컴파일을 위하여 compile라고 입력 후 프로젝트 이름을 입력하고 -p 설정으로 플랫폼 종류를 입력한다.
컴파일이 성공하면 bin 폴더에 apk가 생성 된다.

안드로이드 컴파일 설정
test/proj.android/jni/Android.mk 파일을 보면
LOCAL_SRC_FILES
LOCAL_C_INCLUDES
항목에 cpp와 h파일을 각각 추가해아 한다. 
네트워크나 extensions 라이브러리를 사용한 경우 Library와 Call 부분도 수정을 해줘야한다. 사용하지 않는 box2d_static 같은 라이브러리는 삭제해도 된다.

안드리오드의 경우 시뮬레이터로 실행을 하면 시간도 오래걸리고 불편하기 때문에 일반적으로 단말기로 실행을 많이 한다고한다.
그러기 위해서는 단말기 드라이버가 설치되어있어야 한다.

단말기를 PC에 연결하고 다음과 같이 입력한다.
cocos run test -p android

안드로이드를 실행하면 단말기에서 자동으로 게임이 실행된다.

다양한 화면 사이즈 대응
안드로이드 단말기의 경우 다양한 화면 크기를 가지고 있기때문에 대응이 쉽지 않다.
그래서 cocos2d-x에서는 화면 크기를 알아서 확대 축소해주는 메소드를 제공한다. 제공하는 메소드는 AppDelegate.cpp 에서 구현하면 된다. (예제 15.3 참조)

glview->setDesignResolutionSize(480, 320, ResolutionPolicy::EXACT_FIT);
고정할 크기와 해상도 정책을 입력한다.


enum class ResolutionPolicy
{
    /** The entire application is visible in the specified area without trying to preserve the original aspect ratio.
     * Distortion can occur, and the application may appear stretched or compressed.
     */
    EXACT_FIT, 고정한 사이즈로 변경. 부적합함..
    /** The entire application fills the specified area, without distortion but possibly with some cropping,
     * while maintaining the original aspect ratio of the application.
     */
    NO_BORDER, 화면 비율을 고려하여 확대/축소. 비율에 따라 단말기에서 출력되지 않는 경우가 발생
    /** The entire application is visible in the specified area without distortion while maintaining the original
     * aspect ratio of the application. Borders can appear on two sides of the application.
     */
    SHOW_ALL, 화면 비율을 고려하여 확대/축소. 비율이 맞지 않는 부분은 검은색으로 출력
    /** The application takes the height of the design resolution size and modifies the width of the internal
     * canvas so that it fits the aspect ratio of the device.
     * No distortion will occur however you must make sure your application works on different
     * aspect ratios.
     */
    FIXED_HEIGHT, 높이를 고정하고 화면 비율에 따라 너비를 변경. 일반적으로 가로 게임을 만들때 사용
    /** The application takes the width of the design resolution size and modifies the height of the internal
     * canvas so that it fits the aspect ratio of the device.
     * No distortion will occur however you must make sure your application works on different
     * aspect ratios.
     */
    FIXED_WIDTH, 너비 고정.

    UNKNOWN,
};

 

끝.

2017년 1월 19일 목요일

Cocos2d-x Effect 연출

Particle
Cocos2d-x 에서는 기본즉으로 다음과 같은 기본 파티클을 제공한다.

- ParticleFire: Point particle system. Uses Gravity mode.
- ParticleFireworks: Point particle system. Uses Gravity mode.
- ParticleSun: Point particle system. Uses Gravity mode.
- ParticleGalaxy: Point particle system. Uses Gravity mode.
- ParticleFlower: Point particle system. Uses Gravity mode.
- ParticleMeteor: Point particle system. Uses Gravity mode.
- ParticleSpiral: Point particle system. Uses Gravity mode.
- ParticleExplosion: Point particle system. Uses Gravity mode.
- ParticleSmoke: Point particle system. Uses Gravity mode.
- ParticleSnow: Point particle system. Uses Gravity mode.
- ParticleRain: Point particle system. Uses Gravity mode.

파티클 효과는 plist 파일로 저장이 되어있다.
값을 직접 지정해서 만들수도 있지만 보통 파티클 제작 툴을 사용한다.

particle2dx.com 


Sound
Cocos2d-x에서 사운드를 출력하려면 심플 오디오 엔진을 사용해야 한다.
사운드의 종류는 크게 배경음악과 효과음으로 구분할 수 있다.
배경음악은 동시에 여러개를 출력 할 수 없지만, 효과음의 경우 중복하여 여러개의 효과음을 출력 할 수 있다.

배경음악 시작
#include "SimpleAudioEngine.h"

using namespace CocosDenshion;

{
     SimpleAudioEngine::getInstance()->playBackgroundMusic("파일이름.mp3");     
}

SimpleAudioEngine에는 다음과 같은 매소드가 있으며 자세한 내용은 파일을 참고하면 된다.
     /**
     * Play background music.
     *
     * @param filePath The path of the background music file,or the FileName of T_SoundResInfo.
     * @param loop Whether the background music loop or not.
     * @js playMusic
     * @lua playMusic
     */
    virtual void playBackgroundMusic(const char* filePath, bool loop = false);

    /**
     * Stop playing background music.
     *
     * @param releaseData If release the background music data or not.As default value is false.
     * @js stopMusic
     * @lua stopMusic
     */
    virtual void stopBackgroundMusic(bool releaseData = false);

    /**
     * Pause playing background music.
     * @js pauseMusic
     * @lua pauseMusic
     */
    virtual void pauseBackgroundMusic();

    /**
     * Resume playing background music.
     * @js resumeMusic
     * @lua resumeMusic
     */
    virtual void resumeBackgroundMusic();

효과음 시작
int sound = SimpleAudioEngine::getInstance()->playEffect("effect1.wav");

보통 배경음악의 경우 mp3를 많이 사용하고 효과음은 압축이 되어있지 않은 wav를 주로 사용한다고 한다. (속도가 빠른가??)
효과음의 경우 중복 출력이 가능하므로 리턴하는 ID를 이용하여 효과음을 제어 할 수 있다.

기타 메소드
virtual bool isBackgroundMusicPlaying(); // 현재 배경음악이 재생중인지

// 볼륨 조절
virtual void setBackgroundMusicVolume(float volume);
virtual void setEffectsVolume(float volume);
virtual float getBackgroundMusicVolume();
virtual float getEffectsVolume();

// 미리 로드
virtual void preloadBackgroundMusic(const char* filePath); // 배경음악은 stopBackgroundMusic(bool releaseData = false)에서 제거됨.
virtual void preloadEffect(const char* filePath);
virtual void unloadEffect(const char* filePath); // 효과음은 이렇게 제거



[Cocos2d-x 3 모바일 게임 프로그래밍] 의 내용을 정리.

Cocos2d-x 데이터 관리

여러 데이터를 좀 더 효율적으로 관리하기 위하여 Vector를 사용 할 수 있다.
Vector는 배열과 다르게 처음 생성할 때 개수의 최댓값을 지정하지 않고 리스트 처럼 추가, 삭제가 가능한 자료구조이다.

Vector<Sprite*> sprs;

sprs.pushBack(spr);

for(Sprite* spr : sprs)
{
     ...

}


Cocos2d-x에서는 UserDefault라는 기본적인 데이터 저장소를 제공하고 있다.

UserDefault::getInstance()->setDoubleForKey(Const char * key, double value) // 해당 키에 value 를 저장한다.

Bool, Double, Floar, Int, String 등이 있다.

반대로 불러올때는 get을 사용하여 key를 입력하면 값을 리턴받을 수 있다.

UserDefault::getInstance()->flush(); // UserDefault에 저장된 내용을 xml파일로 저장한다.



[Cocos2d-x 3 모바일 게임 프로그래밍] 의 내용을 정리.

2017년 1월 10일 화요일

Cocos2d-x Adjust the speed of Action & Slow motion effect

Action에 Speed를 두어 속도를 조절 할 수 있다.
            m_magic0Vector.clear();
            m_magic0Vector = this->getActionManager()->pauseAllRunningActions(); // pause 가능

            for (Node* node : m_magic0Vector)
            {
                  Speed* action = (Speed*)node->getActionByTag(MONSTER_MOVE_ACTION);
                  if (action)
                  {
                        action->setSpeed(2);
                  }
            }

            this->getActionManager()->resumeTargets(m_magic0Vector); // resume

위의 speed set 을 사용하기 위해서는 Speed*로 생성을 해야 한다.
            auto action = MoveTo::create((pos.x - castle_x) / pixelPerSec, Point(castle_x, m_yPos[i]));

            Speed* sAction = Speed::create(action, 1);
            sAction->setTag(MONSTER_MOVE_ACTION);

            sprEnemy->runAction(sAction);


전체적인 속도를 변경하고 싶으면 스케쥴러의 time scale을 조절한다.
            this->getScheduler()->setTimeScale(2);

손쉽게 Slow motion 같은 기능을 구현 할 수 있다.

2017년 1월 5일 목요일

Cocos2d-x 배경 이미지

- 하나의 이미지로 배경 이미지 스크롤

      auto spr = Sprite::create("defender/field.png");
      spr->setAnchorPoint(Point(0, 0));
      this->addChild(spr);

      auto action0 = MoveBy::create(10, Point(-m_winSize.width, 0));
      auto action1 = Place::create(Point(0, 0)); // 배경 이미지를 처음 위치로 이동
      Sequence 액션
      RepeatForever 액션
Place 의 기능을 활용한다.
((원하는 방향으로 이동 --> 초기위치로 이동 ) 두가지의 Sequence)  RepeatForever
한 방향으로만 이동하는 게임에서 사용하면 편리하다.


- ParallaxNode 를 사용하는 방법

꼭 사용하지 않아도 어떤 방법으로든 구현은 가능한 부분인데 사용하기 복잡하여 생략한다.
직접 위치를 지정하는 방식과 비슷하다.


- 타일을 사용하여 배경 이미지 구성

      auto bgLayer = Layer::create();
      this->addChild(bgLayer);

      for (int i = 0; i < 15; i++)
      {
            for (int j = 0; j < 10; j++)
            {
                  auto spr = Sprite::create("defender/field.png");
                  spr->setAnchorPoint(Point::ZERO);
                  spr->setPosition(Point(i * 32, j * 32));
                  bgLayer->addChild(spr);
            }
      }
32 * 32 의 작은 이미지를 사용한 예
타일을 사용한 배경이미지를 스크롤하기 원한다면 위의 bgLayer에 [MoveBy, Place, Sequence, RepeatForever]을 위와같이 적용해주면 된다.




[Cocos2d-x 3 모바일 게임 프로그래밍] 의 내용을 정리.




2017년 1월 2일 월요일

Cocos2d-x Animation과 Schedule

Animation을 정리하기 전에 먼저 Atlas Image를 만드는 방법과 사용법에 대한 정리 필요.
Atlas Image는 여러개의 이미지들을 "하나의 큰 이미지"로 만드는 것.
어플리케이션에서 사용되는 수많은 이미지의 자원 관리를 위해 일반적으로 Atlas Image를 만들어 사용.


Atlas Image 사용을 위해 먼저 plist 파일을 등록한다.
다음은 일반적으로 스프라이트 생성하는 방법과 같다.
      SpriteFrameCache::getInstance()->addSpriteFramesWithFile("?.plist");

      auto spr = Sprite::createWithSpriteFrameName("??.png");
      spr->setPosition(Point(240, 160));
      this->addChild(spr);

애니메이션 객체 생성 및 스프라이트 적용
      auto animation = Animation::create();
      animation->setDelayPerUnit(0.3); // 프레임 시간 간격 설정

      for (int i = 0; i < numImages; i++) {
            auto frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(StringUtils::format("??%d.png", i));
            animation->addSpriteFrame(frame);
      }

      auto animate = Animate::create(animation); // 애니메이션 객체를 액션으로 
      spr->runAction(animate); 

      spr->runAction(RepeatForever::create(animate)); // 무한히 반복하는 애니메이션으로 


Schedule
Cocos2d-x 에서는 타이머로 Schedule을 사용한다.
// Callback 함수, 호출 간격
this->schedule(schedule_selector(ScheduleScene::scheduleCallback), /*interval*/, /*repeat*/, /*delay*/); // delay만큼 지연된 후 repeat 횟수만큼 interval 간격으로 호출됨

void ScheduleScene::scheduleCallback(float delta)
{
      CCLOG("scheduleCallback : %f", delta);
}

scheduleUpdate() 를 사용하여 update 매소드를 사용하는 방법
scheduleOnce() 를 사용하는 방법
scheduleUpdateWithPriority() 를 사용하여 우선순위릘 부여하는 방법 등
기본형으로 구현이 가능하므로 몇가지 다른 방법도 있다는 정도만 알아두자. 

Schedule을 중지해야 할때
      unschedule(schedule_selector(호출한 메소드명))
      unscheduleAllSelectios(); // 모든 스케쥴을 중지
      unscheduleUpdate(); // update 스케쥴만 중지할때 
더이상 스케쥴이 사용되지 않을때 위의 방법으로 중지를 시킬 수 있다.


[Cocos2d-x 3 모바일 게임 프로그래밍] 의 내용을 정리.

 

2017년 1월 1일 일요일

Cocos2d-x 충돌 검사

2개 이상의 객체 사이의 충돌을 검사하기 위함.
특정 영역을 터치 하거나 화면에 있는 아이템 등을 터치할 때 사용 할 수 있음.

containsPoint()
      //터치된 좌표가 Rect 영역 안에 있는지 검사;      
      Point location = touch->getLocation();
      Rect rect = spr->getBoundingBox();

      if (rect.containsPoint(location)) {
          // 이벤트 처리;
      }
containsPoint() 메소드는 Rect와 Point 사이의 충돌을 검사한다.

intersectsRect()
      // 두 영역의 충돌 검사
      Rect rect0 = ..;
      Rect rect1 = spr->getBoundingBox();

      if (rect0.intersectsRect(rect1)) {
          // 이벤트 처리;
      }
intersectsRect() 메소드를 사용해서 Rect와 Rect 사이의 충돌을 검사한다.


[Cocos2d-x 3 모바일 게임 프로그래밍] 의 내용을 정리.

Cocos2d-x 터치 이벤트

싱글 터치 이벤트
      // 싱글 터치로 리스너를 생성;
      auto listener = EventListenerTouchOneByOne::create();

      // 화면을 터치할 때 콜백되는 메소드 등록;
      listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this); // 터치 시작;
      listener->onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved, this); // 드래그;
      listener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this); // 터치 종료;
      listener->onTouchCancelled = CC_CALLBACK_2(HelloWorld::onTouchCancelled, this); // 터치 취소;

      // 리스터를 EventDispatcher에 추가;
      Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(listener, 1); // 우선순위 숫자가 작을수록 먼저 이벤트 발생;

싱글 터치 이벤트 관련 함수
      virtual bool onTouchBegan(Touch *touch, Event *unused_event);
      virtual void onTouchMoved(Touch *touch, Event *unused_event);
      virtual void onTouchEnded(Touch *touch, Event *unused_event);
      virtual void onTouchCancelled(Touch *touch, Event *unused_event);
위와같이 4개의 가상함수가 있으며 상황에 따라 호출이 된다. *unused_event는 기존의 Cocos2d-x iPhone 버전과 형식을 같게 하기 위해 만든 매개변수이며 값이 전달되지 않는다.
onTouchBegan() 메소드만 리턴값을 가지고 있으며 리턴 값이 false인 경우 뒤의 메소드(onTouchMoved, onTouchEnded 등)는 호출되지 않는다.

터치된 영역의 좌표를 얻을 때
      Point location = touch->getLocation();


멀티 터치 이벤트
      // 멀티 터치로 리스너를 생성;
      auto listener = EventListenerTouchAllAtOnce::create();

      // 화면을 터치할 때 콜백되는 메소드 등록;
      listener->onTouchesBegan = CC_CALLBACK_2(HelloWorld::onTouchesBegan, this); // 두번째 터치 시작;
      listener->onTouchesMoved = CC_CALLBACK_2(HelloWorld::onTouchesMoved, this); // 드래그;
      listener->onTouchesEnded = CC_CALLBACK_2(HelloWorld::onTouchesEnded, this); // 터치 종료;
      listener->onTouchesCancelled = CC_CALLBACK_2(HelloWorld::onTouchesCancelled, this); // 터치 취소;

      // 리스터를 EventDispatcher에 추가;
      Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(listener, 1); // 우선순위 숫자가 작을수록 먼저 이벤트 발생;

멀티 터치 이벤트 관련 함수
      virtual void onTouchesBegan(const std::vector<Touch*>& touches, Event *unused_event);
      virtual void onTouchesMoved(const std::vector<Touch*>& touches, Event *unused_event);
      virtual void onTouchesEnded(const std::vector<Touch*>& touches, Event *unused_event);
      virtual void onTouchesCancelled(const std::vector<Touch*>&touches, Event *unused_event);
위와같이 4개의 가상함수가 있으며 상황에 따라 호출이 된다.
멀티 터치 이벤트의 시작은 첫번째 화면의 터치 이후 다른 영역에 터치가 발생하면 onTouchesBegan()이 호출이 된다. 이때 터치에 관련된 정보가 vector로 저장이 된다.
onTouchesBegan()의 리턴값이 없다는것이 싱글 터치 이벤트와 다르다.


[Cocos2d-x 3 모바일 게임 프로그래밍] 의 내용을 정리.


2016년 12월 31일 토요일

Cocos2d-x Scene과 Layer

화면전환
화면 전환의 방법에는 replaceScene(), pushScene(), popScene() 메소드를 사용하는 방법이 있다.

replaceScene() : 화면을 전환할 때 새로운 화면을 생성해서 화면을 전환하고 이전 화면 클래스는 메모리 해제.

      Director::getInstance()->replaceScene(GameScene::createScene());

pushScene() : 지금의 화면을 스택에 넣고 매개변수로 받은 화면으로 전환한다.
popScene() : 현재 화면의 메모리 해제를 하고 스택의 마지막 화면을 보이게 한다.

화면 전환 효과
replaceScene(), pushScene() 메소드 에서는 화면을 전환할 때 다양한 화면 전환 효과를 적용 할 수 있다.

종류 : Fade, Flip, Zoom, ZoomFlip, MoveIn, SlideIn, Progress, Split 등.

      auto scene = TransitionCrossFade::create(2, GameScene::createScene());
      Director::getInstance()->replaceScene(scene);


[Cocos2d-x 3 모바일 게임 프로그래밍] 의 내용을 정리.

2016년 12월 30일 금요일

Cocos2d-x 실습용 프로젝트 기본형

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// HelloWorldScene.h
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#pragma execution_character_set("utf-8");

#include "cocos2d.h"

USING_NS_CC; // using namespace cocos2d

class HelloWorld : public cocos2d::LayerColor
{
public:
static cocos2d::Scene* createScene();

virtual bool init();

CREATE_FUNC(HelloWorld); // create() ��ũ��;
};

#endif // __HELLOWORLD_SCENE_H__

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// HelloWorldScene.cpp
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h"

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()
{
if ( !LayerColor::initWithColor(Color4B(160, 160, 215, 255)) )
{
return false;
}

Size winSize = Director::getInstance()->getWinSize();

CCLOG("Hello!!");


return true;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// AppDelegate.h
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef _APP_DELEGATE_H_
#define _APP_DELEGATE_H_

#include "cocos2d.h"

/**
@brief The cocos2d Application.

Private inheritance here hides part of interface from Director.
*/
class AppDelegate : private cocos2d::Application
{
public:
AppDelegate();
virtual ~AppDelegate();

virtual void initGLContextAttrs();

/**
@brief Implement Director and Scene init code here.
@return true Initialize success, app continue.
@return false Initialize failed, app terminate.
*/
virtual bool applicationDidFinishLaunching();

/**
@brief Called when the application moves to the background
@param the pointer of the application
*/
virtual void applicationDidEnterBackground();

/**
@brief Called when the application reenters the foreground
@param the pointer of the application
*/
virtual void applicationWillEnterForeground();
};

#endif // _APP_DELEGATE_H_

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// AppDelegate.cpp
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "AppDelegate.h"
#include "HelloWorldScene.h"

USING_NS_CC;

static cocos2d::Size designResolutionSize = cocos2d::Size(480, 320);
static cocos2d::Size smallResolutionSize = cocos2d::Size(480, 320);
static cocos2d::Size mediumResolutionSize = cocos2d::Size(1024, 768);
static cocos2d::Size largeResolutionSize = cocos2d::Size(2048, 1536);

AppDelegate::AppDelegate()
{
}

AppDelegate::~AppDelegate()
{
}

// if you want a different context, modify the value of glContextAttrs
// it will affect all platforms
void AppDelegate::initGLContextAttrs()
{
// set OpenGL context attributes: red,green,blue,alpha,depth,stencil
GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8};

GLView::setGLContextAttrs(glContextAttrs);
}

// if you want to use the package manager to install more packages,
// don't modify or remove this function
static int register_all_packages()
{
return 0; //flag for packages manager
}

bool AppDelegate::applicationDidFinishLaunching() {
// initialize director
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if(!glview) {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX)
glview = GLViewImpl::createWithRect("HelloHyun", cocos2d::Rect(0, 0, designResolutionSize.width, designResolutionSize.height));
#else
glview = GLViewImpl::create("HelloHyun");
#endif
director->setOpenGLView(glview);
}

// turn on display FPS
director->setDisplayStats(true);

// set FPS. the default value is 1.0/60 if you don't call this
director->setAnimationInterval(1.0f / 60);

// Set the design resolution
glview->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, ResolutionPolicy::NO_BORDER);
auto frameSize = glview->getFrameSize();
// if the frame's height is larger than the height of medium size.
if (frameSize.height > mediumResolutionSize.height)
{
director->setContentScaleFactor(MIN(largeResolutionSize.height/designResolutionSize.height, largeResolutionSize.width/designResolutionSize.width));
}
// if the frame's height is larger than the height of small size.
else if (frameSize.height > smallResolutionSize.height)
{
director->setContentScaleFactor(MIN(mediumResolutionSize.height/designResolutionSize.height, mediumResolutionSize.width/designResolutionSize.width));
}
// if the frame's height is smaller than the height of medium size.
else
{
director->setContentScaleFactor(MIN(smallResolutionSize.height/designResolutionSize.height, smallResolutionSize.width/designResolutionSize.width));
}

register_all_packages();

// create a scene. it's an autorelease object
auto scene = HelloWorld::createScene();

// run
director->runWithScene(scene);

return true;
}

// This function will be called when the app is inactive. Note, when receiving a phone call it is invoked.
void AppDelegate::applicationDidEnterBackground() {
Director::getInstance()->stopAnimation();

// if you use SimpleAudioEngine, it must be paused
// SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
}

// this function will be called when the app is active again
void AppDelegate::applicationWillEnterForeground() {
Director::getInstance()->startAnimation();

// if you use SimpleAudioEngine, it must resume here
// SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
}