Cocos2D: SneakyJoystick + Touch Events, проблема - PullRequest
0 голосов
/ 28 апреля 2011

У меня возникли проблемы с использованием SneakyJoystick и ccTouchEnded.

Какова моя цель, использовать джойстик для обхода и касания для взаимодействия с окружающей областью.

У меня есть два слоя, ControlLayer (z: 2) и GamePlayLayer (z: 1) Я использую TiledMap для моей земли и карты.Сам джойстик работает нормально, он присоединен к ControlLayer.Я могу ходить, сталкиваться и все такое.

Когда я добавляю события Touch в GamePlayLayer, сенсор работает, я могу нажать на что-нибудь на «земле» и взаимодействовать с ним.НО мой джойстик не работает, тогда, если я бегу, используя сенсорный, джойстик просто сидит там, не реагируя.

Вот часть моего кода, если вам, ребята, нужно больше, просто спросите.

Нажмитеметоды в GameplayLayer

-(void) registerWithTouchDispatcher
{
   [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self
                                                     priority:0 swallowsTouches:YES];
}

-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
   return YES;
}


-(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
{

    CGPoint touchLocation = [touch locationInView: [touch view]];      
    touchLocation = [[CCDirector sharedDirector] convertToGL: touchLocation];
    touchLocation = [self convertToNodeSpace:touchLocation];
    CGPoint tileCoord = [self tileCoordForPosition:touchLocation];
    int tileGid = [meta tileGIDAt:tileCoord];
    if (tileGid) {
        NSDictionary *properties = [tileMap propertiesForGID:tileGid];
        if (properties) {
            NSString *collectable = [properties valueForKey:@"Collectable"];
            if (collectable && [collectable compare:@"True"] == NSOrderedSame) {
                [meta removeTileAt:tileCoord];
                [foreground removeTileAt:tileCoord];
            }

        }
    }
}

И как устроена моя сцена:

@implementation SandBoxScene

-(id)init {
    self = [super init];
    if (self!=nil) {
        //Control Layer
        controlLayer = [GameControlLayer node];
        [self addChild:controlLayer z:2 tag:2];

        //GamePlayLayer
        GameplayLayer *gameplayLayer = [GameplayLayer node];
        [gameplayLayer connectControlsWithJoystick:[controlLayer leftJoyStick]
                                     andJumpButton:[controlLayer jumpButton]
                                   andAttackButton:[controlLayer attackButton]];
        [self addChild:gameplayLayer z:1 tag:1];
    }
    return self;
}

@end

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 30 апреля 2011

Проблема в том, что ваш код не учитывает несколько касаний.Использование -(BOOL) ccTouchBegan:(UITouch *)touch.. или -(void) ccTouchEnded:(UITouch *)touch.. займет всего одно касание ... вместо этого вам нужно использовать ccTouchesEnded:.., ваш метод должен выглядеть примерно так:

-(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    //get your touch from the set of UITouches
    UITouch *myTouch = [touches anyObject];  

    //the rest below is the same from your method
    CGPoint touchLocation = [myTouch locationInView: [myTouch view]];     

    touchLocation = [[CCDirector sharedDirector] convertToGL: touchLocation];
    touchLocation = [self convertToNodeSpace:touchLocation];
    CGPoint tileCoord = [self tileCoordForPosition:touchLocation];
    int tileGid = [meta tileGIDAt:tileCoord];
    if (tileGid) {
        NSDictionary *properties = [tileMap propertiesForGID:tileGid];
        if (properties) {
            NSString *collectable = [properties valueForKey:@"Collectable"];
            if (collectable && [collectable compare:@"True"] == NSOrderedSame) {
                [meta removeTileAt:tileCoord];
                [foreground removeTileAt:tileCoord];
            }
        }
    }
}

Вам также нужно добавить [glView setMultipleTouchEnabled:YES];ваше приложение делегат.Я не совсем уверен, что вышеуказанный метод работает. Этот вопрос касается реализации мультитача с cocos2d.Надеюсь, это поможет

0 голосов
/ 01 мая 2011

Извините, это не было решением, я хочу обработать только одно касание, проблема была в приоритете, я отдавал приоритет 0 своему gameplayLayer и каждый раз глотал, так что я не давал шанс контролеру, который приоритет 1, чтобы получить прикосновение и воздействовать на мой джойстик.

Решением, которое я нашел, было изменение приоритета с 0 на 2, после чего джойстик (controlLayer) сработал бы и передал касание приоритету 2, что было моим gameplayLayer

но все равно спасибо:)

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