여러이미지로 배경 구현하기



h++)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "cocos2d.h"
 
USING_NS_CC;
 
class Test254 : public cocos2d::Layer
{
public:
    static cocos2d::Scene* createScene();
    
    virtual bool init();
    
    // implement the "static create()" method manually
    CREATE_FUNC(Test254);
    
    
    void initBG();   //배경
};
 
#endif
cs



c++)

각각의 배경레이어를 만든후 애니메이션을 다르게 준다

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
#include "test254.hpp"
 
USING_NS_CC;
 
Scene* Test254::createScene()
{
    auto scene = Scene::create();
    
    auto layer = Test254::create();
    scene->addChild(layer);
    
    
    return scene;
}
 
 
bool Test254::init()
{
    if ( !Layer::init())
    {
        return false;
    }
    
    
    initBG();
    
    return true;
}
 
 
//배경그리기
void Test254::initBG(){
    /** 첫번째 배경레이어 **/
    //배경레이어를 추가한다
    auto bgLayer1 = Layer::create();
    this->addChild(bgLayer1);
    
    //배경이미지를 배경레이어에 추가한다
    auto sprite = Sprite::create("background2.png");
    sprite->setAnchorPoint(Point::ZERO);
    sprite->setPosition(Point::ZERO);
    bgLayer1->addChild(sprite);
    
    //가로크기만큼 추가 스프라이트 이미지 객체를 만들어서 배경레이어 오른쪽 끝에 추가한다
    auto sprite1 = Sprite::create("background2.png", Rect(00480320));
    sprite1->setAnchorPoint(Point::ZERO);
    sprite1->setPosition(Point(2000,0));
    bgLayer1->addChild(sprite1);
    
    //이미지의 가로크기인 2500만큼 왼쪽으로 이동한다
    auto action0 = MoveBy::create(10.0, Point(-2000,0));
    //이미지의 오른쪽 끝에 위치하면 원래 위치로 이동한다
    auto action1 = Place::create(Point::ZERO);
    //2개의 액션을 묶는다
    auto action2 = Sequence::create(action0, action1, NULL);
    //묶은 액션을 반복한다
    auto action3 = RepeatForever::create(action2);
    //배경레이어에 애니메이션 적용한다
    bgLayer1->runAction(action3);
    
    
    
    /** 두번째 배경레이어 **/
    auto bgLayer2 = Layer::create();
    this->addChild(bgLayer2);
    
    //배경이미지 추가
    auto sprite2 = Sprite::create("background3.png");
    sprite2->setAnchorPoint(Point::ZERO);
    sprite2->setPosition(Point::ZERO);
    bgLayer2->addChild(sprite2);
    
    //가로크기만큼 추가 스프라이트 이미지 객체를 만들어서 배경레이어 오른쪽 끝에 추가한다
    auto sprite3 = Sprite::create("background3.png", Rect(0,0,480,114));
    sprite3->setAnchorPoint(Point::ZERO);
    sprite3->setPosition(Point(2000,0));
    bgLayer2->addChild(sprite3);
    
    //배경레이어2에 애니메이션 적용한다
    auto action4 = MoveBy::create(5.0, Point(-2000,0));
    auto action5 = Place::create(Point::ZERO);
    auto action6 = Sequence::create(action4, action5, NULL);
    auto action7 = RepeatForever::create(action6);
    bgLayer2->runAction(action7);
}
cs



결과

이미지 2개로 배경을 구현하였다



배경이미지 스크롤시 끊김 문제 해결



h++)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef test252_hpp
#define test252_hpp
 
#include "cocos2d.h"
 
USING_NS_CC;
 
class Test : public cocos2d::Layer
{
public:
    static cocos2d::Scene* createScene();
    
    virtual bool init();
    
    // implement the "static create()" method manually
    CREATE_FUNC(Test);
    
    
    void initBG();   //배경
};
 
#endif
cs



c++)

가로크기만큼 배경이미지를 오른쪽 끝에 추가한다

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
#include "test252.hpp"
 
USING_NS_CC;
 
