0

我最近发现了一个关于如何使用 SpriteKit 构建像“flappy bird”这样的游戏的教程。我没有实现抽头机制,而是使用设备加速度计来左右移动小鸟。我现在的问题是生成管道。本教程中使用的方法在 x 轴上创建管道,而不是在 y 轴上,我想要这样做。

-(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];
 }

我的想法是生成从“天空”落下的管道,而鸟必须在管道之间移动才能维持生命。我希望我的问题描述很清楚:) 谢谢

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

4

2 回答 2

0

感谢您链接教程!

如果你想让管道掉下来,那就让它们掉下来吧!管道附有物理实体,因此它们应根据其垂直位置从天而降。那么就不需要使用SKAction来移动管道了。但是,您需要将其dynamic标志更改为YES以施加重力。请参阅 Xcode 参考:

一个布尔值,指示物理体是否被物理模拟移动。默认值为是。如果值为 NO,则物理体将忽略施加在其上的所有力和冲量。这个属性在基于边的物体上被忽略;它们自动是静态的。

于 2014-02-23T13:17:31.277 回答
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 );

结果 ==>图片

现在最大的挑战是找到一种方法使管道的位置以某种方式随机化。:)

于 2014-02-24T18:48:51.693 回答