달력

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

HelloWorldScene.h




HelloWorldScene.cpp



코드 파일

:
Posted by 웽웽

연속해서 생성되는 데이터들을 관리하기에는 vector가 좋다.


HelloWorldScene.h




HelloWorldScene.cpp


:
Posted by 웽웽

- about SoundEffect

mp3 는 용량은 작지만 압축률이 높고, wav는 용량은 크지만 압축률이 낮다.

압축률이 높으면 (미세하지만)로딩시간이 길기 때문에, 한번 로딩하는 BGM은 보통 mp3을 사용하고, 수시로 출력되는 효과음은 wav파일을 사용한다. 안드로이드는 ogg를 이용할수도 있지만 특별한 경우가 아니면 그냥 위에 대로 쓴다.


첫 사운드 효과(배경음, 효과음)가 출력될 때, 사운드 캐시에 올라가기 때문에 같은 음을 출력시에는 캐시를 먼저 확인한 뒤, 존재하면 바로 끌어다쓰는 식으로 하기 때문에 중복로딩으로 부하가 생기거나 하진 않는다.



- 사운드 효과 사용하기

:
Posted by 웽웽

해상도 640*480

HelloWorldScene.h



HelloWorldScene.cpp



소스 파일


+ 파티클 효과는 눈에는 사라진 것처럼 보이지만 보이지않을 뿐, 메모리는 가지고 있다.

그렇기 때문에 지속적으로 생기는 효과들은 효과 종료 후 메모리 해제(remove)를 해주어야 한다.

:
Posted by 웽웽

+ 같은 이미지를 여러번 로딩하는 거는 예전에 비해 부하가 많이 적다.


배경 스크롤 방법


1) 레이어를 만들어 같은 이미지를 이어붙이기

레이어를 생성한 뒤, 거기에 동일한 스프라이트 이미지를 이어붙인 뒤 스크롤.



2) ParallaxNode 이용

배경 스크롤을 위해 사용되는 노드.


:
Posted by 웽웽

P.243

Schedule (*중요)

cocos의 타이머와 같은 개념. Layer가 가지고 있는  method.

CC_CALLBACK_n을 쓰지 않고, schedule_selector를 사용함.


void callback(float delta);

여기서 delta는 해당 함수가 호출되는 타이머들 간의 호출 시간이다.


cocos의 메인타이머 - appDelegate.cpp

schedule은 메인 타이머에 종속적이기 때문에, 메인타이머의 interval보다 짧은 schedule은 존재할 수 없다.


싱글 게임에서는 크게 상관없지만, 온라인 게임에서는 이 delta를 이용해서 계산(이동거리 등)하는 용도 등에 중요하게 작용한다.


this->schedule(schedule_selector(HelloWorld::callback), 1.0f, 5, 3.0f);

//총 6번 호출(3.0f 기다리는거 1회, 1.0f 5회)

//( 호출 함수, 호출 간격, 호출 횟수, 딜레이 타임(시작전까지) )

//간격 없을 시 main timer과 동일, 횟수 없을 시 무한반복, 딜레이 없을시 바로 시작

//schedule_selector을 통해 불릴 함수는 무조건 float delta를 받아야한다.


this->scheduleOnce(schedule_selector(HelloWorld::callback), 3.0f);

//3초 대기 후, 한번만 호출


this->scheduleUpdate();

//특별한 인자 없이 update()라는 메소드를 호출하는 함수. 항상 들어간다고 보면 됨.

//여기에서 동기화 등을 해주는 것 같다.



스케줄 해제

this->unscheduleUpdate();

this->unscheduleAllSelectors();

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

:
Posted by 웽웽

게임 애니메이션에 쓰이는 Sprite들은 하나의 이미지 파일에 뭉쳐서 사용한다.(리소스 절약)

연속된 애니메이션을 구성하는 이미지를 Texture Packer등으로 합칠 수 있다. 

이렇게 만들어진 이미지를 아틀라스 이미지 라고 부른다.

링크 : https://www.codeandweb.com/texturepacker/start-download?os=win&bits=64


