'cocos2D'에 해당되는 글 11건

  1. 2016.06.15 [Cocos2d-x] Day 11 - Enemy CollisionCheck & Effect 1
  2. 2016.06.14 [Cocos2d-x] Day 10 - Enemy & Enemy_Effect
  3. 2016.06.14 [Cocos2d-x] Day 9 - WALL_DROP
  4. 2016.06.13 [Cocos2d-x] Day 8 - Ladder
  5. 2016.06.13 [Cocos2d-x] Day 7 - Slope Move
  6. 2016.06.12 [Cocos2d-x] Day 6 - Resource Work & Bullet Class, Manager Create
  7. 2016.06.12 [Cocos2d-x] Day 5 - Scroll Map Box & Player Resource Work
  8. 2016.06.09 [Cocos2d-x] Day 4 - BackGround & CameraScroll & File Input And Output
  9. 2016.06.08 [Cocos2d-x] Day 3 - MouseDrag Box Create & RayCast Collision
  10. 2016.06.08 [Cocos2d-x] Day 2 - Create Box / Box CollisionCheck

[Cocos2d-x] Day 11 - Enemy CollisionCheck & Effect

|


 <DAY> 2016.05.27

 < WORK LIST >

 <Class> Object_Enemy.cpp & Enemy_Manager.cpp

 - Enemy CollisionCheck & Position Arrangement & Effect

 - Resource Work

 - State Apply



   1

  Enemy CollisionCehck & Effect


플레이어의 총알과 적 캐릭터의 충돌 체크를 위하여

에너미 매니저에 충돌체크 함수를 하나 만들어 주었다.

매계 변수로는 총알의 위치, 거리, 타입을 받았다.


만들어지지 않았거나, 비활성화 상태인 에너미는 넘기고 만들어져 있는 에너미를 검사한다.

현재 존재하고 있는 에너미의 위치를 가져와서

총알과의 위치와 에너미의 위치를 넘겨주어 거리를 잰다.


두 개의 거리가 매계변수로 받아온 dis보다 작아지면 충돌한 것으로 판단해

에너미 이미지의 색을 바꿔주고 Hit함수로 총알의 타입을 넘겨주어 총알에 타입에 따라서 에너미의 체력을 깎아준다.

덤으로 플레이어의 총알은 사라지면서 이펙트를 뿌려준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
bool Enemy_Manager::CollisionCheck( CGPoint _pos, int _dis, int _Type )
{
    for(int i = 0; i < MAXENEMY; i++ )
    {
        if( m_pEnemy[i] == NULL ) continue;
        if( m_pEnemy[i]->getActive() == FALSE ) continue;
            
        CGPoint pos = m_pEnemy[i]->getPosition();
        VectorInformation vi = ST::call()->Distance( _pos, CGPoint( pos.x, _Type == 2 ? pos.y : pos.y + 120.f) ); // 120
 
 
        if( vi.Distance < _dis )
        {
            // Hit 사운드 추가 예졍.
            ST::call()->EFM.addEffect( _Type == 2 ? CGPoint( _pos.x , _pos.y + 120.f ) : _pos, _Type );
            m_pEnemy[i]->setColor( ccc3( 255100100 ) );
            m_pEnemy[i]->hit( _Type );
            
            return TRUE;
        }
    }
    return FALSE;
}
cs

플레이어 총알의 타입에 따라서 에너미의 체력을 깎아준다.

에너미의 체력이 0보다 작거나 같으면 에너미의 모습을 지워준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Object_Enemy.cpp
 
void Object_Enemy::hit( int _Type )
{
    if( _Type == 0 ) --m_eHP;
    else if( _Type == 1 ) m_eHP -= 2;
    else if( _Type == 2 ) m_eHP -= 3;
 
    if( m_eHP <= 0 )
    {
        this->setActive(false);
        this->setIsVisible(false);
    }
}
cs



타입에 따른 이펙트

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
void Object_Effect::update(float dt)
{
    m_fFrame += dt;
 
    switch( getType() )
    {
        case 0:
            {
                m_iState = PLAYER_SHOT;
 
                if( m_fFrame < 0.1f) this->setDisplayFrame( ChangeAni( m_iState ), 0 );
                else if( m_fFrame < 0.2f) this->setDisplayFrame( ChangeAni( m_iState ), 1 );
                else if( m_fFrame < 0.2f) this->setDisplayFrame( ChangeAni( m_iState ), 2 );
                break;
            }
        case 1
            {
                m_iState = PLAYER_MIDDLE_SHOT;
                if( m_fFrame < 0.1f) this->setDisplayFrame( ChangeAni( m_iState ), 0 );
                else if( m_fFrame < 0.2f) this->setDisplayFrame( ChangeAni( m_iState ), 1 );
                break;
            }
        case 2
            {
                m_iState = PLAYER_FULL_SHOT;
                if( m_fFrame < 0.1f) this->setDisplayFrame( ChangeAni( m_iState ), 0 );
                else if( m_fFrame < 0.2f) this->setDisplayFrame( ChangeAni( m_iState ), 1 );
                break;
            }
        case 3:
            {
                m_iState = ENEMY_BOOM;
                if( m_fFrame < 0.1f) this->setDisplayFrame( ChangeAni( m_iState ), 0 );
                else if( m_fFrame < 0.2f) this->setDisplayFrame( ChangeAni( m_iState ), 1 );
                break;
            }
    }
 
    if( m_fFrame > 0.3f )
    {
        this->setPosition(CGPoint( -10001000 ));
        this->setIsVisible(FALSE);
        this->setActive( FALSE );
        m_fFrame = 0;
    }
}
cs





   2

  Resource Work





SHOT_HIT


MIDDLE_HIT


FULL_HIT



 WORK

IDLE

WALK

ATTACK

DASH

JUMP

DROP

START  

JUMP_ATTACK

DROP_ATTACK

SHOT

MIDDLES_SHOT

FULL_SHOT

WALK_ATTACK

CHAGE_IDLE

CHAGE_WALK

CHAGE_DASH

CHAGE_JUMP

CHAGE_DROP

CHAGE2_IDLE

CHAGE2_WALK

CHAGE2_DASH

CHAGE2_JUMP

CHAGE2_DROP

LADDER_UP

LADDER_DOWN

WALL_DROP

ENEMY_IDLE

ENEMY_WALK

ENEMY_ATTACK

ENEMY_BULLET

ENEMY_BOOM

  New SHOT_HIT

  New MIDDLE_HIT

  New FULL_HIT




   3

  State Apply


Player Shot Effect



 STATE APPLY

