SpriteKit:精灵定位

时间:2014-02-23 11:02:45

标签: ios objective-c sprite sprite-kit flappy-bird-clone

我最近发现tutorial如何使用SpriteKit构建像“飞鸟”这样的游戏。我没有使用分接机构,而是使用设备加速度计来左右移动鸟。 我现在的问题是生成管道。本教程中使用的方法在x ax上创建管道而不是y ax,我想要这样做。

-(void)createPipes
{
   SKTexture* _pipeTexture1 = [SKTexture textureWithImageNamed:@"Pipe1"];
   _pipeTexture1.filteringMode = SKTextureFilteringNearest;
   SKTexture* _pipeTexture2 = [SKTexture textureWithImageNamed:@"Pipe2"];
   _pipeTexture2.filteringMode = SKTextureFilteringNearest;

   SKNode* pipePair = [SKNode node];
   pipePair.position = CGPointMake( self.frame.size.width + _pipeTexture1.size.width * 2,   0 );
   pipePair.zPosition = -10;

   CGFloat y = arc4random() % (NSInteger)( self.frame.size.height / 3 );

   SKSpriteNode* pipe1 = [SKSpriteNode spriteNodeWithTexture:_pipeTexture1];
   [pipe1 setScale:2];
   pipe1.position = CGPointMake( self.frame.size.width/2 -100, self.frame.size.height+250 );
   pipe1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:pipe1.size];
   pipe1.physicsBody.dynamic = NO;
   [pipePair addChild:pipe1];

   SKSpriteNode* pipe2 = [SKSpriteNode spriteNodeWithTexture:_pipeTexture2];
   [pipe2 setScale:2];
   pipe2.position = CGPointMake( self.frame.size.width/2 +100, self.frame.size.height+250 );
   pipe2.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:pipe2.size];
   pipe2.physicsBody.dynamic = NO;
   [pipePair addChild:pipe2];

   SKAction* movePipes = [SKAction repeatActionForever:[SKAction moveByX:0 y:-2 duration:0.02]];
   [pipePair runAction:movePipes];

   [self addChild:pipePair];
 }

我的想法是生成从“天空”落下的管道,并且鸟必须在管道之间移动以保持生命。 我希望我的问题的描述非常清楚:) 感谢

澄清:管道确实从“天空”落下,但问题在于它们在屏幕上的位置。当我运行项目时,右管道或左管道之间没有间隙。我只看到一个巨大的管子掉落,垂直填充,屏幕的很大比例。

2 个答案:

答案 0 :(得分:0)

感谢您关联本教程!

如果你想让管子掉下来,那就让它们掉下来吧!管道附有物理机构,因此它们应根据垂直位置从天上掉下来。那么就没有必要使用SKAction来移动管道。但是,您需要将dynamic标记更改为YES,以便应用重力。请参阅Xcode参考:

  

一个布尔值,指示物理模拟是否移动了物理主体。   默认值为YES。如果值为NO,则物理机构忽略应用于它的所有力和脉冲。在基于边的主体上忽略此属性;它们是自动静止的。

答案 1 :(得分:0)

我终于找到了解决方案。通过更改管道位置的值如下所示,我设法使它们在屏幕上正确显示。

SKSpriteNode* pipe1 = [SKSpriteNode spriteNodeWithTexture:_pipe1];
pipe1.position = CGPointMake( (-0.39*pipe1.size.width), 0 );
SKSpriteNode* pipe2 = [SKSpriteNode spriteNodeWithTexture:_pipe2];
pipe2.position = CGPointMake(self.frame.size.width  *1.8, 0 );

结果==> picture

现在最大的挑战是找到一种方法来使管道的位置不知何故随机。 :)