首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cocos2d flappy bird演示

cocos2d flappy bird演示
EN

Stack Overflow用户
提问于 2014-05-11 06:01:54
回答 1查看 250关注 0票数 0

我正在使用flappy bird演示,尝试不同的东西,只是为了“了解彼此”。通过演示,我已经成功地将游戏的方向更改为垂直向上滚动。将CGFloat反转为负值会使我的障碍向上移动,但一旦它们超出界限,它们就不会重新产生。如果我更改向下滚动的值,它们将根据update方法重新生成。有人能解释一下我在x到y的转换中做错了什么吗?为什么屏幕的底部可以识别,而屏幕的顶部不能识别?提前感谢

代码语言:javascript
复制
#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截图。

EN

回答 1

Stack Overflow用户

发布于 2014-05-11 07:36:27

看起来,如果你的障碍物是一个短的、恒定的高度,并且它们之间的距离足够大,那么你的障碍物就会产生良好的效果。合并障碍物的高度可能会更好,以获得更有意义的距离变量值。这只是个想法。

这行字-

代码语言:javascript
复制
obstacle.position = ccp(0, previousObstacleYPosition + distanceBetweenObstacles);

可能是-

代码语言:javascript
复制
obstacle.position = ccp(0, previousObstacleYPosition + distanceBetweenObstacles + previousObstacle.contentSize.height);

至于垂直滚动向下而不是向上滚动的问题,我相信是因为下面这行:

代码语言:javascript
复制
if (obstacleScreenPosition.y < -obstacle.contentSize.height) {

由于这条线负责确定一个障碍物何时离开屏幕,因此它会影响下一个障碍物的产生。这就是为什么这一行适用于向下滚动,但需要更改为向上滚动的原因。

尝试:

代码语言:javascript
复制
 if (obstacleScreenPosition.y > (_physicsNode.contentSize.height + obstacle.contentSize.height)) {

您可能需要也可能不需要障碍物的大小,具体取决于障碍物的锚定位置。

我希望这行得通,祝你好运。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23586805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档