IDLE

WALK

ATTACK

DASH

JUMP

DROP

START  

JUMP_ATTACK

DROP_ATTACK

SHOT

MIDDLES_SHOT

FULL_SHOT

WALK_ATTACK

CHAGE_IDLE

CHAGE_WALK

CHAGE_DASH

CHAGE_JUMP

CHAGE_DROP

CHAGE2_IDLE

CHAGE2_WALK

CHAGE2_DASH

CHAGE2_JUMP

CHAGE2_DROP

LADDER_UP

LADDER_DOWN

WALL_DROP

ENEMY_IDLE

ENEMY_WALK

ENEMY_ATTACK

ENEMY_BULLET

ENEMY_BOOM

  New SHOT_HIT

  New MIDDLE_HIT

  New FULL_HIT



평 가

 .난이도 : 보통

 별   점 :  

 한 마디: 같은 소스의 반복이다.





<Progress List> 

 - Camera Scroll 

 - Player Resource Work

 Player OutPut & Animation

 New Player Soht Effect     - <Complete>


<Complete List> 

  - Key Control

  - Gravity Jump

  - MouseDrag Box Create

  - Box CollisionCheck

  - RayCast

  - File Input And Output

  BackGround Output

  - Player Output

  Bullet Output

  - Scroll Map Box

  - Player OutPut & Animation

  - Slope Move

  - Ladder

  Wall_Drop

  Enemy

  Enemy_Effect_Boom

  New Player Soht Effect


And

[Cocos2d-x] Day 10 - Enemy & Enemy_Effect

|


 <DAY> 2016.05.26

 < WORK LIST >

 <Class> Object_Enemy.cpp & Enemy_Manager.cpp

 - Enemy & Enemy_Effect

 - Resource Work

 - State Apply



   1

  ENEMY & Enemy_Effect


Object_Enemy.cpp

Enemy_Manager.cpp

Enemy_Bullet.cpp

EnemyBullet_Manager.cpp


추가 완료.


Object_Hero.cpp

Bullet_Manager.cpp

와 똑같은 부분이기 때문에 적용을 쉽게 했고

따로 설명하진 않겠다.


단지, 플레이어와 적 캐릭터의 차이는 크게 2가지 인데,

첫 번째는

직접 조종하는가?

혼자서 움직이는가?

의 차이가 있고


두 번째는

하나 인가?

여럿인가?

의 차이가 있다.


두 번째 부분같은 경우에는 Bullet_Manager와 다를 것이 없다.


이펙트 부분도 마찬가지다.

Bullet이랑 다를바가 없다.



   2

  Resource Work




ENEMY_IDLE



ENEMY_WALK



ENEMY_ATTACK



ENEMY_BULLET


ENEMY_BULLET_BOOM



 WORK

IDLE

WALK

ATTACK

DASH

JUMP

DROP

START  

JUMP_ATTACK

DROP_ATTACK

SHOT

MIDDLES_SHOT

FULL_SHOT

WALK_ATTACK

CHAGE_IDLE

CHAGE_WALK

CHAGE_DASH

CHAGE_JUMP

CHAGE_DROP

CHAGE2_IDLE

CHAGE2_WALK

CHAGE2_DASH

CHAGE2_JUMP

CHAGE2_DROP

LADDER_UP

LADDER_DOWN

WALL_DROP

  New ENEMY_IDLE

  New ENEMY_WALK

  New ENEMY_ATTACK

  New ENEMY_BULLET

  New ENEMY_BOOM




   3

  State Apply


ENEMY ANIMATION





 STATE APPLY

IDLE

WALK

ATTACK

DASH

JUMP

DROP

START  

JUMP_ATTACK

DROP_ATTACK

SHOT

MIDDLES_SHOT

FULL_SHOT

WALK_ATTACK

CHAGE_IDLE

CHAGE_WALK

CHAGE_DASH

CHAGE_JUMP

CHAGE_DROP

CHAGE2_IDLE

CHAGE2_WALK

CHAGE2_DASH

CHAGE2_JUMP

CHAGE2_DROP

LADDER_UP

LADDER_DOWN

WALL_DROP

  New ENEMY_IDLE

  New ENEMY_WALK

  New ENEMY_ATTACK

  New ENEMY_BULLET

  New ENEMY_BOOM



평 가

 .난이도 : 보통

 별   점 :  

 한 마디: 기술적 난이도는 없고 그냥

할 일이 많았다.





<Progress List> 

 - Camera Scroll 

 - Player Resource Work

 Player OutPut & Animation

 New Enemy                   - <Complete>

 New Enemy_Effect_Boom  - <Complete> 


<Complete List> 

  - New  Key Control

  - Gravity Jump

  - MouseDrag Box Create

  - New  Box CollisionCheck

  - RayCast

  - File Input And Output

  BackGround Output

  - Player Output

  Bullet Output

  - Scroll Map Box

  - New  Player OutPut & Animation

  - Slope Move

  - Ladder

  Wall_Drop

  New Enemy

  New Enemy_Effect_Boom


And

[Cocos2d-x] Day 9 - WALL_DROP

|


 <DAY> 2016.05.25

 < WORK LIST >

 <Class> Object_Hero.cpp

 - WALL_DROP

 - Resource Work

 - State Apply



   1

  WALL_DROP


박스의 옆면의 충돌 중일 때 중력에 의해 떨어지는 힘을 0으로 만들고,

m_fAccelerator  = 0;

점프키가 눌리지 않았다면 플레이어의 y값 좌표를 내려준다.

반대로 충돌중이 아니라면( NULL 이라면 ) 상태를 DROP으로 바꿔준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
            case WALL_DROP:
            {
                if( ST::call()->BM.CollisionCheck( DropSet(), BOX ) == NULL )
                {
                    m_iState = DROP;
                    if( vec.x == 1 ) pos.x -= 20.f;
                    else             pos.x += 20.f;
                }
                else
                {
                    if( ST::call()->BM.Raycast( pos, CGPoint(0,-1), &Hit, m_fAccelerator ) )
                        m_iState = WALK;
 
                    if!m_bJumpKeyPress )
                        pos.y -= 150 * dt;
                    
                    m_fAccelerator = 0;
                }
                break;
            }