다른 것들은 웬만하면 건들지 말고, 합친 그림파일의 사이즈와 Data와 Texture의 경로만 지정해주고,

이 Texture Packer를 이용해서 스프라이트들을 묶으면, 2개의 파일이 나온다.

1) 합쳐진 .png파일

2) 합쳐진 파일 내의 각 그림들의 이름과 위치(좌표)가 담긴 .plist파일(plist == Property List)


 + plist는 Mac에서 많이 쓰는 데이터 형식. Windows에서의 XML과 비슷한 유형이다.

plist View같은 파일도 있다. 하지만 별로 쓸 일은 없다.

plist를 framecache에 등록한다. 그러면 해당 plist에 등록된 파일이 전부 cache에 올라간다.

- HelloWorldScene.cpp



 - 사용법

1) 스프라이트 생성


2) Animation

 - Delay time : 간격시간 설정

 - Add Frame : 프레임 추가


3) Animate

 - Animation : 액션형


4) spr->runAction( animation );



SpriteFrameCache에 등록한 plist는 SpriteFrameCache자체에 등록되어 SpriteFrameName 관련 메소드로 불러와서 사용할 수 있다.

 ex)




객체가 행하고 있는 액션을 멈추는 메소드

stopAllAction()            //현재 객체가 실행중인 모든 액션을 멈춤

stopActionByTag()       //현재 객체가 실행중인 특정 액션을 멈춤



예제 - HelloWorldScene.cpp



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

[D_011] 배경 스크롤 - Layer  (0) 2014.11.25
[D_010] Schedule  (0) 2014.11.24
[D_009] 카드 게임  (0) 2014.11.21
[D_008] Layer - LogoLayer 예제  (0) 2014.11.20
[D_008] Scene전환 - replace / push,pop  (0) 2014.11.20
:
Posted by 웽웽

MenuScene.h


MenuScene.cpp


GameScene.h


GameScene.cpp


AppDelegate.cpp


AppDelegate.h


GameScene.cpp


GameScene.h


MenuScene.cpp


MenuScene.h




============================================

main, retry추가한 완성본



//카드의 수와 카드 줄 수를 지정하면 알아서 거기에 맞게 줄세워서 정렬시키는 방법 강구

:
Posted by 웽웽

Scene과 무관하게 항상 그위치에 똑같이 존재하는 것(ex. 로고)은 각 Scene마다 매번 추가해주는 것은 비효율적이기 때문에, Layer로 따로 만들어서 사용하는것이 편하다.

LogoLayer 예제


LogoLayer.h



LogoLayer.cpp



1) Scene에서 LogoLayer로 접근하기

layer 추가시에 setTag해준 다음, 이를 이용하여 자식의 객체에 접근 가능



2) LogoLayer에서 Scene으로 접근하기

getParent()함수를 통해 부모의 포인터에 접근. getParent()는 태그같은거 없다.


MenuScene.h


MenuScene.cpp



LogoLayer.h


LogoLayer.cpp


:
Posted by 웽웽

모든 Scene의 관리는 Director가 한다.

runWithScene( Scene ) : 해당하는 Scene을 불러온다.


1) replaceScene

A scene에서 B scene을 할 때, B를 불러온 뒤 A를 제거함.



2) push/pop Scene

A scene에서 B scene을 부르려면, A위에 B를 push한다. 즉, 덮어씌우는 형식.

다시 A를 불러오려면 B를 pop하면 된다.

하지만 push/pop은 생각보다 잘 안쓴다.


대부분의 작업은 replaceScene을 사용한다.


- A->B로 씬 전환시(replace) 호출 순서

A클래스 생성자 -> init() -> A onEnter()

- B Scene호출시(replace)

B클래스 생성자 -> B init() -> A onExit() -> A클래스 소멸자 -> B onEnter()

//replaceScene이 불리면, 대체할 씬이 생성완료된 다음, 대상 씬을 소멸시킨뒤에 대체한다.


+ 화면전환효과에 따라 순서가 달라질 수도 있다.

onEnter()는 해당 Scene이 화면에 보이는 순간이라고 보면 된다.



:
Posted by 웽웽