-(void)addTarget {
CCSprite *target = [CCSprite spriteWithFile:@"target.png" rect:CGRectMake(0, 0, 70, 70)];
// 타겟(맘모스)의 Y축 위치 결정.
CGSize winSize = [[CCDirector sharedDirector] winSize];
int minY = target.contentSize.height/2;
int maxY = winSize.height - target.contentSize.height/2;
int rangeY = maxY - minY;
int actualY = (arc4random() % rangeY) + minY;
// 오른쪽 끝 화면 밖에 X축 위치와 위에서 결정한 Y축으로 타켓의 포지션 결정.
target.position = ccp(winSize.width + (target.contentSize.width/2), actualY);
[self addChild:target];
// 타겟의 속도 결정.
int minDuration = 2.0;
int maxDuration = 4.0;
int rangeDuration = maxDuration - minDuration;
int actualDuration = (arc4random() % rangeDuration) + minDuration;
// 액션 생성.
id actionMove = [CCMoveTo actionWithDuration:actualDuration position:ccp(-target.contentSize.width/2, actualY)];
id actionMoveDone = [CCCallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)];
[target runAction:[CCSequence actions:actionMove, actionMoveDone, nil]];
}
IntervalAction: 주어진 시간 동안 같은 동작을 반복해서 실행한다.
RepeatAction: 일정한 시간 동안 일정한 패턴을 반복한다.
Composable Action: Sequence, Spawn, Repeat, Revers.
Ease Action: Exp, Sin, Cubic 등.
Etc Action: CallFun, Orbit.
-(void)spriteMoveFinished:(id)sender {
CCSprite *sprite = (CCSprite *)sender;
[self removeChild:sprite cleanup:YES];
}
[self schedule:@selector(gameLogic:) interval:1.0];
-(void)gameLogic:(ccTime)dt {
[self addTarget];
}
self.isTouchEnabled = YES;
-(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
// 처리를 위한 터치 선택.
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView:[touch view]];
location = [[CCDirector sharedDirector] convertToGL:location];
// 총알(케익)의 초기 위치 설정.
CGSize winSize = [[CCDirector sharedDirector] winSize];
CCSprite *projectile = [CCSprite spriteWithFile:@"projectile.png" rect:CGRectMake(0, 0, 40, 40)];
projectile.position = ccp(20, winSize.height/2);
// 총알 위치의 오프셋(offset) 측정.
int offX = location.x - projectile.position.x;
int offY = location.y - projectile.position.y;
// 총알 발사를 상/하 수직이나 뒤로 할 경우 탈출함(발사되지 않음).
if (offX <= 0) return;
// 포지션 이중 체크.
[self addChild:projectile];
// 총알을 발사할 위치 측정.
int realX = winSize.width + (projectile.contentSize.width/2);
float ratio = (float) offY / (float) offX;
int realY = (realX * ratio) + projectile.position.y;
CGPoint realDest = ccp(realX, realY);
// Determine the length of how far we're shooting
// 발사한 총알의 길이(궤적)가 얼마인지 측정.
int offRealX = realX - projectile.position.x;
int offRealY = realY - projectile.position.y;
float length = sqrtf((offRealX*offRealX)+(offRealY*offRealY));
float velocity = 480/1; // 480pixels/1sec
float realMoveDuration = length/velocity;
// 총알을 종점(endpoint, 화면 밖...)까지 이동 시킴.
[projectile runAction:[CCSequence actions:
[CCMoveTo actionWithDuration:realMoveDuration position:realDest],
[CCCallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)],
nil]];
}
- 거리(distance)는 스칼라(scalar) 이고 변위(displacement)는 벡터(vector) 이다.
- 벡터는 화살표를 사용해 나타낼 수 있다.
- 거리 = 속도 * 시간
'프로그래밍 > Cocos2D' 카테고리의 다른 글
[MammothHunting] - Cocos2D를 사용한 아이폰 게임 개발 튜토리얼 4 (0) | 2010.07.02 |
---|---|
[MammothHunting] - Cocos2D를 사용한 아이폰 게임 개발 튜토리얼 3 (0) | 2010.07.02 |
[MammothHunting] - Cocos2D를 사용한 아이폰 게임 개발 튜토리얼 1 (0) | 2010.07.02 |
코코스2D엔진에서 스프라이트 에니메이션을 특정프레임만 재생하고 싶습니다. (2) | 2010.01.20 |
cocos2d 이미지 메모리 사용 절약 (0) | 2009.11.07 |