如何使用 spritebuilder 创建简单的开始屏幕?

Posted

技术标签:

【中文标题】如何使用 spritebuilder 创建简单的开始屏幕?【英文标题】:How to create simple start screen using spritebuilder? 【发布时间】:2014-02-14 05:54:08 【问题描述】:

在撰写本文时,我使用的是最新版本的 XCode 和 SpriteBuilder。

我有 2 款游戏,其中一款是在 XCode 上使用纯 Objective-C 构建的,另一款在 XCode 和 SpriteBuilder 上使用 Objective-C。非 SpriteBuilder 游戏具有点击播放屏幕,其背景看起来与游戏内背景相同。点击屏幕的那一秒,你就直接进入游戏了。

Sprite Builder 游戏是我尝试在其上实现开始屏幕的游戏。我阅读了一些教程,http://www.reigndesign.com/blog/creating-a-simple-menu-with-scene-transition-in-cocos2d/,但对我没有帮助。我不想使用不同的背景图片从一个屏幕过渡到另一个屏幕。

这是我的非 SpriteBuilder 游戏使用的开始屏幕:

-(void)NewGame
Bottom1.hidden = YES;
Bottom2.hidden = YES;
Bottom3.hidden = YES;
Bottom4.hidden = YES;
Bottom5.hidden = YES;
Bottom6.hidden = YES;
Bottom7.hidden = YES;
Top1.hidden = YES;
Top2.hidden = YES;
Top3.hidden = YES;
Top4.hidden = YES;
Top5.hidden = YES;
Top6.hidden = YES;
Top7.hidden = YES;
Obstacle.hidden = YES;
Obstacle2.hidden = YES;

Intro1.hidden = NO;
Intro2.hidden = NO;
Intro3.hidden = NO;

Heli.hidden = NO;
Heli.center = CGPointMake(31, 74);
Heli.image = [UIImage imageNamed:@"HeliUp.png"];

Start = YES;
ScoreNumber = 0;
Score.text = [NSString stringWithFormat:@"Score: 0"];
Intro3.text = [NSString stringWithFormat:@"High Score: %i", HighScore];

所有障碍物都被隐藏了,除了背景和介绍标签。您还会看到自己的高分和点按播放按钮。

当您点击屏幕时,这是下一个代码:

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

if (Start == YES) 

    Intro1.hidden = YES;
    Intro2.hidden = YES;
    Intro3.hidden = YES;

    timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(HeliMove) userInfo:nil repeats:YES];



    Scorer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(Scoring) userInfo:nil repeats:YES];

    Start = NO;

    Bottom1.hidden = NO;
    Bottom2.hidden = NO;
    Bottom3.hidden = NO;
    Bottom4.hidden = NO;
    Bottom5.hidden = NO;
    Bottom6.hidden = NO;
    Bottom7.hidden = NO;
    Top1.hidden = NO;
    Top2.hidden = NO;
    Top3.hidden = NO;
    Top4.hidden = NO;
    Top5.hidden = NO;
    Top6.hidden = NO;
    Top7.hidden = NO;
    Obstacle.hidden = NO;
    Obstacle2.hidden = NO;


    RandomPosition = arc4random() %75;
    RandomPosition = RandomPosition + 110;
    Obstacle.center = CGPointMake(570,RandomPosition);

    RandomPosition = arc4random() %75;
    RandomPosition = RandomPosition + 110;
    Obstacle2.center = CGPointMake(855,RandomPosition);

    RandomPosition = arc4random() %55;
    Top1.center = CGPointMake(560, RandomPosition);
    RandomPosition = RandomPosition +265;
    Bottom1.center = CGPointMake(560, RandomPosition);

    RandomPosition = arc4random() %55;
    Top2.center = CGPointMake(640, RandomPosition);
    RandomPosition = RandomPosition +265;
    Bottom2.center = CGPointMake(640, RandomPosition);

    RandomPosition = arc4random() %55;
    Top3.center = CGPointMake(720, RandomPosition);
    RandomPosition = RandomPosition +265;
    Bottom3.center = CGPointMake(720, RandomPosition);

    RandomPosition = arc4random() %55;
    Top4.center = CGPointMake(800, RandomPosition);
    RandomPosition = RandomPosition +265;
    Bottom4.center = CGPointMake(800, RandomPosition);

    RandomPosition = arc4random() %55;
    Top5.center = CGPointMake(880, RandomPosition);
    RandomPosition = RandomPosition +265;
    Bottom5.center = CGPointMake(880, RandomPosition);

    RandomPosition = arc4random() %55;
    Top6.center = CGPointMake(960, RandomPosition);
    RandomPosition = RandomPosition +265;
    Bottom6.center = CGPointMake(960, RandomPosition);

    RandomPosition = arc4random() %55;
    Top7.center = CGPointMake(1040, RandomPosition);
    RandomPosition = RandomPosition +265;
    Bottom7.center = CGPointMake(1040, RandomPosition);