Scene* Test::createScene()
{
    auto scene = Scene::create();
    
    auto layer = Test::create();
    scene->addChild(layer);
    
    
    return scene;
}
 
 
bool Test::init()
{
    if ( !Layer::init())
    {
        return false;
    }
    
    
    initBG();
    
    return true;
}
 
 
//배경그리기
void Test::initBG(){
    //배경레이어를 추가한다
    auto bgLayer = Layer::create();
    this->addChild(bgLayer);
    
    
    //배경이미지를 배경레이어에 추가한다
    auto sprite = Sprite::create("background2.png");
    sprite->setAnchorPoint(Point::ZERO);
    sprite->setPosition(Point::ZERO);
    bgLayer->addChild(sprite);
    
    
    //가로크기만큼 추가 스프라이트 이미지 객체를 만들어서 배경레이어 오른쪽 끝에 추가한다
    auto sprite1 = Sprite::create("background2.png", Rect(00480320));
    sprite1->setAnchorPoint(Point::ZERO);
    sprite1->setPosition(Point(2000,0));
    bgLayer->addChild(sprite1);
    
    
    //이미지의 가로크기인 2500만큼 왼쪽으로 이동한다
    auto action0 = MoveBy::create(10.0, Point(-2000,0));
    //이미지의 오른쪽 끝에 위치하면 원래 위치로 이동한다
    auto action1 = Place::create(Point::ZERO);
    //2개의 액션을 묶는다
    auto action2 = Sequence::create(action0, action1, NULL);
    //묶은 액션을 반복한다
    auto action3 = RepeatForever::create(action2);
    //배경레이어에 애니메이션 적용한다
    bgLayer->runAction(action3);
}
cs



결과

오른쪽 긑에 도달하여도 배경이미지가 끊기지 않는다



배경이미지 스크롤하기



h++)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef test250_hpp
#define test250_hpp
 
#include "cocos2d.h"
 
USING_NS_CC;
 
class Test250 : public cocos2d::Layer
{
public:
    static cocos2d::Scene* createScene();
    
    virtual bool init();
    
    // implement the "static create()" method manually
    CREATE_FUNC(Test250);
   
 
    void initBG();   //배경
};
 
#endif /* test250_hpp */
 
cs



c++)

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
#include "test250.hpp"
 
USING_NS_CC;
 
Scene* Test250::createScene()
{
    auto scene = Scene::create();
    
    auto layer = Test250::create();
    scene->addChild(layer);
    
    
    return scene;
}
 
 
bool Test250::init()
{
    if ( !Layer::init())
    {
        return false;
    }
    
    
    initBG();
    
    return true;
}
 
 
//배경그리기
void Test250::initBG(){
    //배경이미지 위치
    auto sprite = Sprite::create("background.jpg");
    sprite->setAnchorPoint(Point(0,0.5));
    this->addChild(sprite);
    
 
    //이미지의 가로크기인 2500만큼 왼쪽으로 이동한다
    auto action0 = MoveBy::create(10.0, Point(-2500,0));
    //이미지의 오른쪽 끝에 위치하면 원래 위치로 이동한다
    auto action1 = Place::create(Point(0,0.5));
    //2개의 액션을 묶는다
    auto action2 = Sequence::create(action0, action1, NULL);
    //묶은 액션을 반복한다
    auto action3 = RepeatForever::create(action2);
    //스프라이트 객체에 애니메이션 적용한다
    sprite->runAction(action3);
}
cs



결과

배경이미지가 왼쪽으로 스크롤된다



Cocos 프로젝트 생성

-p : 패키지이름

-l  : 개발언어

-d : 설치경로

cocos > tools > cocos2d-console > bin

1
cocos new test3 -p com.ghj -l cpp -d /Users/ghj/Desktop/workspace/cocos/
cs



Cocos 프로젝트 안드로이드 컴파일

test3 > proj.android

1
cocos compile test --ap android-23 -p android
cs



Cocos 프로젝트 안드로이드 실행

1
cocos run test -p android
cs


안드로이드 컴파일시 발생



문제)

jni/../../Classes/AppDelegate.cpp:77: error: undefined reference to 'Test401::createScene()'



해결)

해당하는 cpp 파일을 포함시키지 않았기 때문에 발생한 문제

proj.android > jni > Android.mk 파일을 수정

LOCAL_SRC_FILES 에 컴파일할 파일을 추가한다

1
2
3
4
5
LOCAL_SRC_FILES := hellocpp/main.cpp \
                   ../../Classes/AppDelegate.cpp \
                   ../../Classes/HelloWorldScene.cpp \
                   ../../Classes/test401.cpp \
                   ../../Classes/cJSON.c
cs


문제)

The directory 'android-13' can't be found in ANDROID_SDK_ROOT/platforms, please use --ap to set needed API level



해결)

해당하는 Android SDK API가 없기 때문에 발생한 문제

해당하는 API를 설정해준다

1
cocos compile test --ap android-23 -p android
cs



Xcode 시뮬레이터에서 키보드가 안보일때 보이게 하기



Simulator > Hardware > Keyboard > Connect Hardware Keyboard 선택을 해제한다



스케쥴 실행하고 중지하기 3가지 방법



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
#ifndef test246_hpp
#define test246_hpp
 
#include "cocos2d.h"
 
USING_NS_CC;
 
class Test246 : public cocos2d::Layer
{
public:
    static cocos2d::Scene* createScene();
    
    virtual bool init();
    
    // implement the "static create()" method manually
    CREATE_FUNC(Test246);
    
    int scheduleIndex = 0;
    int updateIndex = 0;
    
