cocos2d flappy bird демо
Я работаю с демоверсией flappy bird, пробуя разные вещи, просто чтобы "узнать друг друга". Проходя демонстрацию, мне удалось изменить направление игры на вертикальную прокрутку, перемещающуюся вверх. Обращение CGFloat к отрицательным значениям заставляет мои препятствия двигаться вверх, но как только они выходят за границы, они не возрождаются. Если я изменю значения для нисходящей прокрутки, они будут появляться заново согласно методу обновления. Может кто-нибудь объяснить мне, что я делаю не так с преобразованием x в y? Почему распознается нижняя часть, а верхняя часть моего экрана - нет? заранее спасибо
#import "MainScene.h"
static const CGFloat scrollSpeed = -280.f; //upwards
static const CGFloat firstObstaclePosition = -568.f;
static const CGFloat distanceBetweenObstacles = 80;
@implementation MainScene {
CCSprite *_hero;
CCPhysicsNode *_physicsNode;
NSMutableArray *_obstacles;
}
- (void)spawnNewObstacle {
CCNode *previousObstacle = [_obstacles lastObject];
CGFloat previousObstacleYPosition = previousObstacle.position.y;
if (!previousObstacle) {
// this is the first obstacle
previousObstacleYPosition = firstObstaclePosition;
}
CCNode *obstacle = [CCBReader load:@"Obstacle"];
obstacle.position = ccp(0, previousObstacleYPosition + distanceBetweenObstacles);
[_physicsNode addChild:obstacle];
[_obstacles addObject:obstacle];
}
- (void)update:(CCTime)delta {
_hero.position = ccp(_hero.position.x, _hero.position.y + delta * scrollSpeed);//move on Y axis
_physicsNode.position = ccp(_physicsNode.position.x, _physicsNode.position.y - (scrollSpeed *delta));//scroll in Y axis
//spawn more
NSMutableArray *offScreenObstacles = nil;
for (CCNode *obstacle in _obstacles) {
CGPoint obstacleWorldPosition = [_physicsNode convertToWorldSpace:obstacle.position];
CGPoint obstacleScreenPosition = [self convertToNodeSpace:obstacleWorldPosition];
if (obstacleScreenPosition.y < -obstacle.contentSize.height) {
if (!offScreenObstacles) {
offScreenObstacles = [NSMutableArray array];
}
[offScreenObstacles addObject:obstacle];
}
}
for (CCNode *obstacleToRemove in offScreenObstacles) {
[obstacleToRemove removeFromParent];
[_obstacles removeObject:obstacleToRemove];
// for each removed obstacle, add a new one
[self spawnNewObstacle];
}
}
- (void)didLoadFromCCB {
self.userInteractionEnabled = TRUE;
_obstacles = [NSMutableArray array];
[self spawnNewObstacle];
[self spawnNewObstacle];
[self spawnNewObstacle];
}
- (void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
}
@end
Я прикрепил скриншот _physicsNode от SB.
1 ответ
Похоже, что ваши препятствия будут нереститься нормально, если они короткие, постоянной высоты, а расстояние между ними достаточно велико. Возможно, будет лучше учесть высоту препятствий, чтобы получить более значимое значение переменной расстояния. Просто мысль.
Линия -
obstacle.position = ccp(0, previousObstacleYPosition + distanceBetweenObstacles);
Может быть -
obstacle.position = ccp(0, previousObstacleYPosition + distanceBetweenObstacles + previousObstacle.contentSize.height);
Что касается проблемы вертикальной прокрутки, работающей вниз, а не вверх, я считаю, что это связано с этой строкой:
if (obstacleScreenPosition.y < -obstacle.contentSize.height) {
Поскольку эта линия отвечает за определение того, находится ли препятствие за пределами экрана, оно влияет на появление следующего препятствия. Имеет смысл, почему эта строка работает для прокрутки вниз, но ее необходимо изменить для прокрутки вверх.
Пытаться:
if (obstacleScreenPosition.y > (_physicsNode.contentSize.height + obstacle.contentSize.height)) {
Вам может понадобиться или не понадобиться размер препятствия в зависимости от того, где оно находится на якоре.
Я надеюсь, что это работает, удачи.