viewimage.php?id=2abcdd23dad63db0&no=29bcc427bd8077a16fb3dab004c86b6f24b7e12241bb1d94d186efcd26b80d8ac216395fc277e6ff961b95318817c281330a5b5d0195f54abdb7


cocos2d-x 의 κ²½μš°μ—λŠ” μŠ€ν”„λΌμ΄νŠΈμ™€ 같은 Node의 μ• λ‹ˆλ©”μ΄μ…˜μ„ λ§Œλ“€μ–΄μ„œ runAction ν•¨μˆ˜λ‘œ 돌릴 수 μžˆλŠ”λ°,

이 λ•Œ runAction ν•¨μˆ˜μ—λŠ” 일반 μ• λ‹ˆλ©”μ΄μ…˜ 객체 뿐만 μ•„λ‹ˆλΌ Callback ν•¨μˆ˜κΉŒμ§€ λ„£μ–΄μ„œ 돌릴 수 있음. (C++0xλΆ€ν„° μΆ”κ°€λœ λžŒλ‹€λ‘œλ„ κ°€λŠ₯)

이걸둜 μ• λ‹ˆλ©”μ΄μ…˜μ΄ λλ‚˜λ©΄ 뭘 ν•œλ‹€λ˜κ°€, μ•„λ‹ˆλ©΄ μ• λ‹ˆλ©”μ΄μ…˜κ³Ό λ™μ‹œμ— 무슨 μž‘μ—…μ„ μ§„ν–‰ν•˜κ²Œ ν•œλ‹€λ˜κ°€ ν•˜λŠ”κ²Œ κ°€λŠ₯해짐.


viewimage.php?id=2abcdd23dad63db0&no=29bcc427bd8077a16fb3dab004c86b6f24b7e12241bb1d94d186efcd26b80d8ac216395fc277e6ff961b95318817c182b972c524b3180ce0a34d


근데 λ‚˜κ°™μ€ κ²½μš°μ—λŠ” λ°°ν‹€ μ‹œμ— 각 μΊλ¦­ν„°λ§ˆλ‹€μ˜ 기술 μ‹œμ „ λ™μž‘μ΄ λ³„λ„λ‘œ 있고, μ‹œμ „ 도쀑에 데미지 λœ¨λŠ”κ²Œ μ—¬λŸ¬λ²ˆ 뜨게 ν•˜κ³  싢기도 ν•˜κ³  그럼.

κ·Έλž˜μ„œ ν•œ 기술 λ™μž‘λ§ˆλ‹€ 클래슀λ₯Ό ν•˜λ‚˜μ”© λ§Œλ“€μ–΄μ„œ 거기에 λ§žλŠ” μ• λ‹ˆλ©”μ΄μ…˜ '듀을' κ·ΈλŒ€λ‘œ ν•˜λ“œμ½”λ”©μœΌλ‘œ λ°•μ•„λ„£λŠ”λ‹€λ˜κ°€ ν•˜λŠ”κ±΄ 쑸라 μ½”λ“œ 낭비이기도 ν•˜κ³ 

κΈ°μˆ μ μœΌλ‘œλ„ 잘 μ •λˆλ˜μ§€ λͺ»ν•œ 것 κ°™μ•„μ„œ μ΄λ²ˆμ— μ’€ λ‚˜λ¦„ κ³ λ―Όν•˜λ©΄μ„œ μƒκ°ν•΄λ‚Έκ²Œ μ• λ‹ˆλ©”μ΄μ…˜μ„ 담은 Queue 을 μ΄μš©ν•˜λŠ” κ±°μ˜€μŒ.


μ• λ‹ˆλ©”μ΄μ…˜ λ˜λŠ” Callback 이 될 수 μžˆλŠ”κ±Έ Queue 에 박아넣은 λ‹€μŒμ— 트리거λ₯Ό κ±Έμ–΄μ„œ ν•œ μ• λ‹ˆλ©”μ΄μ…˜μ΄ λλ‚˜λ©΄

μ½œλ°±μ΄λ‚˜ ν•¨μˆ˜ 호좜둜 큐둜 κ·Έ λ’€μ˜ μš”μ†Œλ₯Ό κΊΌλ‚΄μ„œ μ‹€ν–‰ν•  수 μžˆλ„λ‘ ν• λ €κ³  ν–ˆμŒ. 이 λ•Œ std::function μ΄λΌλ˜κ°€ std::bind 을 μ΄μš©ν•΄μ„œ ν•œλ²ˆ ν•΄λ΄€λŠ”λ°,


viewimage.php?id=2abcdd23dad63db0&no=29bcc427bd8077a16fb3dab004c86b6f24b7e12241bb1d94d186efcd26b80d8ac216395fc277e6ff961b95318817c3862bcd4def0dcf73dbb754