cs


 점프 키 제어.

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
        if(GetAsyncKeyState('C') && m_bJumpKeyPress == FALSE )
        {
            if( m_iState != DROP        && 
                m_iState != JUMP        &&
                m_iState != CHAGE_JUMP  &&
                m_iState != CHAGE2_JUMP &&
                m_iState != CHAGE_DROP  &&
                m_iState != CHAGE2_DROP &&
                m_iState != JUMP_ATTACK &&
                m_iState != DROP_ATTACK )
            {
                m_bJumpKeyPress = TRUE;
 
//                ST::call()->SM.play(SND_JUMP);
 
                if( m_bAttackDown )  
                    m_iState = CHAGE_JUMP;
                else if( m_bAttackDown && m_fAttackTimeDlay >= 2.4f )
                    m_iState = CHAGE2_JUMP;
                else                 
                    m_iState = JUMP;
 
                // 대시 점프 시 점프 높이 상승.
                if( m_iPrevState == DASH       ||
                    m_iPrevState == CHAGE_DASH ||
                    m_iPrevState == CHAGE2_DASH ) 
                {
                    m_fAccelerator       = JUMPPOWER + DASH_JUMP_POWER;
                    m_bMoveSpeedIncrease = TRUE;
                }
                else if( m_iPrevState == WALL_DROP )
                {
//                    ST::call()->SM.play( SND_WALL_JUMP );
 
                    m_fAccelerator = JUMPPOWER + 100;
                    if( vec.x == -1 )
                    {
                        pos.x += 45.f;
                        pos.y += 10.f;
                    }
                    else
                    {
                        pos.x -= 45.f;
                        pos.y += 10.f;
                    }
                }
                else
                    m_fAccelerator = JUMPPOWER;
            }
        }
        else if(!GetAsyncKeyState('C')) m_bJumpKeyPress = FALSE;
cs



   2

  Resource Work




WALL_DROP


 WORK

IDLE

WALK

ATTACK

DASH

JUMP

DROP

START  

JUMP_ATTACK

DROP_ATTACK

SHOT

MIDDLES_SHOT

FULL_SHOT

WALK_ATTACK

CHAGE_IDLE

CHAGE_WALK

CHAGE_DASH

CHAGE_JUMP

CHAGE_DROP

CHAGE2_IDLE

CHAGE2_WALK

CHAGE2_DASH

CHAGE2_JUMP

CHAGE2_DROP

LADDER_UP

LADDER_DOWN

  New WALL_DROP




   3

  State Apply


WALL_DROP



 STATE APPLY

IDLE

WALK

ATTACK

DASH

JUMP

DROP

START  

JUMP_ATTACK

DROP_ATTACK

SHOT

MIDDLES_SHOT

FULL_SHOT

WALK_ATTACK

CHAGE_IDLE

CHAGE_WALK

CHAGE_DASH

CHAGE_JUMP

CHAGE_DROP

CHAGE2_IDLE

CHAGE2_WALK

CHAGE2_DASH

CHAGE2_JUMP

CHAGE2_DROP

LADDER_UP

LADDER_DOWN

  New WALL_DROP




평 가

 .난이도 : 보통

 별   점 :  

 한 마디: 플레이어의 상태가 많아서 

조절하기가 조금 난해 했다.





<Progress List> 

 - Key Control

 - Box CollisionCheck

 - Camera Scroll 

 - Player Resource Work

 Player OutPut & Animation

 New Wall_Drop  - <Complete>


<Complete List> 

  - Gravity Jump

  - MouseDrag Box Create

  - RayCast

  - File Input And Output

  BackGround Output

  - Player Output

  Bullet Output

  - Scroll Map Box

  - Player OutPut & Animation

  - Slope Move

  - Ladder

  New Wall_Drop


And

[Cocos2d-x] Day 8 - Ladder

|


 <DAY> 2016.05.24

 < WORK LIST >

 <Class> Object_Hero.cpp

 - Ladder

 - Resource Work

 - State Apply



   1

  Ladder


주인공이 사다리를 타기 위해서

물리적으로 충돌하지 않는 박스를 만들어

주인공이 그 박스에 다으면 사다리가 근처에 있는것으로 간주해

↑↓버튼을 누를수 있게 하였다.


물리적인 충돌을 Collision이라고 한다면

그 반대는 Trigger라고 보면 된다.


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
if(GetAsyncKeyState(VK_UP) )
        {
            if( m_bLadder )
            {
                m_iState  = LADDER_UP;
                pos.y += MoveSpeed;
                vec.y = 1;
 
                if( ST::call()->BM.LadderRaycast( pos, CGPoint( 01 ), &Hit, 100 ) )
                    pos.x = Hit.ObTarget->rc.origin.x + ( Hit.ObTarget->rc.size.width / 2 );
 
                m_fLaderUpTime += dt;
 
                static bool LaderPressUp = FALSE;
                if!LaderPressUp && m_fLaderUpTime > 0.1f )
                {
                    LaderPressUp     = TRUE;
                    m_fLaderUpTime   = 0;
                    m_iLadderUpFrame++;
 
                    if( m_iLadderUpFrame > 4 ) 
                        m_iLadderUpFrame = 1;
                }
                LaderPressUp = FALSE;
            }
        }
 
        if(GetAsyncKeyState(VK_DOWN) )
        {
            if( ST::call()->BM.CollisionCheck( CGPoint( pos.x, pos.y - 2.f ), LADDER ) != NULL && !m_bLadder )
            {
                this->setDisplayFrame( ChangeAni( LADDER_DOWN ),(int)m_fFrame % 5 );
                pos.y = pos.y - 5.f;
            }
 
 
            if( m_bLadder )
            {
                m_iState  = LADDER_DOWN;
                pos.y -= MoveSpeed;
                vec.y = -1;
 
 
                if( ST::call()->BM.LadderRaycast( pos, CGPoint( 0-1 ), &Hit, 100 ) )
                    pos.x = Hit.ObTarget->rc.origin.x + ( Hit.ObTarget->rc.size.width / 2 );
 
                m_fLaderDownTime += dt;
 
                static bool LaderPressDown = FALSE;
                if( m_fLaderDownTime > 0.1f && !LaderPressDown )
                {
                    LaderPressDown     = TRUE;
                    m_fLaderDownTime = 0;
                    m_iLadderDownFrame++;
 
                    if( m_iLadderDownFrame > 4 ) 
                        m_iLadderDownFrame = 1;
                }
                LaderPressDown = FALSE;
            }
        }
cs

기본적으로 사다리가 아니면 ↑↓키를 입력해도 아무런 일도 일어나지 않는다.

사다리 트리거 이벤트가 발생 했을때 플레이어가 ↑↓ 키를 누르면
트리거 박스의 WIDTH값을 구해서 2로 나누고 트리거 박스의 x값을 구해서 서로 더해준다.
그리고 그 값을 플레이어 현재 위치 값 x에 대입해주면 사다리 가운데로 고정되게 된다.


