Ios SpriteKit:sprite定位

Ios SpriteKit:sprite定位,ios,objective-c,sprite,sprite-kit,flappy-bird-clone,Ios,Objective C,Sprite,Sprite Kit,Flappy Bird Clone,我最近发现了一个关于如何使用SpriteKit构建一个像“flappy bird”这样的游戏的方法。我没有使用敲击机制,而是使用设备加速计来左右移动小鸟。 现在,我的问题是生成管道。本教程中使用的方法在x轴而不是y轴上创建管道,我想这样做 -(void)createPipes { SKTexture* _pipeTexture1 = [SKTexture textureWithImageNamed:@"Pipe1"]; _pipeTexture1.filteringMode = SK

我最近发现了一个关于如何使用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];
 }
我的想法是制造从“天空”坠落的管道,鸟必须在管道之间移动才能生存。 我希望对我的问题的描述非常清楚:) 谢谢


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

感谢链接教程

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 );
如果你想让管子掉下来,那就让它们掉下来吧!这些管道连接有物理实体,因此它们应该根据其垂直位置从天空坠落。无需使用
SKAction
移动管道。但是,您需要将其
动态
标志更改为
,以便施加重力。请参阅Xcode参考:

一个布尔值,指示物理实体是否被物理模拟移动。 默认值为“是”。如果该值为“否”,则物理实体将忽略应用于它的所有力和脉冲。在基于边的实体上忽略此属性;它们自动是静态的


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

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 );
结果==>


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

实际上,管道是水平下落的,但问题在于它们在屏幕上的位置。当它们落下时,我看不到右管道的末端或左管道的开始。也许我不太明白您打算做什么(也许共享屏幕截图?!),但我想分享一个想法:记住这两个管道是父管道的子管道
\u pipePair
,并且相对定位于父管道。父对象仍然位于屏幕的右边缘,就像在教程中一样,您可以在其上添加额外的像素空间。也许你需要更新它来满足你的需要。是的,我确实需要改变精灵的位置来满足我的需要。从昨天开始,我一直在努力为管道找到正确的值。看我的截图[链接]()我试着用文字来写一个答案,但最终我猜一张图片能说出一千多个单词。看看这里,看看我将如何安排节点。请注意,文本“(-1=nothing,1=full width)”实际上应该是“(-1=nothing,0=full width)”……我没想到这个图像服务会将我的图片从PNG更改为JPG。我放弃了。如有必要,请直接与我联系。