달력

5

« 2024/5 »

  • 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

1) 솔루션 탐색기에서 파일명 변경

HelloWorldScene.cpp ->MenuScene.cpp

HelloWorldScene.h    -> MenuScene.h


2) 헤더파일 내부 변경

변경전

변경후


-------------------------------------


3) HelloWorldScene.cpp 파일 내부 변경

변경 전

_M#]

변경 후


4) appDelegate.cpp 파일 내부 변경

변경 전


변경 후


:
Posted by 웽웽

 HelloWorldScene.cpp


HelloWorldScene.h



:
Posted by 웽웽

- 박스들 간의 충돌 판정은 getBoundingBox()후 rect.intersectsRect()로 확인

- 점과 박스와의 충돌 판정은 getBoundingBox()후 rect.containsPoint()로 확인



AppDelegate.cpp


AppDelegate.h


HelloWorldScene.cpp


HelloWorldScene.h


:
Posted by 웽웽

- 충돌체크

getContentSize()함수를 이용하여 객체의 크기(width, height)를, getPosition()함수로 객체의 좌표를 가져와서 계산한 값을 통해, 터치가 해당 좌표에 속하는지 안속하는지를 확인한 뒤 동작하게 하는 식으로 구현함.

if (location.x > (pos.x - (size.width / 2)) && location.x < (pos.x + (size.width / 2)) && location.y >(pos.y - (size.height / 2)) && location.y < (pos.y + (size.height / 2)) )

{

spr->runAction(ScaleBy::create(0.5f, 1.2));

}

//터치가 스프라이트의 범위 내에 속하면 크기를 1.2배만큼 키워주는 기능

//단, 해당 스프라이트의 크기가 커진 이후에도 처음 크기의 범위만큼만 적용됨.


위의 이 작업을 훨씬 간단하게 하는 방법

Rect  rectSpr = spr->getBoundingBox(); //spr의 영역을 Rect형 rectSpr에 담음

if (rectSpr.containsPoint(location)) //location의 좌표가 포함되는지 확인

{

spr->runAction(ScaleBy::create(0.3f, 1.2));

}

//이렇게하면 훨씬 안전하고 확실하다
//그리고 스프라이트가 커지고 나서도 그 영역을 확인할 수 있다.



'DATA_OLD > Cocos2d-x 기능성 게임 개발과정' 카테고리의 다른 글

[D_008] 비행기 게임 by touch event  (0) 2014.11.20
[D_007] 터치 판정 예제  (0) 2014.11.19
[D_007] Touch event  (0) 2014.11.19
[D_006] 비행기 게임 예제  (0) 2014.11.19
[D_005] Call Function  (0) 2014.11.17
:
Posted by 웽웽

1) 클래스에 virtual 함수들을 등록

bool onTouchBegan(Touch* touch, Event* unused_event); //터치의 시작과 동시에 호출

//얘만 bool형임을 명심할것

+ 이 함수에서 return 값을 false로 할 경우, Began호출 후 이후의 Moved와 Ended가 호출되지 않음.



void onTouchMoved(Touch* touch, Event* unused_event); //터치한 채로 움직이는 중에 호출

void onTouchEnded(Touch* touch, Event* unused_event); //터치한 손을 뗄 때 호출

//Touch* touch : 터치와 관련된 정보들(좌표값 등)

//Event* unused_event : cocos2d에서만 사용되던 것. cocos2d-x에서는 사용되지않고 ios로 포팅할 때의 틀만 가지고 있음

//+ onTouchCancelled : 예기치 못한 상황(어플호출로 화면이 바뀐다거나)으로 터치가 취소될 때 호출



2) 리스너에 함수들을 등록
//init에서 
//EventListenerTouchOneByOne - 싱글터치용 리스너
//EventListenerTouchAllAtOnce - 멀티터치용 리스너

Listener를 생성한 뒤, 해당 리스너가 받는 onTouchBagan, onTouchMoved, onTouchEnded에 함수를 등록시켜준다. 즉, 리스너가 위의 행위를 감지하면 등록된 함수가 호출되는 방식

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);