viewimage.php?id=2abcdd23dad63db0&no=29bcc427bd8077a16fb3dab004c86b6f24b7e12241bb1d94d186efcd26b80d8ac216395fc277e6ff961b95318817cb8312a8a7617f74de9911f2


근데 λ‹€λ₯Έ κ°μ²΄μ—μ„œ μ• λ‹ˆλ©”μ΄μ…˜μ΄ λλ‚œ 뒀에 λ‹€λ₯Έ 객체에 μ €μž₯ν•œ μ½œλ°±μ„ ν˜ΈμΆœν•΄μ„œ 큐의 λ§ˆμ§€λ§‰ μœ„μΉ˜μ— 바인딩 λ˜μ–΄μžˆλŠ” 콜백 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν• λ €κ³  ν•˜λ‹ˆκΉŒ

0xDDDDDDDD 의 λ§€μ§λ„˜λ²„ 였λ₯˜κ°€ 뜨고 ν¬λž˜μ‹œκ°€ λ‚˜κ²Œ 됨. μ™œμΈκ°€ μ‹Άμ–΄μ„œ ν•œλ²ˆ μ’€ 고민을 ν•΄λ΄€λŠ”λ°...


viewimage.php?id=2abcdd23dad63db0&no=29bcc427bd8077a16fb3dab004c86b6f24b7e12241bb1d94d186efcd26b80d8ac216395fc277e6ff961b95318817c6d19753977ef3c34393d8e3


viewimage.php?id=2abcdd23dad63db0&no=29bcc427bd8077a16fb3dab004c86b6f24b7e12241bb1d94d186efcd26b80d8ac216395fc277e6ff961b95318817c6d262ada9ce3f777f6f9414


이게 μœ„μ˜ anim_list 에 넣을렀고 ν•˜κ³  μžˆλŠ” fun0, func, end_ 에 μ½œλ°±μ„ μ €μž₯ν•˜κ²Œλ” ν•˜λŠ” ANIM_CALLBACK 맀크둜 ν•¨μˆ˜κ°€ ν”„λ ˆμž„μ›Œν¬μ— μ˜μ‘΄μ μ΄λΌμ„œ

cocos2d-x 의 ν”„λ ˆμž„μ›Œν¬μ— μ˜ν•΄μ„œ ν•œλ™μ•ˆ 쓰이지 μ•ŠμœΌλ©΄ GC λ˜μ–΄λ²„λ¦¬λŠ”κ²Œ μ•„λ‹κΉŒ μƒκ°ν•˜κ²Œ 됨.

κ·Έλž˜μ„œ GC λ˜μ§€ μ•Šκ³  λ°”λ‘œλ°”λ‘œ μ“Έ 수 μžˆλ„λ‘ μ•½κ°„ 우회둜λ₯Ό λ§Œλ“€μ–΄λ³΄κΈ°λ‘œ ν–ˆμŒ.


viewimage.php?id=2abcdd23dad63db0&no=29bcc427bd8077a16fb3dab004c86b6f24b7e12241bb1d94d186efcd26b80d8ac216395fc277e6ff961b9531881794d77804c31edcba6c90b93c


μš°μ„  anim_list λŠ” FiniteTimeAction* μ΄λΌλŠ” 말 κ·ΈλŒ€λ‘œ Action 객체의 포인터λ₯Ό μ €μž₯ν•˜λŠ” λ¦¬μŠ€νŠΈμž„.

일반 μ• λ‹ˆλ©”μ΄μ…˜ 뿐만이 μ•„λ‹ˆλΌ, Callback λ˜ν•œ 여기에 κΌ¬λΌλ°•μœΌλ©΄

FiniteTimeAction* >> ActionInstant* >> FiniteTimeAction* 으둜 μ•”λ¬΅μ μœΌλ‘œ ν˜•λ³€ν™˜μ΄ λ˜λŠ” 것 κ°™μŒ.


밑에 λ§Œλ“  anim_list2 κ°€ μ΄λ²ˆμ— κ³ μΉ˜λ©΄μ„œ λ§Œλ“  queue 인데, 이건 Aciton* 자체λ₯Ό μ €μž₯ν•˜λŠ”κ²Œ μ•„λ‹ˆλΌ, κ·Έ μ΄μ „μ˜ ν˜•νƒœμΈ

std::function<void()> == ν•¨μˆ˜ν¬μΈν„° λ₯Ό μ €μž₯ν•˜λŠ” queue μž„. μ™œ ν•¨μˆ˜ν¬μΈν„°λ₯Ό μ•ˆμΌλƒ ν•˜λ©΄ ν•¨μˆ˜ν¬μΈν„°λŠ” static만 λ˜λ‹ˆκΉŒ.


