Вид с вкладки cocos2d для мультиплеера - PullRequest
0 голосов
/ 01 апреля 2012

В настоящее время я разрабатываю карточную игру для iphone с использованием cocos2d. В настоящее время я нуждаюсь в представлении вкладок, где каждая вкладка представляет игрока и его / ее набор карт. В настоящее время у меня есть один вид, представляющий только одного игрока. Кажется, что cocos2d на самом деле не собран, у него есть несколько представлений, чтобы сделать это, и это потребовало бы некоторого серьезного взлома кода. Какой самый эффективный способ сделать это?


Вы можете заметить здесь что-то явно не так? Я создал новый класс с именем PlayerController (из приложения делегата) делегат приложения вызывает метод сцены, который впоследствии заполняет массив двумя объектами «руками» и вызывает initWithPlayerHands (я знаю, что это не должно быть здесь, но я просто хотел, чтобы сначала все заработало). Я также жестко закодировал moveToPlayerHand, чтобы указать на элемент 0

-(CCScene *) scene
{
    // 'scene' is an autorelease object.
    CCScene *scene = [CCScene node];
    // 'layer' is an autorelease object.
    PlayerController *layer = [PlayerController node];

    // add layer as a child to scene
    [scene addChild: layer];

    HelloWorldLayer *layer1 = [[HelloWorldLayer alloc] init];
    HelloWorldLayer *layer2 = [[HelloWorldLayer alloc] init];

    allLayers = [[NSMutableArray alloc] initWithCapacity:6];
    [allLayers addObject:layer1];
    [allLayers addObject:layer2];   
    [self initWithPlayerHands:allLayers];

    // return the scene
    return scene;
}

-(id)initWithPlayerHands:(NSMutableArray *)layers
{
    NSMutableArray *allPlayers;

    if ( (self = [super init]) )    
    {
        currentScreen = 1;
        [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:-1 swallowsTouches:NO];
        [self setIsTouchEnabled:YES];
        scrollWidth = [[CCDirector sharedDirector] winSize].width;
        scrollHeight = [[CCDirector sharedDirector] winSize].height;
        startWidth = scrollWidth;
        startHeight = scrollHeight;

        allPlayers = [[NSMutableArray array] retain];
        int count = [layers count];
        int i = 0;

        for (CCLayer *l in layers)
        {
            l.anchorPoint = ccp(0,0);
            l.position = ccp((i*scrollWidth),0);
            [self addChild:l ];
            i=i+1;
            count-=1;
        }
        totalScreens = i;       
    }       
    return self;
}

-(void) moveToPlayerHand:(int)hand //this represents the layer you want to move to
{
    float dest = /*((currentScreen-1)*scrollHeight);*/ 0;
    id changeHand = [CCEaseBounce actionWithAction:[CCMoveTo actionWithDuration:0.2 position:ccp(0,dest)]];
    [self runAction:changeHand];
    currentScreen = hand;   
}

1 Ответ

0 голосов
/ 01 апреля 2012

Я сделал нечто похожее на это, используя cocos2d (с разными взглядами).Я решил проблему с помощью scrollIng CCLayer, в котором размещалось 2 (или более) слоя.Этот слой прокрутки был частью сцены, над которой был расположен еще один слой управления (выше z).Вы можете добиться того же самого, если у вас есть разные руки игроков как слои в прокручиваемом слое, а затем отдельный слой, который выше скроллера с 2 спрайтами или 2 кнопками, которые сообщают прокручивающему слою, к какому из его внутренних слоев следует прокрутить.,Уровень прокрутки и уровень управления могут обмениваться данными, используя общую CCScene, в которой они оба.

Извините, я думаю, мой ответ не был полностью ясен.Эти методы должны входить в подкласс CCLayer, поэтому интерфейсом должен быть myScrollerLayer: CCLayer.Сцена должна создать массив, а также создать scrollerLayer, передав ему созданный массив.Таким образом, поскольку у вас есть ссылка как на слой управления, так и на слой scrollerLayer в сцене, вы можете передавать сообщения каждому слою.

Вот код для слоя прокрутки, вы должны сначала создать 2 слоя, которые представляютИгрок, затем вы можете запустить новый слой прокрутки, передав ему массив слоев:

-(id) initWithPlayerHands:(NSMutableArray *)layers
{

    if ( (self = [super init]) )
    {

        // Make sure the layer accepts touches
        [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:-1 swallowsTouches:NO];
        [self setIsTouchEnabled:YES];

        // Set up the starting variables
        currentScreen = 1;
        scrollWidth = [[CCDirector sharedDirector] winSize].width;
        scrollHeight = [[CCDirector sharedDirector] winSize].height;
        startWidth = scrollWidth;
        startHeight = scrollHeight;

        allPlayers = [[NSMutableArray array] retain]; //iVar that holds the layers that represent the players hands.
        // Loop through the array and add the screens
        int count = [layers count];
        int i = 0;
        for (CCLayer *l in layers)
        {

            l.anchorPoint = ccp(0,0);
            l.position = ccp((i*scrollWidth),0);
            //Add them with inverse levels so that the touches can pass through all of the board layers (This is something I did special for my project, I don't think you have to)
            [self addChild:l z:count];
            [allLayers addObject:l];
            i=i+1;
            count-=1;

        }

        // Setup a count of the available screens
        totalScreens = i;

    }
    return self;

}

А вот как перейти к руке игрока:

-(void) moveToPlayerHand:(int)hand //this represents the layer you want to move to
{

    id changeHand = [CCEaseBounce actionWithAction:[CCMoveTo actionWithDuration:0.3 position:ccp(-((page-1)*scrollWidth),0)]];
    [self runAction:changeHand];
    currentScreen = hand;

}

Я надеюсь, что это поможет вам в правильном направлении, если вы хотите увидеть, как это сработало для меня, вы можете проверить ссылку в моем профиле.В середине страницы есть видео, показывающее прокрутку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...