//onTouch함수들이 자동으로 인자를 2개를 받기때문에 CC_CALLBACK_2를 사용


+ 꼭 onTouchBegan과 같은 존재하는 함수만 가능한건 아니다.

사용자가 임의로 지정한 이름의 함수도 등록만 되면 똑같이 사용가능하다.


+ listener를 헤더에 있는 클래스 본체에 선언하여 사용하면, 화면전환등의 일이 일어났을 경우, 자동으로 리스너를 죽임과 동시에 이런저런 등록되어있는 것들 역시 일괄적으로 정리된다.



3) 이벤트 디스패쳐에 등록

Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);

//Director를 통해, 리스너를 이벤트디스패쳐에 등록해준다.

//[addEvent...]는 눈에 보이는 레이어 순서대로 터치 이벤트를 처리하라는 뜻.



+ 메뉴(버튼)와 터치의 차이점

메뉴는 눌렀다가 뗐을 때 동작을 하게 됨.

터치는 눌렀을 때, 움직일 때, 뗐을 때마다 각각 동작을 지정해줄 수 있음.




2) 멀티 터치

bool onTouchesBegan(const std::vector<Touch*>& touches, Event* unused_event);

 //터치의 시작과 동시에 호출


void onTouchesMoved(const std::vector<Touch*>& touches, Event* unused_event);

 //터치한 채로 움직이는 중에 호출


void onTouchesEnded(const std::vector<Touch*>& touches, Event* unused_event); 

//터치한 손을 뗄 때 호출




:
Posted by 웽웽
:
Posted by 웽웽

CallFunc란?

Action이 아닌 함수적 동작을 Action처럼 쓸 수 있게 해주는 기능.


spr1->runAction(Sequence::create(

MoveTo::create(3.0f, Vec2(380, 100)),

CallFunc::create(CC_CALLBACK_0(HelloWorld::callfuck, this)),

NULL

));



+ 여기서 CC_CALLBACK_0은 자동으로 넘기는게 없는 거지, 호출하는 함수가 파라미터가 없다는게 아니다. CC_CALLBACK_0은 단지 호출 객체를 Ref* sender로 넘겨주지 않을 뿐이지, 다른 파라미터는 가질 수 있다.

+ CallFuncN이 들어가면 뒤에는 CC_CALLBACK_0말고 다른거(1, 2, 3, 4)가 들어간다.


spr1->runAction(Sequence::create(

MoveTo::create(3.0f, Vec2(380, 100)),

CallFuncN::create(CC_CALLBACK_1(HelloWorld::callFuckN, this)),

NULL

));

//callFuckN에게 spr1을 인자로 넘겨줌

+ 이렇게 CC_CALLBACK_1을 쓰면, CC_CALLBACK_1을 통해서 불려지는 함수에게 파라미터로 함수를 부르는 자기 자신(Ref* sender)을 넘겨준다. (?)



틀린 경우

spr1->runAction(Sequence::create(

MoveTo::create(3.0f, Vec2(380, 100)),

CallFuncN::create(CC_CALLBACK_0(HelloWorld::callFuckN, this, 1208)),

NULL

));


void HelloWorld::callFuckN(Ref* sender, int score)

{

CCLOG("Call Fuck %d!", score);

auto spr = (Sprite*)sender;

spr->runAction(ScaleTo::create(1.0f, 2));


}

이러면, CC_CALLBACK_0이기 때문에, 자동으로 Ref* sender로 넘겨주는 값이 없기 때문에 컴파일단계에서 에러가 난다.(callFuckN 내부 두번째에서 에러)


이때, 

CallFuncN::create(CC_CALLBACK_0(HelloWorld::callFuckN, this, 1208)), NULL

부분을

CallFuncN::create(CC_CALLBACK_0(HelloWorld::callFuckN, this, spr1, 1208)), NULL

로 해주면, 자연스럽게 spr1이 Ref* sender로 넘어가기 때문에 문제없이 실행된다.

