Страницы

Поиск по вопросам

пятница, 5 июля 2019 г.

Как генерировать объекты за экраном с заданным промежутком

Приветствую всех! Делаю игру на spritekit с бесконечным уровнем (like Doodle jump)и возникла проблема: Не могу понять как генерировать платформы за экраном так, чтобы новые генерировались только после того, как предыдущая платформа уехала на определенное расстояние? Вот пример кода для генирации платформ - (void)addPlatforms { int random = arc4random() % (int)(self.frame.size.width-80)+100;
// right end platform SKSpriteNode *rightEndPlatform = [SKSpriteNode spriteNodeWithImageNamed:@"leftPlatform"]; rightEndPlatform.size = CGSizeMake(16, 16); rightEndPlatform.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(rightEndPlatform.size.width, rightEndPlatform.size.height - 5)]; rightEndPlatform.position = CGPointMake(random, 0);
// left end platform SKSpriteNode *leftEndPlatform = [SKSpriteNode spriteNodeWithImageNamed:@"rightPlatform"]; leftEndPlatform.size = CGSizeMake(16, 16); leftEndPlatform.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(leftEndPlatform.size.width, leftEndPlatform.size.height - 5)]; leftEndPlatform.position = CGPointMake(rightEndPlatform.position.x - PLATFORM_RANGE, rightEndPlatform.position.y);
// left platform SKSpriteNode *leftPlatform = [SKSpriteNode spriteNodeWithImageNamed:@"centerPlatform"]; leftPlatform.size = CGSizeMake(leftEndPlatform.position.x, 16); leftPlatform.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:leftPlatform.frame.size]; leftPlatform.position = CGPointMake(leftEndPlatform.position.x - leftPlatform.size.width/2, leftEndPlatform.position.y);
// right platform SKSpriteNode *rightPlatform = [SKSpriteNode spriteNodeWithImageNamed:@"centerPlatform"]; rightPlatform.size = CGSizeMake(self.frame.size.width+rightEndPlatform.position.x, 16); rightPlatform.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:rightPlatform.frame.size]; rightPlatform.position = CGPointMake(rightEndPlatform.position.x + rightPlatform.size.width/2, rightEndPlatform.position.y);
// add to the scene [self addChild:rightEndPlatform]; [self addChild:leftEndPlatform]; [self addChild:leftPlatform]; [self addChild:rightPlatform];
// add platforms to array [platformArray addObject:rightEndPlatform]; [platformArray addObject:leftEndPlatform]; [platformArray addObject:leftPlatform]; [platformArray addObject:rightPlatform];
for (int i = 0; i < [platformArray count]; i++) { SKSpriteNode *sprite = [platformArray objectAtIndex:i]; sprite.physicsBody.usesPreciseCollisionDetection = YES; sprite.physicsBody.dynamic = NO; sprite.name = [NSString stringWithFormat:@"beforePlayer"]; } } Генерирую платформу, потом напротив через промежуток другую платформу и достраиваю от краев экрана до этих платформ линии, получая стенку с проходом. Далее двигаю созданную конструкцию -(void)update:(CFTimeInterval)currentTime { for (int i = 0; i < [platformArray count]; i++) { SKSpriteNode *platform = [platformArray objectAtIndex:i]; platform.position = CGPointMake(platform.position.x, platform.position.y + PLATFORM_SPEED); if (platform.position.y > self.frame.size.height+100) { [platform removeFromParent]; } } } а генерация платформ происходит по времени timer = [NSTimer scheduledTimerWithTimeInterval:TIME_INTERVAL target:self selector:@selector(addPlatforms) userInfo:nil repeats:YES]; Вот и вопрос, вообще правильно ли я делаю или есть лучше вариант, как генерировать платформы не по времени а по расстоянию (первая сгенерированная платформа уехала на 100 единиц , тогда генерируем вторую, вторая уехала на 100 единиц- генерируем третью и т.д) Спасибо за внимание!


Ответ

Сразу прошу прощения, не стал вчитываться в код, (как известно, разбирать чужой код это, как лезть кому-то в душу) ). Наиболее изящный, по моему скромному мнению, выход из этой ситуации таков: 1) Остановите движение платформ, временно закомментировав соответствующую часть кода в update 2) На неподвижном экране создайте максимально возможное число платформ (на нужном Вам расстоянии друг от друга). Это легко сделать, с помощью цикла for. 3) Сдвиньте точку генерации первой из платформ на нужное расстояние за экраном. 4) Далее, в методе update начинайте двигать платформы (кстати, доступ к платформе можно получить, присвоив ей имя (если не знаете как, я напишу)) и, при этом, как только платформа пройдет нужное расстояние (то, что между каждой из платформ) за экран, Вам необходимо переместить ее в начальную точку (в ту, в которой происходила генерация первой платформы). При выполнении данного алгоритма у Вас получится непрерывный "поток" платформ, причем без наложений и дополнительной генирации (то макимальное число платформ вы просто перемещаете "по кругу") Надеюсь, у меня получилось донести до Вас мысль об общем построении таких конструкций. Если нужно что-то описать подробней, пишите, не стесняйтесь.

Комментариев нет:

Отправить комментарий