밑의 소스코드는 플레이어가 사다리에 올라가거나 내려가는 상태일때의 소스다.

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
case LADDER_UP:
            {
                if( ST::call()->BM.LadderRaycast( pos, CGPoint( 01 ), &Hit, 100 ) )
                {
                    this->setDisplayFrame( ChangeAni( m_iState ),(int)m_fFrame % m_iLadderUpFrame );
 
                    if( ST::call()->BM.CollisionCheck( pos, LADDER ) != NULL &&
                        ST::call()->BM.CollisionCheck( CGPoint( pos.x, pos.y + 40.f ), LADDER ) == NULL )
                    {
                        pos.y = pos.y + 40.f;
                        m_iState = IDLE;
                    }
                    else if( ST::call()->BM.CollisionCheck( CGPoint( pos.x, pos.y + 20.f ), LADDER ) == NULL )
                    {
                        this->setDisplayFrame( ChangeAni( m_iState ),(int)m_fFrame % 5 );
                        this->setDisplayFrame( ChangeAni( m_iState ),(int)m_fFrame % 6 );
                    }
                }
                break;
            }
        case LADDER_DOWN:
            {
                ST::call()->BM.LadderRaycast( CGPoint( pos.x, pos.y + 30 ), CGPoint( 0-1 ), &Hit, 100 );    
 
                this->setDisplayFrame( ChangeAni( m_iState ),(int)m_fFrame % m_iLadderDownFrame );
 
                if( ST::call()->BM.CollisionCheck( CGPoint( pos.x, pos.y + 30 ), LADDER ) == NULL )
                {
                    m_iState = DROP;
                }
                break;
            }
cs



   2

  Resource Work




LADDER_UP



LADDER_DOWN



 WORK

IDLE

WALK

ATTACK

DASH

JUMP

DROP

START  

JUMP_ATTACK

DROP_ATTACK

SHOT

MIDDLES_SHOT

FULL_SHOT

WALK_ATTACK

CHAGE_IDLE

CHAGE_WALK

CHAGE_DASH

CHAGE_JUMP

CHAGE_DROP

CHAGE2_IDLE

CHAGE2_WALK

CHAGE2_DASH

CHAGE2_JUMP

CHAGE2_DROP

  New LADDER_UP

  New LADDER_DOWN




   3

  State Apply


LADDER_UP & LADDER_DOWN



STATE APPLY

IDLE

WALK

ATTACK

DASH

JUMP

DROP

START  

JUMP_ATTACK

DROP_ATTACK

SHOT

MIDDLES_SHOT

FULL_SHOT

WALK_ATTACK

CHAGE_IDLE

CHAGE_WALK

CHAGE_DASH

CHAGE_JUMP

CHAGE_DROP

CHAGE2_IDLE

CHAGE2_WALK

CHAGE2_DASH

CHAGE2_JUMP

CHAGE2_DROP

  New LADDER_UP

  New LADDER_DOWN




평 가

 .난이도 : 보통

 별   점 :  

 한 마디: 의외로 사다리는 쉬웠다.





<Progress List> 

 - Key Control

 - Box CollisionCheck

 - Camera Scroll 

 - Player Resource Work

 Player OutPut & Animation

 New Ladder  - <Complete>


<Complete List> 

  - Gravity Jump

  - MouseDrag Box Create

  - RayCast

  - File Input And Output

  BackGround Output

  - Player Output

  Bullet Output

  - Scroll Map Box

  - Player OutPut & Animation

  - Slope Move


And

[Cocos2d-x] Day 7 - Slope Move

|


 <DAY> 2016.05.24

 < WORK LIST >

 <Class> Object_Hero.cpp

 - Slope Move

 - Resource Work

 - State Apply



   1

  Slope Move


생각해 보면 간단한 문제다.


Raycast를 바닥으로 쏜다.

Raycast가 true를 반환했을 경우 밑에 박스가 존재하는 것으므로,

박스의 높이( y값 )를 구한다.

그리고 플레이어의 높이( y값 )도 구해서

박스의 높이에서 플레이어의 높이 값을 뺀다.

그 차이가 30픽셀보다 작으면

플레이어의 높이를 박스의 높이 값 + 1값으로 붙여 넣는다.


그렇게 되면 

플레이어는 경사면을 타고 올라가는것 처럼 보이게 된다.


내려가는 경우도 마찬가지다.

플레이어 밑으로 Raycast를 쏘고 박스 및 플레이어의 높이 값을 구한 뒤

그 차이가 100픽셀 보다 작으면

플레이어의 높이를 박스의 높이 + 1값으로 붙여 넣는다.


그리고 이도 저도 아니면 그냥 플레이어를 떨어뜨리면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 if( ST::call()->BM.Raycast( CollsionPos, CGPoint(vec.x, 0), &Hit, 500 ) )
 {
     if( Hit.ObTarget->rc.origin.y + Hit.ObTarget->rc.size.height - pos.y < 30.f )
         pos.y = Hit.ObTarget->rc.origin.y + Hit.ObTarget->rc.size.height + 1;
 }
 else if( ST::call()->BM.Raycast( DropSet(), CGPoint( 0-1 ), &Hit, 500 ) )
 {
     if( pos.y - (Hit.ObTarget->rc.origin.y + Hit.ObTarget->rc.size.height) < 100.f )
         pos.y = Hit.ObTarget->rc.origin.y + Hit.ObTarget->rc.size.height + 1;
 }
 else
 {
      if( ST::call()->BM.CollisionCheck( CGPoint( pos.x, pos.y - 2.f ), BOX ) == NULL )
          m_iState = DROP;                
 }
cs


그 결과는 이러하다.




   2

  Resource Work




WALK_ATTACK


CHAGE_IDLE


CHAGE_WALK



CHAGE_JUMP



CAHGE_DROP



CHAGE_DASH



CHAGE2_IDLE



CHAGE2_WALK



CHAGE2_JUMP



CAHGE2_DROP



CHAGE2_DASH





 Work

IDLE

WALK

ATTACK

DASH

JUMP

DROP

START  

JUMP_ATTACK

DROP_ATTACK

SHOT

MIDDLES_SHOT

FULL_SHOT

  New WALK_ATTACK

  New CHAGE_IDLE

  New CHAGE_WALK

  New CHAGE_DASH

  New CHAGE_JUMP

  New CHAGE_DROP

  New CHAGE2_IDLE

  New CHAGE2_WALK

  New CHAGE2_DASH

  New CHAGE2_JUMP

  New CHAGE2_DROP



   3

  State Apply