:
Posted by 웽웽

1) Sequence

여러개의 Action을 순차적으로 실행하기 위해서 쓰는 또 하나의 액션.

auto act1 = MoveTo::create(1.5f, Vec2(380, 100));

auto act2 = ScaleTo::create(1.0f, 2.0f);

auto act3 = MoveTo::create(1.0f, Vec2(380, 300));

auto action = Sequence::create(act1, act2, act3, NULL);

spr1->runAction(action);

// ( 액션1, 액션2, 액션3, ... , NULL) 식으로, 순차적으로 실행할 액션을 쭉 나열한 다음 마지막에 NULL로 마무리를 해줌




2) Spawn
여러개의 Action을 동시에 실행하기 위해서 쓰는 액션
auto act2 = ScaleTo::create(1.0f, 2.0f);
auto act3 = MoveTo::create(1.0f, Vec2(380, 300));
auto spw = Spawn::create(act2, act3, NULL);
//2배로 커지면서 380, 300으로 이동하는 액션 수행
// ( 액션1, 액션2, ... , NULL )식으로, Sequence와 구조가 같음
// 동시실행하는 액션이 실행시간이 다를 경우, 가장 긴 실행시간의 액션이 끝나야 Spawn이 끝난다.



+ 다양한 액션들을 복합적으로 사용할 때, 코드가 여러줄로 길어지는 것을 방지하기 위해서, 하나의 액션 속에 뭉쳐서 쓰는 방법을 연습하는 것이 좋다.



3) reverse()

반대로 작동하는 액션. by류 액션들을 그 반대로 작동하게 하는 액션이다. sequence등의 액션에도 적용할 수 있다. 단, To 류와 같은 절대값으로 이동하게 하는 액션에는 적용되지 않는다.

auto act = MoveBy::create( 2.0f, Vec2(280, 0) );

auto reverse = act->reverse();  

//act와 반대로 동작하는 reverse라는 액션 생성



4) DelayTime

정해진 시간동안 아무 동작을 하지않고 대기하는 것.

auto act = DelayTime::create(3.0f);

//3초동안 대기하는 act생성



5) RemoveSelf

이 액션을 동작하는 객체 자체를 지우는 액션.

기존에 추가된 스프라이트 등을 지우려면 this->remove( 스프라이트 ); 등으로 지워야했지만,

Sequence와 RemoveSelf 액션을 통해 특정 동작이 끝난 뒤 자체적으로 제거되도록 할 수 있다.

spr1->runAction( Sequence::create(MoveTo::create(3.0f, Vec2(380, 100)), RemoveSelf::create(), NULL ) );

//380, 100 좌표로 이동한 뒤 삭제됨



6) Repeat / RepeatForever

지정한 액션을 지정한 횟수만큼 반복함. 

단, RepeatForever같은 경우는 Sequence의 내부에 사용될 수 없다.

(무한히 반복하면 순차실행이 안되기때문)


Repeat::create( 반복할 액션(유한횟수), 반복할 횟수 );

RepeatForever::create( 반복할 액션 );



7) ease In/Out

가속/감속의 효과를 주는 액션.

In은 처음에 느렸다가 뒤로 갈수록 빨라짐

Out은 처음에 빨랐다가 뒤로 갈수록 느려짐

InOut은 점점빨라지다가 점점 느려짐

Ease: 기본 효과. 속도 차이의 정도를 직접 두번째 파라미터로 넘겨줘야 함.

EaseSine : 속도가 완만하게 변함. 

EaseExponential : 속도가 급격하게 변함.

EaseElastic : 고무줄을 튕기는 듯한 효과를 주며 감.

EaseBack : 목표지점보다 조금 더 뒤로 갔다가 돌아옴.

EaseBounce: 원지점에서 점점 튕기며 목표위치로 감.


:
Posted by 웽웽

1) Scale

대상의 크기를 변화시키는 액션. 

대가 되는 기준점은 Anchor point이다.

