为无尽的赛跑游戏创建动态大小的SKSpriteNode平台

时间:2015-11-08 11:25:53

标签: ios objective-c sprite-kit skspritenode

我正在为IOS创建我的第一个Endless Runner游戏,我希望它尽可能地动态。我想创建一个大型“平台”图像,然后使用该图像创建各种大小的平台。

这个想法是随机选择一个数字作为平台的宽度,然后生成精灵和主体以匹配所选的大小。完成此操作后,通过仅使用部分图像来获取图像以填充精灵。

我正在使用以下内容,但这会根据UIImage的大小创建节点。

SKSpriteNode *spritePlatform = [[Platform alloc] initWithImageNamed:@"Platform"];

[spritePlatform setPosition:CGPointMake(self.frame.size.width + (spritePlatform.frame.size.width / 2), 200)];

spritePlatform.name = @"Platform";

spritePlatform.physicsBody = [SKPhysicsBody bodyWithTexture:spritePlatform.texture size:CGSizeMake(300, 40)];
spritePlatform.physicsBody.affectedByGravity = NO;
spritePlatform.physicsBody.dynamic = NO;

// 1
spritePlatform.physicsBody.usesPreciseCollisionDetection = YES;
// 2
spritePlatform.physicsBody.categoryBitMask = CollisionCategoryPlatform;

spritePlatform.physicsBody.contactTestBitMask = CollisionCategoryPlayer;


[self addChild:spritePlatform];
[self movePlatform:spritePlatform];

理想情况下我想

  1. 根据随机宽度和固定高度创建精灵。
  2. 使用较大图像的一部分来填充精灵。
  3. 我有什么想法可以做到这一点?

    由于

1 个答案:

答案 0 :(得分:3)

  

根据随机宽度和固定高度创建精灵。

width选择一个随机数很简单。您可以使用arc4random_uniform并确保选择合理范围内的数字(小于您的平台图片)。

  

使用较大图像的一部分来填充精灵。

可以使用textureWithRect:inTexture:完成此操作。第一个参数是单位坐标空间中的矩形,用于指定要使用的纹理部分。第二个参数是整个平台纹理,用于从中创建新纹理。

以下是如何设置每个平台的大小/部分的提示:

  1. (0,0)是整个平台坐标的左下角。

  2. x / y坐标的范围是0到1,而不是平台图像的实际尺寸。

  3. 给定平台图像platformAllTexture和第一步中随机width创建的纹理,平台纹理可能是:

    // Fixed height is set as half of the platform image
    SKTexture *platformTexture = [SKTexture textureWithRect:CGRectMake(0, 0, width/platformAllTexture.size.width, 1/2.0)          
                                                  inTexture:platformAllTexture];
    

    通过这种方式,您可以获得动态大小平台的纹理platformTexture

    在上面的示例中,如果矩形定义为CGRectMake(0, 0, 1/3.0, 1/2.0),您将得到类似的结果:

    enter image description here