WALK_ATTACK


CHAGE_IDLE & CHAGE2_IDLE



CHAGE_WALK & CHAGE2_WALK



CHAGE_DASH & CHAGE2_DASH



CHAGE_JUMP & CHAGE2_JUMP & CHAGE_DROP & CHAGE2_DROP



 State Apply

IDLE

WALK

ATTACK

DASH

JUMP

DROP

START  

JUMP_ATTACK

DROP_ATTACK

SHOT

MIDDLES_SHOT

FULL_SHOT

  New WALK_ATTACK

  New CHAGE_IDLE

  New CHAGE_WALK

  New CHAGE_DASH

  New CHAGE_JUMP

  New CHAGE_DROP

  New CHAGE2_IDLE

  New CHAGE2_WALK

  New CHAGE2_DASH

  New CHAGE2_JUMP

  New CHAGE2_DROP


평 가

 .난이도 : 보통

 별   점 :  

 한 마디: 경사면 이동 부분을 좀더 

다듬는게 좋을 것 같다.


ps 

리소스 작업좀 그만하고 싶다.





<Progress List> 

 - Key Control

 - Box CollisionCheck

 - Camera Scroll 

 - Player Resource Work

 Player OutPut & Animation

 New Slope Move  - <Complete>


<Complete List> 

  - Gravity Jump

  - MouseDrag Box Create

  - RayCast

  - File Input And Output

  BackGround Output

  - Player Output

  Bullet Output

  - Scroll Map Box

  - Player OutPut & Animation

  New Slope Move


And

[Cocos2d-x] Day 6 - Resource Work & Bullet Class, Manager Create

|


 <DAY> 2016.05.23

 < WORK LIST >

 <Class> Object_Hero.cpp & Object_Bullet, Bullet_Manager.cpp

 - Object_Bullet.cpp & Bullet_Manager.cpp Create

 - Resource Work

 - State Apply



   1

  Object_Bullet.cpp & Bullet_Manager.cpp Create


Shot에 이미지를 불러온다.


Object_Bullet.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool Object_Bullet::init()
{
    if!CCSprite::init() ) return false;
 
    this->addAnimation( CreateAnimation( "Resource/Character/SHOT/SHOT_%d.png"                , "SHOT"        , MAX_SHOT          ) );
    this->addAnimation( CreateAnimation( "Resource/Character/MIDDLES_SHOT/MIDDLE_SHOT_%d.png" , "MIDDLESSHOT" , MAX_MIDDLE_SHOT  ) );
    this->addAnimation( CreateAnimation( "Resource/Character/FULL_SHOT/FULL_SHOT_%d.png"      , "FULLSHOT"    , MAX_FULL_SHOT     ) );
 
    m_iState   = SHOT;
    m_iType       = 0;
    m_fFrame   = 0;
    vec           = ccp( 00 );
    this->schedule( schedule_selector( Object_Bullet::update ));
    return true;
}
cs


종류는 

기본공격 ( SHOT )

중간 챠지 공격 ( MIDDLESSHOT )

풀 챠지 공격 ( FULLSHOT )



실질적으로 총알을 관리해주는 클래스다.

Bullet_Manager.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Bullet_Manager::init( Object_BackGround * _Bg )
{
    m_Bg = new Object_BackGround;
    m_Bg = _Bg;
 
    memset( m_pBullet, NULLsizeof(m_pBullet) );
    forint i = 0; i < MAXBULLET; i++ )
    {
        m_pBullet[i] = new Object_Bullet;
        m_pBullet[i]->init();
        m_pBullet[i]->setScale( 2 );
        m_pBullet[i]->setAnchorPoint( ccp( 0.50 ) );
        m_pBullet[i]->setPosition( CGPoint( -1000 ) );
        m_pBullet[i]->setActive(false);
        m_Bg->addChild( m_pBullet[i] );
    }
}
cs

BackGround를 매개변수로 가져와서 총알들을 초기화 해주는 동시에 addChild를 해준다.

요컨데, 플레이어가 공격 버튼을 누를때마다 총알을 만들어 주는 것이 아니라,

미리 정해진 숫자만큼 총알을 만들어 두고 총알의 좌표를 봐꾸어 쓰는 것이다.



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
Object_Bullet * Bullet_Manager::AddBullet( CGPoint _pos, CGPoint _vec, int _Type, int _State )
{
    setPlayerShotType( _Type );
 
    for(int i = 0; i < MAXBULLET; i++)
    {
        if( m_pBullet[i] == NULL ) continue;
        if( m_pBullet[i]->getActive() == FALSE )
        {
            if( _State == JUMP_ATTACK || _State == DROP_ATTACK )
                _pos.y += 25;
        
            _pos.x += 30 * _vec.x;
 
            if( _Type == 0 )      _pos.y += 130;
            else if( _Type == 1 ) _pos.y += 115;
            else if( _Type == 2 ) _pos.y += 0;
 
            if( _vec.x == 1 ) m_pBullet[i]->setFlipX( FALSE );
            else              m_pBullet[i]->setFlipX( TRUE );
 
            m_pBullet[i]->setType( _Type );
            m_pBullet[i]->setPosition( _pos );
            m_pBullet[i]->setDirection( _vec );
            m_pBullet[i]->setActive(TRUE);
            
 
            if( m_pBullet[i]->getIsVisible() == FALSE ) 
                m_pBullet[i]->setIsVisible(true);
            
            return m_pBullet[i];
        }
    }
    return NULL;
}
cs

공격 키를 누를때마다 총알의 설정을 다시 해주는 함수다.



   2

  Resource Work




START



JUMP_ATTACK



 DROP_ATTACK



SHOT



MIDDLES_SHOT



FULL_SHOT






 Work

IDLE

WALK

ATTACK

DASH

JUMP

DROP

  New   START  

  New JUMP_ATTACK

  New DROP_ATTACK

  New   SHOT

  New MIDDLES_SHOT

  New FULL_SHOT



   3

  State Apply




START


JUMP_ATTACK & DROP_ATTACK & SHOT


MIDDLES_SHOT


FULL_SHOT



State Apply

IDLE

WALK

ATTACK

DASH

JUMP

DROP

  New    START 

  New JUMP_ATTACK

  New DROP_ATTACK

  New DROP_ATTACK

  New    SHOT

  New MIDDLES_SHOT

  New  FULL_SHOT



평 가

 .난이도 : 쉬움

 별   점 :  

 한 마디: 어려운 점은 없었다.

리소스 작업은 여전히 고단하다.