ScaleTo의 경우는 현재 크기와 상관없이 지정한 크기로 변화시킴.

ScaleBy의 경우는 현재의 크기를 기준으로 지정한 수치만큼 크기를 변화시킴.


auto action1 = ScaleTo::create(3.0f, 4);

//현재 크기와 상관없이 지정한 크기로 변화

auto action2 = ScaleBy::create(3.0f, 2);

//현재 크기에서 두배를 더 키움



2) Rotate

대상을 회전하게 하는 액션.

회전의 기준점은 Anchor point이다.

RotateTo의 경우, 현재 각도에서 지정한 각도로 갈 수 있는 가장 빠른 경로로 가기 때문에, 180~360사이의 각도를 입력할 경우에 반대로 회전하게 된다.

RotateBy의 경우는 현재 각도에서 지정한 각도만큼 회전을 하게 된다.


auto act = RotateTo::create(3.0f, 360);

//현재 상태에서 해당하는 각도로 회전시킴

auto act = RotateBy::create(3.0f, 360);

//현재 상태에서 지정한 각도만큼 회전시킴



3) Show

대상을 보이게 하는 메소드

대개 setVisible과 크게 다를바없어서 잘 안쓰임...?



4) Blink

대상을 지정한 시간만큼 지정한 횟수동안 깜빡이게 하는 메소드

auto act = Blink::create(3, 10);

//3초동안 10회 깜빡이게 함



5) Fade

투명도를 변화시키는 효과. 대부분의 게임에서 빠지지않고 쓰이는 효과.

FadeIn은 서서히 나타나게 하는 효과. FadeOut은 서서히 사라지는 효과.

현재 투명도에서 각각 0, 255로 서서히 변화함. (0-투명하지 않음. 255-투명함)

setOpacity()를 이용하여 투명도를 조절해준 대상은 그 상태에서 지정한 상태로 변화한다.

FadeTo는 setOpacity()와 거의 비슷한 기능. 단지 시간에 걸쳐 서서히 변화하는 것이 다르다.

auto act = FadeIn::create(3.0f);

//현재 투명도에서 0으로 변화

auto act = FadeOut::create(3.0f);

//현재 투명도에서 255로 변화

auto act = FadeTo::create(3.0f, 128);

//3초동안 투명도를 128로 변화



6) Tint
색상을 변화시키는 효과.

TintTo : 시간에 걸쳐 지정한 색상으로 서서히 변함.

TintBy : 시간에 걸쳐 처음에 지정한 색상이 빠져있다가 서서히 원래 색상으로 돌아옴.

auto act = TintTo::create(3.0f, 255, 0, 0);

//천천히 색깔이 빨간색으로 바뀜

auto act = TintBy::create(3.0f, 0, 255, 255);

//빨간색이었다가(G, B가 다 빠져있음) 서서히 원래대로 돌아옴.

:
Posted by 웽웽

먼저 실행할 액션을 선언한 다음, 액션을 실행할 스프라이트에 runAction을 통해 적용해준다.

대개 액션에는 To와 By가 있는데, To는 절대좌표를, By는 현재 위치에서의 상대좌표를 의미한다.


1) Move

auto act = MoveTo::create(2.0f, Vec2(300, 250));

// ( 지속시간, 좌표값 )



2) Jump

auto act = JumpTo::create(2.0f, Vec2(300, 250), 30, 10);

// ( 지속시간, 좌표값, 점프 높이, 점프 횟수 )



3) Bezier

Bezier 곡선을 따라서 이동하는 함수. 액션을 생성하기전에 Control Point에 대한 설정이 필요하다.

ccBezierConfig config;            //control point설정을 위한 ccBezierConfig 선언

config.controlPoint_1 = Vec2(200, 300);

config.controlPoint_2 = Vec2(300, 250);

config.endPosition = Vec2(350, 100);


auto act = BezierTo::create(2.0f, config);



4) Place

지정한 좌표로 대상을 즉각이동시킴.

auto act = Place::create(Vec2(380, 100));

:
Posted by 웽웽