'cocos2D'에 해당되는 글 11건
- 2016.06.15 [Cocos2d-x] Day 11 - Enemy CollisionCheck & Effect 1
- 2016.06.14 [Cocos2d-x] Day 10 - Enemy & Enemy_Effect
- 2016.06.14 [Cocos2d-x] Day 9 - WALL_DROP
- 2016.06.13 [Cocos2d-x] Day 8 - Ladder
- 2016.06.13 [Cocos2d-x] Day 7 - Slope Move
- 2016.06.12 [Cocos2d-x] Day 6 - Resource Work & Bullet Class, Manager Create
- 2016.06.12 [Cocos2d-x] Day 5 - Scroll Map Box & Player Resource Work
- 2016.06.09 [Cocos2d-x] Day 4 - BackGround & CameraScroll & File Input And Output
- 2016.06.08 [Cocos2d-x] Day 3 - MouseDrag Box Create & RayCast Collision
- 2016.06.08 [Cocos2d-x] Day 2 - Create Box / Box CollisionCheck
<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( 255, 100, 100 ) ); 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( -1000, 1000 )); 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 |
'cocos2D > 2D Project' 카테고리의 다른 글
[Cocos2d-x] Day 10 - Enemy & Enemy_Effect (0) | 2016.06.14 |
---|---|
[Cocos2d-x] Day 9 - WALL_DROP (0) | 2016.06.14 |
[Cocos2d-x] Day 8 - Ladder (0) | 2016.06.13 |
[Cocos2d-x] Day 7 - Slope Move (0) | 2016.06.13 |
[Cocos2d-x] Day 6 - Resource Work & Bullet Class, Manager Create (0) | 2016.06.12 |
<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 |
'cocos2D > 2D Project' 카테고리의 다른 글
[Cocos2d-x] Day 11 - Enemy CollisionCheck & Effect (1) | 2016.06.15 |
---|---|
[Cocos2d-x] Day 9 - WALL_DROP (0) | 2016.06.14 |
[Cocos2d-x] Day 8 - Ladder (0) | 2016.06.13 |
[Cocos2d-x] Day 7 - Slope Move (0) | 2016.06.13 |
[Cocos2d-x] Day 6 - Resource Work & Bullet Class, Manager Create (0) | 2016.06.12 |
<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 |
'cocos2D > 2D Project' 카테고리의 다른 글
[Cocos2d-x] Day 11 - Enemy CollisionCheck & Effect (1) | 2016.06.15 |
---|---|
[Cocos2d-x] Day 10 - Enemy & Enemy_Effect (0) | 2016.06.14 |
[Cocos2d-x] Day 8 - Ladder (0) | 2016.06.13 |
[Cocos2d-x] Day 7 - Slope Move (0) | 2016.06.13 |
[Cocos2d-x] Day 6 - Resource Work & Bullet Class, Manager Create (0) | 2016.06.12 |
<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( 0, 1 ), &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 |
기본적으로 사다리가 아니면 ↑↓키를 입력해도 아무런 일도 일어나지 않는다.
밑의 소스코드는 플레이어가 사다리에 올라가거나 내려가는 상태일때의 소스다.
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( 0, 1 ), &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 |
'cocos2D > 2D Project' 카테고리의 다른 글
[Cocos2d-x] Day 10 - Enemy & Enemy_Effect (0) | 2016.06.14 |
---|---|
[Cocos2d-x] Day 9 - WALL_DROP (0) | 2016.06.14 |
[Cocos2d-x] Day 7 - Slope Move (0) | 2016.06.13 |
[Cocos2d-x] Day 6 - Resource Work & Bullet Class, Manager Create (0) | 2016.06.12 |
[Cocos2d-x] Day 5 - Scroll Map Box & Player Resource Work (0) | 2016.06.12 |
<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 |
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 |
'cocos2D > 2D Project' 카테고리의 다른 글
[Cocos2d-x] Day 9 - WALL_DROP (0) | 2016.06.14 |
---|---|
[Cocos2d-x] Day 8 - Ladder (0) | 2016.06.13 |
[Cocos2d-x] Day 6 - Resource Work & Bullet Class, Manager Create (0) | 2016.06.12 |
[Cocos2d-x] Day 5 - Scroll Map Box & Player Resource Work (0) | 2016.06.12 |
[Cocos2d-x] Day 4 - BackGround & CameraScroll & File Input And Output (0) | 2016.06.09 |
[Cocos2d-x] Day 6 - Resource Work & Bullet Class, Manager Create
| cocos2D/2D Project 2016. 6. 12. 14:42<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( 0, 0 ); 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, NULL, sizeof(m_pBullet) ); for( int 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.5, 0 ) ); m_pBullet[i]->setPosition( CGPoint( -100, 0 ) ); 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
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 |
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 |
'cocos2D > 2D Project' 카테고리의 다른 글
[Cocos2d-x] Day 8 - Ladder (0) | 2016.06.13 |
---|---|
[Cocos2d-x] Day 7 - Slope Move (0) | 2016.06.13 |
[Cocos2d-x] Day 5 - Scroll Map Box & Player Resource Work (0) | 2016.06.12 |
[Cocos2d-x] Day 4 - BackGround & CameraScroll & File Input And Output (0) | 2016.06.09 |
[Cocos2d-x] Day 3 - MouseDrag Box Create & RayCast Collision (0) | 2016.06.08 |
<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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
'cocos2D > 2D Project' 카테고리의 다른 글
[Cocos2d-x] Day 7 - Slope Move (0) | 2016.06.13 |
---|---|
[Cocos2d-x] Day 6 - Resource Work & Bullet Class, Manager Create (0) | 2016.06.12 |
[Cocos2d-x] Day 4 - BackGround & CameraScroll & File Input And Output (0) | 2016.06.09 |
[Cocos2d-x] Day 3 - MouseDrag Box Create & RayCast Collision (0) | 2016.06.08 |
[Cocos2d-x] Day 2 - Create Box / Box CollisionCheck (0) | 2016.06.08 |
[Cocos2d-x] Day 4 - BackGround & CameraScroll & File Input And Output
| cocos2D/2D Project 2016. 6. 9. 21:53<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 |
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; for( int i = 0; i < MAXBOX; i++) { if( m_pBox[i] == NULL ) continue; if( m_pBox[i]->getActive() == false ) continue; Count++; } fwrite( &Count, sizeof( int ), 1, pFile ); for( int 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, sizeof( int ), 1, pFile ); for( int 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; for( int i = 0; i < MAXBG; i++ ) { sprintf_s( szFileName, "Resource/BackGround/BG_%d.png", i ); pBg = CCSprite::spriteWithFile( szFileName ); pBg->setScale( 2 ); pBg->setAnchorPoint( ccp( 0, 0.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.f * dt; if( fWorldPosX < MINWIDTH ) MapPos.x += 500.f * dt; if( MapPos.x > 0 ) MapPos.x = 0; // if( MapPos.x < -fMaxPosY ) MapPos.x = -fMaxPosY; if( fWorldPosY > MAXHEIGHT ) MapPos.y -= 500.f * dt; if( fWorldPosY < MINHEIGHT ) MapPos.y += 500.f * 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 |
'cocos2D > 2D Project' 카테고리의 다른 글
[Cocos2d-x] Day 6 - Resource Work & Bullet Class, Manager Create (0) | 2016.06.12 |
---|---|
[Cocos2d-x] Day 5 - Scroll Map Box & Player Resource Work (0) | 2016.06.12 |
[Cocos2d-x] Day 3 - MouseDrag Box Create & RayCast Collision (0) | 2016.06.08 |
[Cocos2d-x] Day 2 - Create Box / Box CollisionCheck (0) | 2016.06.08 |
[Cocos2d-x] Day 1 - KeyInput & Gravity Jump (0) | 2016.06.08 |
<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 |
'cocos2D > 2D Project' 카테고리의 다른 글
[Cocos2d-x] Day 6 - Resource Work & Bullet Class, Manager Create (0) | 2016.06.12 |
---|---|
[Cocos2d-x] Day 5 - Scroll Map Box & Player Resource Work (0) | 2016.06.12 |
[Cocos2d-x] Day 4 - BackGround & CameraScroll & File Input And Output (0) | 2016.06.09 |
[Cocos2d-x] Day 2 - Create Box / Box CollisionCheck (0) | 2016.06.08 |
[Cocos2d-x] Day 1 - KeyInput & Gravity Jump (0) | 2016.06.08 |
<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( 100, 100 ); 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, NULL, sizeof(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( 0, 0 ) ); 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 |
'cocos2D > 2D Project' 카테고리의 다른 글
[Cocos2d-x] Day 6 - Resource Work & Bullet Class, Manager Create (0) | 2016.06.12 |
---|---|
[Cocos2d-x] Day 5 - Scroll Map Box & Player Resource Work (0) | 2016.06.12 |
[Cocos2d-x] Day 4 - BackGround & CameraScroll & File Input And Output (0) | 2016.06.09 |
[Cocos2d-x] Day 3 - MouseDrag Box Create & RayCast Collision (0) | 2016.06.08 |
[Cocos2d-x] Day 1 - KeyInput & Gravity Jump (0) | 2016.06.08 |