<Progress List> 

 - Key Control

 - Box CollisionCheck

 - Camera Scroll 

 - Player Resource Work

 Player OutPut & Animation



<Complete List> 

  - Gravity Jump

  - MouseDrag Box Create

  - RayCast

  - File Input And Output

  BackGround Output

  - Player Output

  Bullet Output

  - Scroll Map Box

  - Player OutPut & Animation


And

[Cocos2d-x] Day 5 - Scroll Map Box & Player Resource Work

|


 <DAY> 2016.05.22

 < WORK LIST >

 <Class> Object_Hero.cpp & Box_Manager.cpp

 - Scroll Map Box

 - Player Resource Work

 - Player Resource Animation Apply



   1

  Scroll Map Box





   2

  Player Resource Work



IDLE


WALK


ATTACK


DASH


JUMP


DROP


 Work

   New    IDLE

   New   WALK

   New  ATTACK

   New   DASH

   New   JUMP

   New   DROP



   3

 Player Resource Animation Apply



Update에서 플레이어 상태에 따른 애니메이션을 setDisplayFrame으로 바꿔준다.

1
2
3
4
5
6
7
8
9
void Object_Hero::update(float dt)
{
    KeyInput(dt);
    StateChange(dt);
    AnimationSpeed(dt);
 
    this->setDisplayFrame( ChangeAni( m_iState ),(int)m_fFrame % FrameCount( m_iState ) );
    if( m_iState != JUMP && m_iState != DROP && m_iState != START && m_iState != ATTACK    ) m_iState = IDLE;
}
cs


setDisplatFrame( 1. 현 상태, 2. 애니메이션의 프레임 );

1. 현 상태

1
2
3
4
5
6
7
8
9
10
11
12
13
14
char * Object_Hero::ChangeAni( int _State )
{
    switch( _State )
    {
        case START:   return "START";
        case IDLE:     return "IDLE";
        case WALK:     return "WALK";
        case JUMP:     return "JUMP";
        case DROP:     return "DROP";
        case DASH:     return "DASH";
        case ATTACK:  return "ATTACK";
    }
    return "x";
}
cs


2. 애니메이션 프레임

1
2
3
4
5
6
7
8
9
10
11
12
13
void Object_Hero::AnimationSpeed( float dt )
{
    switch( m_iState )
    {
        case START:   m_fFrame += dt * 10;   break;
        case IDLE:     m_fFrame += dt * 5;    break;
        case WALK:     m_fFrame += dt * 20;   break;
        case JUMP:     m_fFrame += dt * 5;    break;
        case DROP:     m_fFrame += dt * 5;    break;
        case DASH:    m_fFrame += dt * 15;   break;
        case ATTACK:  m_fFrame += dt * 10;   break;
    }
}
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
int Object_Hero::FrameCount( int _State )
{
    switch( _State )
    {
        case START:  return MAXSTART;
        case IDLE:   return MAXIDLE;
        case WALK:   return MAXWALK;
        case JUMP:   return MAXJUMP;
        case DROP:   return MAXDROP;
        case DASH:   return MAXDASH;
        case ATTACK: return MAXATTACK;
    }
    return -1;
}
cs


상태에 따른 키 제어( WALK)

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
if( m_iState != START )
    {
        if(GetAsyncKeyState(VK_RIGHT))
        {
            vec.x = 1;
            if( m_bMoveSpeedIncrease )
            {
                m_iState == ATTACK   && 
                m_iPrevState == WALK || 
                m_iPrevState == ATTACK ?  pos.x += 0 : pos.x += MoveSpeed + 2;
            }
            else
            {
                m_iState == ATTACK   && 
                m_iPrevState == WALK ||
                m_iPrevState == ATTACK ?  pos.x += 0 : pos.x += MoveSpeed;
            }
 
            if( m_iState != JUMP && m_iState != DROP && m_iState != ATTACK )
                m_iState = WALK;
        }
        if(GetAsyncKeyState(VK_LEFT))
        {
            vec.x = -1;
            if( m_bMoveSpeedIncrease )
            {
                m_iState == ATTACK   && 
                m_iPrevState == WALK || 
                m_iPrevState == ATTACK ?  pos.x -= 0 : pos.x -= MoveSpeed + 2;
            }
            else
            {
                m_iState == ATTACK   && 
                m_iPrevState == WALK ||
                m_iPrevState == ATTACK ?  pos.x -= 0 : pos.x -= MoveSpeed;
            }
 
            if( m_iState != JUMP && m_iState != DROP && m_iState != ATTACK )
                m_iState = WALK;
        }
    }
cs


상태에 따른 키 제어( JUMP )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        // 점프
        static bool JumpKeyPress = false;
        if(GetAsyncKeyState('C') && JumpKeyPress == false )
        {
            if( m_iState != DROP && m_iState != JUMP )
            {
                m_iState       = JUMP;
                JumpKeyPress   = true;
                
                if( m_iPrevState == DASH ) 
                {
                    m_fAccelerator       = JUMPPOWER + DASH_JUMP_POWER;
                    m_bMoveSpeedIncrease = TRUE;
                }
                else 
                    m_fAccelerator = JUMPPOWER;
            }
        }
        else if(!GetAsyncKeyState('C')) JumpKeyPress = false;
cs


상태에 따른 키 제어( DASH )

1
2
3
4
5
6
7
        // 대시
        if(GetAsyncKeyState('V') && m_bOneDash == FALSE )
        {
            if( m_iState != DROP && m_iState != JUMP && m_iState != DASH )
                m_iState = DASH;
        }
        else if(!GetAsyncKeyState('V')) m_bOneDash  = FALSE;
cs


상태에 따른 키 제어( ATTACK )

1
2
3
4
5
6
7
8
9
        // 공격
        static bool AttackPress = FALSE;
        if(GetAsyncKeyState('X') && !AttackPress )
        {
            if( m_iState != JUMP && m_iState != DROP )
                m_iState = ATTACK;
            AttackPress = TRUE;
        }
        if(!GetAsyncKeyState('X')) AttackPress = FALSE;
cs



IDLE



WALK



ATTACK


DASH


JUMP & DROP


State Apply

   New    IDLE

   New   WALK

   New  ATTACK

   New   DASH

   New   JUMP

   New   DROP



평 가

 .난이도 : 쉬움

 별   점 :  

 한 마디: 어려운 점은 없었다.

다만, 작업량이 매우 많았기 때문에

번거로운 점은 있었다.

또, 상태가 하나씩 추가 될때마다 

새로 추가된 상태에 대한 전에 작업 

한 상태에따른 제어를 다시 고쳐야

했던 부분이 매우 번거로웠다.