    void scheduleCallback(float delta); //schedule 콜백함수
    void update(float delta);           //scheduleUpdate 콜백함수
    void scheduleOnceCallback(float delta);  //scheduleOnce 콜백함수
};
#endif /* test246_hpp */
cs



c++)

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
#include "test246.hpp"
 
USING_NS_CC;
 
Scene* Test246::createScene()
{
    auto scene = Scene::create();
    
    auto layer = Test246::create();
    scene->addChild(layer);
    
        
    return scene;
}
 
 
bool Test246::init()
{
    if ( !Layer::init())
    {
        return false;
    }
    
    //지정된 메인 프레임 시간간격으로 콜백함수 호출
    this->schedule(schedule_selector(Test246::scheduleCallback));
    
    //update 콜백함수 호출
    this->scheduleUpdate();
 
    //scheduleOnce : 대기시간만큼 대기한 후 한번만 호출
    this->scheduleOnce(schedule_selector(Test246::scheduleOnceCallback), 5.0);
    
    
    return true;
}
 
 
//스케쥴 콜백함수
void Test246::scheduleCallback(float delta){
    scheduleIndex++;
    CCLOG("shedule callback");
    
    if(scheduleIndex > 5){
        //unschedule : 선택한 스케쥴을 중지
        //unscheduleAllSelectors : 모든 스케쥴을 중지
        //unscheduleUpdate : update 스케쥴을 중지
        this->unschedule(schedule_selector(Test246::scheduleCallback));
    }
}
 
//업데이트 콜백함수
void Test246::update(float delta){
    updateIndex++;
    CCLOG("shedule update callback");
    
    if(updateIndex > 5){
        this->unscheduleUpdate();
    }
}
 
//스케쥴 원스 콜백함수
void Test246::scheduleOnceCallback(float delta){
    CCLOG("shedule once callback");
}
 
cs



결과

scheduleUpdate 와 schedule 콜백함수를 5번 실행 후 중지한다

5초 후 scheduleOnce 콜백함수 실행 후 중지한다

1
2
3
4
5
6
7
8
9
10
11
12
13
shedule update callback
shedule update callback
shedule callback
shedule update callback
shedule callback
shedule update callback
shedule callback
shedule update callback
shedule callback
shedule update callback
shedule callback
shedule callback
shedule once callback
cs


스케줄 구현하기

일정 시간간격으로 콜백함수 호출한다



c++)

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
#include "test243.hpp"
 
USING_NS_CC;
 
Scene* Test243::createScene()
{
    auto scene = Scene::create();
    
    auto layer = Test243::create();
    scene->addChild(layer);
    
    return scene;
}
 
 
bool Test243::init()
{
    if ( !Layer::init())
    {
        return false;
    }
    
    
    //schedule(호출함수, 시간간격, 반복회수, 최초 대기시간) : 일정한 시간간격으로 반복해서 다른메서드 호출
    //5초후 최초 1번 호출되고 1초마다 5번 더 반복하여 호출된다
    this->schedule(schedule_selector(Test243::scheduleCallback), 1.055.0);
    
    
    return true;
}
 
 
//스케쥴 콜백함수
void Test243::scheduleCallback(float delta){
    CCLOG("shedule : %f", delta);
}
cs



결과

1
2
3
4
5
6
shedule : 5.000000
shedule : 1.000000
shedule : 1.000000
shedule : 1.000000
shedule : 1.000000
shedule : 1.000000
cs


애니메이션 구현하기



c++)

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
#include "test237.hpp"
 
USING_NS_CC;
 
Scene* Test237::createScene()
{
    auto scene = Scene::create();
    
    auto layer = Test237::create();
    scene->addChild(layer);
    
    return scene;
}
 
 
bool Test237::init()
{
    if ( !Layer::init())
    {
        return false;
    }
    
    
    setAnimation();
    
    
    return true;
}
 
//애니메이션
void Test237::setAnimation(){
    //기준이 되는 스프라이트 객체 생성 (첫번째 프레임)
    auto sprite = Sprite::create("m_1.jpg");
    sprite->setPosition(Point(100,100));
    this->addChild(sprite);
    
 
    //애니메이션 객체 생성
    auto animation = Animation::create();
    //프레임간격을 0.3초로 지정
    animation->setDelayPerUnit(0.3);
    //프레임 추가
    for(int i=1; i<=15; i++){
        animation->addSpriteFrameWithFile(StringUtils::format("m_%d.jpg", i));
    }
    
    
    //애니메이션 객체를 Animate 객체로 변환
    auto animate = Animate::create(animation);
    //애니메이션 무한반복
    auto action = RepeatForever::create(animate);
    //Animate 객체를 Sprite 객체에 실행
    sprite->runAction(action);
}
 
cs



결과

15개의 이미지가 0.3초간격으로 보여지면서 애니메이션을 구현한다



+ Recent posts