viewimage.php?id=2abcdd23dad63db0&no=29bcc427bd8077a16fb3dab004c86b6f24b7e12241bb1d94d186efcd26b80d8ac216395fc277e6ff961b95318817c0d9ae698c000f6d1f2ceb2d


그리고 μ• λ‹ˆλ©”μ΄μ…˜μ„ μ„€μ •ν•  λ•ŒλŠ” std::bind() 을 μ΄μš©ν•΄μ„œ std::function<> 꼴의 ν˜•νƒœλ₯Ό λ§Œλ“€μ–΄μ€¬μŒ. λ¬Όλ‘  ANIM_CALLBACK μ΄λž‘ 같이

λ°”μΈλ”©ν•΄μ£ΌλŠ”κ±΄ 같은데, λ‹€λ₯Έ 점은 μ „μ—κΊΌλŠ” ν”„λ ˆμž„μ›Œν¬μ— λ¬Άμ—¬μžˆκ³  μ§€κΈˆκ±°λŠ” κ·Έλƒ₯ 바인딩 λ˜μ—ˆμ„ 뿐이지 μ½”μ½”μŠ€μ— λ¬Άμ—¬μžˆμ§€ μ•ŠμŒ..


그리고 μ• λ‹ˆλ©”μ΄μ…˜μ„ μ΅μŠ€νμ…˜ ν•΄μ£ΌλŠ” μœ„μ˜ ν•¨μˆ˜μ—μ„œλŠ” 큐에 μžˆλŠ”κ±Έ λ°›μ•„μ„œ, FiniteTimeAction* 꼴둜 λ°”λ‘œ λ§Œλ“€μ–΄μ£Όλ©΄μ„œ runAction 해쀬기 λ•Œλ¬Έμ—

GC에 μ˜ν•΄μ„œ ν•΄μ œλ  염렀도 μ—†κ²Œ λ˜μ—ˆμŒ.... μ•„λ§ˆλ„ GC에 μ˜ν•΄μ„œ ν•΄μ œλ  μ—Όλ €κ°€ μ—†μ„κ±°μž„ γ…Žγ…Žγ…Ž;;;;;;


μž‘μ„€ 끝.


+ κ·Έλƒ₯ λŒ€μΆ© 휘갈겨 μ“΄ 글이라 κ·ΈλŸ°μ§€ λ‚΄κ°€ 봐도 λ­” 글인지 λͺ°κ² λ‹€... γ…Žγ…Žγ…Žγ…‹γ…‹γ…‹ γ……γ…‚

5쀄 μš”μ•½.

1. μ „νˆ¬μ—μ„œ 기술 μ“Έ λ•Œ, μ—¬λŸ¬κ°€μ§€ λ‹€μ–‘ν•œ μ• λ‹ˆλ©”μ΄μ…˜μ„ λ•Œλ €λ°•μ•„ λŒλ¦¬λŠ”κ±Έ μœ μ—°ν•˜κ²Œ ν•˜κ³  μ‹Άμ—ˆμŒ.

2. λ˜ν•œ, μ• λ‹ˆλ©”μ΄μ…˜μ΄ 끝날 λ•Œ μ‹œμ μœΌλ‘œ νŠΉμ • μž‘μ—…μ΄ μ²˜λ¦¬λ˜λŠ” 것도 κ΅¬ν˜„ν•˜κ³  μ‹Άμ—ˆμŒ.

3. 콜백과 Queue 을 μ¨μ„œ ν•˜λ‚˜ν•˜λ‚˜μ”© μ• λ‹ˆλ©”μ΄νŠΈ ν•˜λ„λ‘ ν•˜μž.

4. 근데... CallFunc::create 을 μ΄μš©ν•΄μ„œ λ°”λ‘œ queue 에 μ§‘μ–΄λ„£μœΌλ©΄ κ²½μš°μ— 따라 GC μ²˜λ¦¬κ°€ λ˜μ–΄λ²„λ¦¬λ„€? μ•ˆλ˜λ„€?

5. 그러면 걍 κ·Έ 이전 ν˜•νƒœμΈ ν•¨μˆ˜ν¬μΈν„° ν˜•νƒœλ‘œ μ§‘μ–΄λ„£μ–΄μ„œ GC 영ν–₯ꢌ 밖에 있게 ν•˜κ³  ν•˜λ‚˜ν•˜λ‚˜μ”© λ½‘μ•„μ„œ λ°”λ‘œλ°”λ‘œ λ³€ν˜•ν•΄μ„œ μ“°μž.