<Progress List> 

 - Key Control

 - Box CollisionCheck

 - Camera Scroll 

 - New Player Resource Work

 New Scroll Map Box                   - <complete>

 New Player OutPut & Animation   <complete>


<Complete List> 

  - Gravity Jump

  - MouseDrag Box Create

  - RayCast

  - File Input And Output

  BackGround Output

  - New Scroll Map Box

  - New Player OutPut & Animation


And

[Cocos2d-x] Day 4 - BackGround & CameraScroll & File Input And Output

|


 <DAY> 2016.05.21

 < WORK LIST >
 <Class> Object_Hero.cpp & Box_Manager.cpp & Object_BackGround.cpp

 - RayCast Revise

 - File Input And Output

 - BackGround Output & Camera Scroll



   1

  RayCast Revise


만들어진 Box중에 제일 작은 Box의 크기를 저장시켜 그 박스의 크기만큼 RayCast에서 이동시킨다.

1
2
3
4
5
Object_Box * Box_Manager::AddBox( CGRect rc )
{
    if( m_fMinSize > rc.size.width  )    m_fMinSize = rc.size.width  - 1;
    if( m_fMinSize > rc.size.height )    m_fMinSize = rc.size.height - 1;
}
cs


fDistance += m_fMinSize바로 이 부분이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Box_Manager.cpp
 
bool Box_Manager::Raycast( CGPoint _start, CGPoint _vec, RaycastHit *_hit, float _Distance )
{
    for( _hit->fDistance = 0; _hit->fDistance < _Distance; _hit->fDistance += m_fMinSize )
    {
        _start.x += _vec.x;
        _start.y += _vec.y;
 
        Object_Box * p = CollisionCheck( _start );
        if( p == NULL ) continue;
 
        _hit->ObTarget = p;
        return true;
    }
    return false;
}
cs


이렇게 한 이유는 플레이어가 어떠한 크기의 Box와 충돌을 하여도 통과하지 않고 충돌을 일으키게 하기 위함이다.




   2

 File Input And Output

Save

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void Box_Manager::SaveBox()
{
    int Count = 0;
 
    FILE * pFile = fopen( "BoxData.txt""wb" );
    if( pFile == NULL ) return;
 
    forint i = 0; i < MAXBOX; i++)
    {
        if( m_pBox[i] == NULL ) continue;
        if( m_pBox[i]->getActive() == false ) continue;
        Count++;
    }
    fwrite( &Count, sizeofint ), 1, pFile );
 
    forint i = 0; i < MAXBOX; i++)
    {
        if( m_pBox[i] == NULL ) continue;
        if( m_pBox[i]->getActive() == false ) continue;
        fwrite( &m_pBox[i]->rc, sizeof( CGRect ), 1, pFile );
    }
    fclose( pFile );
}
 
cs


Load

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Box_Manager.cpp
 
void Box_Manager::LoadBox( SceneTower * Scene )
{
    int Count = 0;
 
    FILE *pFile = fopen( "BoxData.txt""rb" );
    if( pFile == NULL ) return;
    fread( &Count, sizeofint ), 1, pFile );
    forint i = 0; i < Count; i++)
    {
        fread( &m_Rrc, sizeof( CGRect ), 1, pFile );
        Scene->addChild( AddBox( m_Rrc ) );
    }
    fclose( pFile );
}
cs


Box의 x,y좌표와 Width, Height크기만 저장하고, 게임을 켤때 좌표와 크기를 불러오면서

다시 AddBox해준다. 





   3

 BackGround Output & Camera Scroll


배경 출력을 위한 class 및 함수 생성.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Object_BackGround.cpp
 
#define   MAXBG        4
 
bool Object_BackGround::init()
{
    if!CCSprite::init() ) return false;
    
    char szFileName[256= {0};
    CCSprite *pBg = new CCSprite;
    forint i = 0; i < MAXBG; i++ )
    {
        sprintf_s( szFileName, "Resource/BackGround/BG_%d.png", i );
        pBg = CCSprite::spriteWithFile( szFileName );
        pBg->setScale( 2 );
        pBg->setAnchorPoint( ccp( 00.5f ) );
        if( i == 1 ) pBg->setPosition( ccp(3915 * i, 2 ) );
        else         pBg->setPosition( ccp(3915 * i, 0 ) );
        
        this->addChild( pBg );
    }
    schedule( schedule_selector( Object_BackGround::update ));
    return true;
}
cs


출력된 맵의 확인을 위한 임시 카메라 생성.

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
// Scene_Tower.cpp
 
void SceneTower::BackGroundScroll(float dt)
{
    CGPoint HeroPos = m_pHero->getPosition();
    CGPoint MapPos    = this->getPosition();
 
    float fWorldPosX = HeroPos.x + MapPos.x;
    float fWorldPosY = HeroPos.y + MapPos.y;
    float fMaxPosX   = m_Bga->getContentSize().width - CCDirector::sharedDirector()->getWinSize().width;
    float fMaxPosY   = m_Bga->getContentSize().height - CCDirector::sharedDirector()->getWinSize().height;
 
    if( fWorldPosX > MAXWIDTH ) MapPos.x -= 500.* dt;
    if( fWorldPosX < MINWIDTH ) MapPos.x += 500.* dt;
 
    if( MapPos.x > 0 ) MapPos.x = 0;
//    if( MapPos.x < -fMaxPosY ) MapPos.x = -fMaxPosY;
 
    if( fWorldPosY > MAXHEIGHT ) MapPos.y -= 500.* dt;
    if( fWorldPosY < MINHEIGHT ) MapPos.y += 500.* dt;
//    if( MapPos.y > 0 ) MapPos.y = 0;
//    if( MapPos.y < -fMaxPosY ) MapPos.y = -fMaxPosY;
    
    this->setPosition( MapPos );
}
cs

아직 완성된 카메라는 아니다.
추후에 완성 예정.






평 가

 .난이도 : 보통

 별   점 :  

 한 마디: 파일 입출력을 오랜만에 썼

기 때문에 조금 애 먹었다.





<Progress List> 

 - Key Control

 - Box CollisionCheck

 - New File Input And Output - <Complete List>

 - New BackGround Output    <Complete List>

 - New Camera Scroll


<Complete List> 

  - Gravity Jump

  - MouseDrag Box Create

  - New RayCast

  - New File Input And Output

  New BackGround Output


And

[Cocos2d-x] Day 3 - MouseDrag Box Create & RayCast Collision

