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

来源:互联网 发布:淘宝旺铺有什么用 编辑:程序博客网 时间:2024/06/06 15:50

一、原文出处

        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 = [CCSpritespriteWithFile:@"player2.png"];

   修改ccTouchesEnded函数

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

2.旋转射击

  a.HelloWorldLayer.h

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

  b.HelloWorldLayer.m

    修改init函数

    _player = [CCSpritespriteWithFile:@"player2.png"];

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

    [selfaddChild:_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 = [selfconvertTouchToNodeSpace:touch];

    

    // Set up initial location of projectile

   CGSize winSize = [[CCDirectorsharedDirector] winSize];

    _nextProjectile = [[CCSpritespriteWithFile:@"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);

    [_playerrunAction:

     [CCSequence actions:

      [CCRotateToactionWithDuration:rotateDuration angle:cocosAngle],

      [CCCallBlockactionWithBlock:^{

         // OK to add now - rotation is finished!

         [selfaddChild:_nextProjectile];

         [_projectilesaddObject:_nextProjectile];

         

         // Release

         [_nextProjectilerelease];

         _nextProjectile =nil;

     }],

     nil]];

    

    // Move projectile to actual endpoint

    [_nextProjectilerunAction:

     [CCSequence actions:

      [CCMoveToactionWithDuration:realMoveDuration position:realDest],

      [CCCallBlockNactionWithBlock:^(CCNode *node) {

         [_projectilesremoveObject:node];

         [node removeFromParentAndCleanup:YES];

     }],

     nil]];

    

    _nextProjectile.tag =2;

    

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

}

4.结束



0 0
原创粉丝点击