1

スコアなどの情報を表示するための単純なレイヤーを作成したいと思います。

私はなんとかこのようにすることができましたが、それが正しいかどうかは本当にわかりません:

#import "InformationLayer.h"
#import "GameScene.h"

@implementation InformationLayer

-(void) draw
{
    // Complete clear of the screen
    [self removeAllChildrenWithCleanup:true];

    // Draw my score
    [self DrawScore];
}

- (void)DrawScore
{
    // create and initialize a label
    NSString* l_sScore = [NSString stringWithFormat:@"Score : %d", [[GameScene sharedGameScene] iScore]];

    CCLabelTTF* label = [CCLabelTTF labelWithString:l_sScore fontName:@"Marker Felt" fontSize:32];

    // get the window (screen) size from CCDirector
    CGSize size = [[CCDirector sharedDirector] winSize];

    // position the label at the center of the screen
    label.position = CGPointMake(size.width - ([label texture].contentSize.width / 2), size.height*2.0/3.0);

    // add the label as a child to this Layer
    [self addChild:label];
}
@end

私はいつもそのようにシーンとレイヤーを扱っていますが、すべてのレイヤーをクリアしてからすべてを再度作成するのは本当に快適ではありません。それは完全にやり過ぎだと私には思えます!それでも、それは仕事をします...

私は学習曲線の一番下にいるので、すぐにやりたいと思っています...ここでもっと良いことをしてもらえますか?

4

2 に答える 2

4

それは完全に間違っています。ノードを1回だけ追加します。drawOpenGL(またはcocos2dの関数のような)を使用して何かを描画する場合にのみ、メソッドを使用してくださいccDrawLineinitたとえば、いくつかのメソッドでコンテンツ(ラベル、スプライトなど)を追加できます。

ラベルのテキストを変更するには、setString:メソッドを使用します。

于 2012-10-15T18:11:02.153 に答える
0

したがって、モリオンのアドバイスに従います。

-(id) init
{
    if( (self=[super init] ))
    {
        [self InitLabels];

        // Scheduling the refresh method.
        [self scheduleUpdate]; 
    }
    return self;
}

// Update replaces draw !! 
-(void)update:(ccTime)delta
{
    [self UpdateLabels];
}

- (void)InitLabels
{
    // get the window (screen) size from CCDirector
    CGSize l_ScreenSize = [[CCDirector sharedDirector] winSize];
    float l_iScreenHeightPosition = l_ScreenSize.height*2.0/3.0;

    NSString* l_sScore = [NSString stringWithFormat:@"Score : %d", [[GameScene sharedGameScene] iScore]];
    NSString* l_sLevel = [NSString stringWithFormat:@"Level : %d", [[GameScene sharedGameScene] iLevel]];

    l_lblScore = [CCLabelTTF labelWithString:l_sScore
                                           fontName:@"Marker Felt" fontSize:32];

    l_lblScore.position = CGPointMake(l_ScreenSize.width - ([l_lblScore texture].contentSize.width / 2), l_iScreenHeightPosition);

    // add the label as a child to this Layer
    [self addChild:l_lblScore];

    l_lblLevel = [CCLabelTTF labelWithString:l_sLevel
                                                fontName:@"Marker Felt" fontSize:32];

    l_lblLevel.position = CGPointMake(l_ScreenSize.width - ([l_lblLevel texture].contentSize.width / 2), l_iScreenHeightPosition - ([l_lblScore texture].contentSize.height));

    // add the label as a child to this Layer
    [self addChild:l_lblLevel];
}

- (void)UpdateLabels
{
    NSString* l_sScore = [NSString stringWithFormat:@"Score : %d", [[GameScene sharedGameScene] iScore]];
    NSString* l_sLevel = [NSString stringWithFormat:@"Level : %d", [[GameScene sharedGameScene] iLevel]];

    [l_lblScore setString:l_sScore];
    [l_lblLevel setString:l_sLevel];
}

今私には良く見えます:)

于 2012-10-15T18:22:54.213 に答える