|


 <DAY> 2016.05.20

 < WORK LIST >
 <Class> Object_Hero.cpp & Box_Manager.cpp

 - MouseDrag Box Create

 - RayCast Collision

 - Gravity Jump Revise



   1

  MouseDrag Box Create


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
// Scene_Tower.cpp
 
bool SceneTower::init()
{
    this->setIsTouchEnabled(true);
}
 
CGPoint SceneTower::getMousePos( NSSet *_pTouches, UIEvent *_pEvent )
{
    CCTouch * pTouch = (CCTouch*)_pTouches->anyObject();
    CGPoint   pos    = pTouch->locationInView(pTouch->view());
    CGPoint   tpos   = CCDirector::sharedDirector()->convertToGL(pos);
 
    return tpos;
}
 
void SceneTower::ccTouchesBegan( NSSet *pTouches, UIEvent *pEvent )
{
    CGPoint pos = getMousePos( pTouches, pEvent );
    startPoint  = pos;
}
 
void SceneTower::ccTouchesMoved(NSSet *pTouches, UIEvent *pEvent)
{
    CGPoint pos = getMousePos( pTouches, pEvent );
}
 
void SceneTower::ccTouchesEnded( NSSet *pTouches, UIEvent *pEvent )
{
    CGPoint pos = getMousePos( pTouches, pEvent );
 
    CGRect rc;
    rc.origin = startPoint;
    rc.size   = CGSizeMake( pos.x - startPoint.x , pos.y - startPoint.y );
 
    this->addChild( ST::call()->BM.AddBox( rc ) );
}
cs






   2

 RayCast Collision



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Box_Manager.cpp
 
bool Box_Manager::Raycast( CGPoint _start, CGPoint _vec, RaycastHit *_hit, float _Distance )
{
    for( _hit->fDistance = 0; _hit->fDistance < _Distance; _hit->fDistance += _Distance * 0.0005f )
    {
        _start.x += _vec.x;
        _start.y += _vec.y;
        
        Object_Box * p = CollisionCheck( _start );
        if( p != NULL )
        {
            _hit->ObTarget = p;
            return true;
        }
    }
    return false;
}
 
cs





   3

 Gravity Jump Revise


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Object_Hero.cpp
 
case DROP:
{
    m_fAccelerator += GRAVITY * dt;
    ST::call()->BM.Raycast( pos, CGPoint(0-3.f), &Hit, m_fAccelerator );
    pos.y          -= Hit.fDistance;
 
    if( Hit.fDistance < 0.1f )
    {
        m_fAccelerator = 0;
        m_iState       = IDLE;
    }
    break;
}
 
cs



평 가

 .난이도 : 보통

 별   점 :  

 한 마디: 충돌과 관련된 RayCast를 만

듬으로써 충돌의 선택지가 넓어지게 

되었다. 




<Progress List> 

 - Key Control

 - Gravity Jump -> <Complete List>

 - Box Create -> MouseDrag Box Create -> <Complete List>

 - Box CollisionCheck


<Complete List> 

  - Gravity Jump

  - MouseDrag Box Create

  - No Data

  - No Data






And

[Cocos2d-x] Day 2 - Create Box / Box CollisionCheck

|


 <DAY> 2016.05.19

 < WORK LIST >
 <Class> Object_Box.cpp & Box_Manager.cpp

 - Box Create & Box CollisionCheck

 - Box_Manager.h & Box_Manager.cpp

 


   1

  Box Create & Box CollisionCheck

충돌 체크 함수

1
2
3
4
5
6
7
bool Object_Box::CollisionCheck( CGPoint _pos )
{
    CGRect rc;
    rc.origin = ccp( this->getPosition().x, this->getPosition().y );
    rc.size   = CGSize( 100100 );
    return CGRect::CGRectContainsPoint( rc, _pos );
}
cs


박스 이미지 생성

그리고, 충돌체크 함수를 하나 만들었다.

기본적으로 박스의 위치, 사이즈가 들어있다.

매개 변수로는 플레이어의 위치를 받는다.

1
2
3
4
5
6
7
8
9
bool Object_Box::init( CGSize _size )
{
    if!CCSprite::initWithFile("TestImage/BOX.png") ) return false;
 
    this->setAnchorPoint( ccp(0,0) );
    this->setScaleX( _size.width / 100 );
    this->setScaleY( _size.height / 100 );
    return true;
}
cs



   2

  Box_Manager.h & Box_Manager.cpp


여러개의 박스를 관리하기 위한 박스 매니저 클래스 생성.

1
2
3
4
5
6
7
8
9
10
#define MAXBOX    50
 
class Box_Manager : public CCSprite{
public:
    Object_Box * m_pBox[MAXBOX];
 
    void init(){ memset( m_pBox, NULLsizeof(m_pBox) ); }
    Object_Box * AddBox( CGPoint _pos );
    Object_Box * CollisionCheck( CGPoint _pos );
};
cs


AddBox 함수를 만들어서 씬_타워 init에서 박스를 추가한다.

화면에 실질적으로 박스가 추가된다.

그리고 충돌체크 함수를 만들었다.

플레이어가 실질적으로 충돌 했을 때 부딪힌 블럭을 for문을 통해 검사하여 플레이어의 

위치를 매개변수로 보내고 

부딪힌 블럭을 반환 받는다.

만약 부딪힌 블럭이 충돌되지 않았을 때 if( Box == NULL ),

setPosition을 하지 않으 므로써

플레이어가 박스 안으로 들어가지 않게 된다.

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
Object_Box * Box_Manager::AddBox( CGPoint _pos )
{
    for(int i = 0; i < MAXBOX; i++)
    {
        if( m_pBox[i] == NULL )
        {
            m_pBox[i] = new Object_Box;
            m_pBox[i]->init( CGSize(50,10) );
            m_pBox[i]->setAnchorPoint( ccp( 00 ) );
            m_pBox[i]->setPosition( _pos );
            return m_pBox[i];
        }
    }
    return NULL;
}
 
Object_Box * Box_Manager::CollisionCheck( CGPoint _pos )
{
    for(int i = 0; i < MAXBOX; i++ )
    {
        if( m_pBox[i] == NULL ) continue;
        if( m_pBox[i]-> CollisionCheck( _pos ))
            return m_pBox[i];
    }
    return NULL;
}
 
cs


결과



평 가

 .난이도 : 쉬움

 별   점 : ★★☆ 

 한 마디: 맵의 토대 마련.




<Progress List> 

 - Key Control

 - Gravity Jump

 - Box Create

 - Box CollisionCheck


<Complete List> 

  - No Data

  - No Data

  - No Data

  - No Data






And
prev | 1 | 2 | next