Y = -7;
Heli.image = [UIImage imageNamed:@"HeliUp.png"];



-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

Y = 7;
Heli.image = [UIImage imageNamed:@"HeliDown.png"];



基本来说,所有障碍物都加载并在随机位置生成,对象会随着你点击屏幕而移动,如果你不点击屏幕则会掉落。介绍标签已隐藏。

这是我的 SpriteBuilder 游戏的代码:

- (void)didLoadFromCCB 
self.userInteractionEnabled = TRUE;
_grounds = @[_ground1, _ground2];
for (CCNode *ground in _grounds) 
    // set collision txpe
    ground.physicsBody.collisionType = @"level";
    ground.zOrder = DrawingOrderGround;
_scrollSpeed = 80.f;

// set this class as delegate
_physicsNode.collisionDelegate = self;
// set collision txpe
_hero.physicsBody.collisionType = @"hero";
_hero.zOrder = DrawingOrdeHero;
_obstacles = [NSMutableArray array];
[self spawnNewObstacle];
[self spawnNewObstacle];
[self spawnNewObstacle];

- (void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event 
if (!_gameOver) 
    [_hero.physicsBody applyImpulse:ccp(0, 400.f)];
    [_hero.physicsBody applyAngularImpulse:10000.f];
    _sinceTouch = 0.f;

    

非常短的代码。基本上,在徽标屏幕消失后,游戏会立即开始,而没有开始屏幕。游戏结束后,它会重新开始,您会立即重新开始游戏。

试图弄清楚如何在 SpriteBuilder 游戏中添加另一个 void 语句,以便人们从点击屏幕然后开始玩游戏,而不是立即开始玩游戏。

我可以在 SpriteBuilder 游戏中添加 viewDidLoad 语句,但我想知道它是否会与 didLoadfromCCB 语句冲突。我需要使用相同的背景将开始屏幕过渡到游戏屏幕。唯一不同的是,开始画面会隐藏障碍物并显示play now标签,然后标签会隐藏,障碍物会在游戏画面中可见。

【问题讨论】:

【参考方案1】:

我建议按照 spritebuilder 教程进行操作。这可能需要您重新调整代码。以下教程还可以帮助您将 spritebuilder 链接到后端代码,以及如何在场景之间进行转换。

我不是 100% 确定你为什么在你的问题中包含这么多细节,我对什么是游戏逻辑以及什么是其他逻辑感到困惑......所以如果我不正确,请告诉我我会更新我的答案。

https://www.makegameswith.us/tutorials/getting-started-with-spritebuilder/menus/

【讨论】:

【参考方案2】:

我闻起来有点像 Flappy Bird。

无论哪种方式,我都会用一个 gameState 变量和一个带有菜单的层来实现它。

当您打开游戏 (viewDidLoad) 时,将 gameState 设置为 0,例如菜单

然后在触摸方法中,我将有一个如下所示的开关:

switch(gameState)
    case 0: //Menu
        menuLayer.hidden = YES;
        gameState = 1 //IN_GAME
        break;
    case 1: //In game
        //Do your game tap code
        break;
    case 2: //Game Over
        gameOverLayer.hidden = NO;
        break;

或者您可以复制 CCb 并删除游戏代码并在触摸时加载游戏 cCB,但我认为前者是最佳选择。

【讨论】:

以上是关于如何使用 spritebuilder 创建简单的开始屏幕?的主要内容,如果未能解决你的问题,请参考以下文章

如何完全删除启动画面,以便立即加载游戏? Cocos2d + SpriteBuilder

在 Cocos2D 和 Spritebuilder 中为 Sprite 设置动画

从时间轴播放 Spritebuilder 动画 - Cocos2d

如何使用用户默认值保存开关的开/关值?

SpriteBuilder&Cocos2D使用CCEffect特效实现天黑天亮过度效果

Cocos2d V3 和 Spritebuilder - 时间轴动画不运行后续时间