이번 파트에서는 총알과 플레이어 충돌, 적과 플레이어 충돌 그리고 적의 에너지 게이지 추가를 구현하겠다.
총알과 플레이어 케릭터 충돌처리
gameLayer.h 에 이동하여 충돌하였는지를 체크 할수 있게 변수하나를 추가한다.
BOOL isCollision;
충돌 처리를 위해서 gameLayer.m으로 이동해서 - (void)update:(ccTime)dt 메소드에 아래 코드를 추가한다.
//총알 플레이어와 케릭터 충돌을 위해서 배열에서 적을 하나 꺼낸다.
for (Enemy *enemy in enemysArray) {
//적이 죽은 상태이면 그냥 넘어간다.
if (!enemy.state) continue;
//총알을 하나 배열에서 꺼낸다
for (Bullet *bullet in bulletsArray) {
//총알이 적에 맞아서 없어진 상태면 그냥 넘어간다.
if (!bullet.visible) continue;
//총알과 적이 충돌이 나는지를 체크
if (!isCollision && CGRectIntersectsRect(bullet.boundingBox, enemy.boundingBox)){
//총알을 없애고
bullet.visible = NO;
//싸운드 효과를 재생한다.
//미사일로 적을 공격해서 0점을 받아오는지를 체크
if (![enemy attackedWithPoint:[bullet bulletType]]){
//싸운드 효과를 재생한다.
//적이 폭파되면 먼지를 뿌려주기위한 에니메이션
}
}
}
-(NSInteger)attackedWithPoint:(NSInteger)point;
-(NSInteger)attackedWithPoint:(NSInteger)point {
//공격 받은 숫자 만큼 에너지를 줄여준다.
_energy -= point;
//0미만으로 되면 0을 아니면 현재 에너지를 반환
if ( _energy <= 0 ) {
//죽으면 숨긴다
[self destroy];
}
return _energy;
}
-(void)destroy {
//적이 죽으면 상태 값을 변경
_state = kDestoryed;
//에너지는 0으로 한다.
_energy = 0;
//그리고 숨긴다.
self.visible = NO;
}
적과 플레이어 케릭터 충돌처리
적과 플레이어 케릭터 충돌처리도 간단하다. 총알과 적과 충돌처리처럼 겹치는 영역이 있으면 충돌처리를 하고 게임을 끝나게 하면 된다.
gameLayer.m 에서 위에 추가한 for (Enemy *enemy in enemysArray) {} 괄호 안에서 마지막에 아래 코드를 추가한다.
//적과 플레이어 케릭터가 충돌하는지를 체크
if (!isCollision && CGRectIntersectsRect(enemy.boundingBox, _player.boundingBox)) {
isCollision = YES;
if (isCollision){
_player.visible = NO;
// 충돌하게 되면 총알을 다 없앤다.
[self unschedule:@selector(updateBullet)];
for (Bullet *bullet in bulletsArray) {
bullet.visible = NO;
[bullet removeFromParentAndCleanup:YES];
}
CCCallBlock *allStop = [CCCallBlock actionWithBlock:^{
//터치 이벤트를 더이상 받지 않는다.
self.isTouchEnabled = NO;
}];
//딜레이를 위한 엑션
CCDelayTime *delay = [CCDelayTime actionWithDuration:2.0f];
//딜레이후 메뉴로 나가기 위한 엑션 블럭
CCCallBlock *block = [CCCallBlock actionWithBlock:^{
//메뉴 레이어로 돌아간다.
[[CCDirector sharedDirector] replaceScene:[MenuLayer scene]];
}];
//엑션을 순서대로 준비.
CCSequence *seq = [CCSequence actions:allStop, delay, block, nil];
//엑션 실행
[self runAction:seq];
}
}
@interface EnergyGauge : CCNode {
CGFloat maxValue;
CGFloat currentValue;
CGSize maxSize;
}
+ (id)initWithMaxSize:(CGSize)size maxValue:(CGFloat)_maxValue;
- (id)initWithMaxSize:(CGSize)size maxValue:(CGFloat)maxVal;
- (void)updateBar:(CGFloat)_currentValue;
+(id)initWithMaxSize:(CGSize)size maxValue:(CGFloat)_maxValue{
return [[self alloc] initWithMaxSize:size maxValue:_maxValue];
}
- (id)initWithMaxSize:(CGSize)size maxValue:(CGFloat)_maxValue{
self = [super init];
if ( self ){
maxSize = size;
currentValue = maxValue = _maxValue;
}
return self;
}
에너지 게이지를 스프라이트를 사용해서 그릴수도 있지만 간단하게 OpenGL을 이용해서 그리도록 한다. 아래 코드를 복사, 붙여 넣기한다.
- (void)draw{
//최대값 기준으로 % 로 환산한 너비 값
CGFloat width = (currentValue / maxValue) * (float)maxSize.width;
//라인의 두깨는 높이값이다.
glLineWidth(maxSize.height);
//100%일 때는 Green 값
if (currentValue == maxValue) {
ccDrawColor4B(255, 255, 0, 255);
//그 외에는 Red 값
} else {
ccDrawColor4B(255, 0, 0, 255);
}
//선을 그린다.
ccDrawLine(ccp(0, 0), ccp(width, 0));
}
- (void)updateBar:(CGFloat)_currentValue{
//값을 값을 현재 값으로 할당한다.
currentValue = _currentValue;
//0 이하면 0으로, 최대값을 초과하면 최대값으로 보정한다.
if (currentValue < 0 ) currentValue = 0;
else if (currentValue > maxValue) currentValue = maxValue;
}
@property (nonatomic, strong) EnergyGauge *gauge;
//에너지 게이지 객채를 생성한다.
_gauge = [EnergyGauge initWithMaxSize:CGSizeMake(self.boundingBox.size.width, 10) maxValue:100];
//에너지 게이지를 자식으로 추가.
[self addChild:_gauge];
적이 공격을 받았을 경우 처리를 하기 위해서 -(NSInteger)attackedWithPoint:(NSInteger)point 메소드 안 _energy -= point; 코드 아래에 다음 코드를 추가한다.
//게이지 업데이트
[_gauge updateBar:_energy];
그리고 적이 초기화 되었을 때 에너지 게이지를 초기화 하기 위해서 -(void)reset 메소드 가장 아래 부분에 다음 코드를 추가한다
//죽어서 안보이던 적을 다시 보여준다.
[self setVisible:YES];
//상태값을 일반 상태로 변경 한다.
_state = kNormal;
//게이지 바를 초기화 한다.
[_gauge updateBar:_energy];
기본적 게임 기능은 모두 추가 되었다. 다음 파트에서는 점수를 나타내는 HUD 추가와 폭파할때 일어나는 에니메이션 등을 구현 하도록 하겠다.
시뮬레이터 상에서 스프라이트 이미지가 많이지면서 프레임 레이트가 20 밑으로 뚝뚝 떨어지는 것을 볼 수 있다. 실제 기기 상에서는 문제 없이 나온다. 시뮬레이터와 단말기에서 사용하는 OpenGL 이 달라서 그렇다.
'iDev > Cocos2D' 카테고리의 다른 글
드래곤 플라이트 따라 만들기 - 8. Head-up Display (2) | 2013.02.09 |
---|---|
드래곤 플라이트 따라 만들기 - 7. 날갯짓 애니메이션 (1) | 2013.02.05 |
드래곤 플라이트 따라 만들기 - 5. 총알 추가 (2) | 2013.01.29 |
드래곤 플라이트 따라 만들기 - 4. 적 케릭터 (6) | 2013.01.24 |
드래곤 플라이트 따라 만들기 - 3. 플레이어 케릭터 (1) | 2013.01.16 |