Cocos2D 2.1开发简单iPhone游戏(2)

一、原文出处

        http://www.raywenderlich.com/25791/rotating-turrets-how-to-make-a-simple-iphone-game-with-cocos2d-2-x-part-2

二、旋转的炮台

1.开始

   a.从resources for this tutorial下载新图片,将他们加到工程。

   b.HelloWorldLayer.m

      修改init函数

   CCSprite *player = [CCSprite spriteWithFile:@"player2.png"];

   修改ccTouchesEnded函数

   CCSprite *projectile = [CCSprite spriteWithFile:@"projectile2.png"];

2.旋转射击

  a.HelloWorldLayer.h

    增加成员变量CCSprite *_player;保存炮台对象

  b.HelloWorldLayer.m

    修改init函数

    _player = [CCSprite spriteWithFile:@"player2.png"];

    _player.position = ccp(_player.contentSize.width/2,size.height/2);

    [self addChild:_player];

    修改ccTouchesEnded函数,增加代码

    // Determine angle to face

    float angleRadians = atanf((float)offRealY / (float)offRealX);

    float angleDegrees = CC_RADIANS_TO_DEGREES(angleRadians);

    float cocosAngle = -1 * angleDegrees;

    _player.rotation = cocosAngle;

    此时是射击后炮台才做的旋转

3.旋转后射击,使画面更加平滑

  a.HelloWorldLayer.h

    增加成员变量CCSprite *_nextProjectile;

  b.HelloWorldLayer.m

    修改函数ccTouchesEnded函数

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    if (_nextProjectile != nil) return;

    

    // Choose one of the touches to work with

    UITouch *touch = [touches anyObject];

    CGPoint location = [self convertTouchToNodeSpace:touch];

    

    // Set up initial location of projectile

    CGSize winSize = [[CCDirector sharedDirector] winSize];

    _nextProjectile = [[CCSprite spriteWithFile:@"projectile2.png"] retain];

    _nextProjectile.position = ccp(20, winSize.height/2);

    

    // Determine offset of location to projectile

    CGPoint offset = ccpSub(location, _nextProjectile.position);

    

    // Bail out if you are shooting down or backwards

    if (offset.x <= 0) return;

    

    // Determine where you wish to shoot the projectile to

    int realX = winSize.width + (_nextProjectile.contentSize.width/2);

    float ratio = (float) offset.y / (float) offset.x;

    int realY = (realX * ratio) + _nextProjectile.position.y;

    CGPoint realDest = ccp(realX, realY);

    

    // Determine the length of how far you're shooting

    int offRealX = realX - _nextProjectile.position.x;

    int offRealY = realY - _nextProjectile.position.y;

    float length = sqrtf((offRealX*offRealX)+(offRealY*offRealY));

    float velocity = 480/1; // 480pixels/1sec

    float realMoveDuration = length/velocity;

    

    // Determine angle to face

    float angleRadians = atanf((float)offRealY / (float)offRealX);

    float angleDegrees = CC_RADIANS_TO_DEGREES(angleRadians);

    float cocosAngle = -1 * angleDegrees;

    float rotateDegreesPerSecond = 180 / 0.5; // Would take 0.5 seconds to rotate 180 degrees, or half a circle

    float degreesDiff = _player.rotation - cocosAngle;

    float rotateDuration = fabs(degreesDiff / rotateDegreesPerSecond);

    [_player runAction:

     [CCSequence actions:

      [CCRotateTo actionWithDuration:rotateDuration angle:cocosAngle],

      [CCCallBlock actionWithBlock:^{

         // OK to add now - rotation is finished!

         [self addChild:_nextProjectile];

         [_projectiles addObject:_nextProjectile];

         

         // Release

         [_nextProjectile release];

         _nextProjectile = nil;

     }],

      nil]];

    

    // Move projectile to actual endpoint

    [_nextProjectile runAction:

     [CCSequence actions:

      [CCMoveTo actionWithDuration:realMoveDuration position:realDest],

      [CCCallBlockN actionWithBlock:^(CCNode *node) {

         [_projectiles removeObject:node];

         [node removeFromParentAndCleanup:YES];

     }],

      nil]];

    

    _nextProjectile.tag = 2;

    

    [[SimpleAudioEngine sharedEngine] playEffect:@"pew-pew-lei.caf"];

}

4.结束



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值