Проблема с касанием в cocos2D - PullRequest
       12

Проблема с касанием в cocos2D

0 голосов
/ 24 августа 2009

Эй, ребята, я подготовил много вопросов по этому вопросу, но я действительно еще не получил правильный.

Итак .. в этом проблема ..

Это мой первый проект с cocos2d, извините за это.

У меня есть одна сцена под названием Геймплей , внутри которой у меня есть один слой с именем Сетка , и внутри этой сетки есть много Блок (Слой тоже ).

Мне нужно проверить, когда вы касаетесь одного блока , я делаю это раньше в Интерфейсном Разработчике, поэтому, когда я вызываю touchesBegin, у меня есть точное касание в одном представлении. Но в cocos2D я понимаю, что вы должны проверять положение объектов, а не проверять удар, верно?!

Так что мои прикосновения начинаются так:

- (void)ccTouchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView: [touch view]];
    //location = [[Director sharedDirector] convertCoordinate: location];

    for(int i = 0; i < [arrAllBlocks count]; i++)
    {
        for (int j = 0; j < [[arrAllBlocks objectAtIndex:i] count]; j++) 
        {
            Block *tempBlock = [[arrAllBlocks objectAtIndex:i] objectAtIndex:j];
            CGRect mySurface = (CGRectMake(tempBlock.position.x, tempBlock.position.y, tempBlock.contentSize.width,tempBlock.contentSize.height));
            if(CGRectContainsPoint(mySurface, location)) 
            {
                NSLog(@"Hit Positions %fl:%fl",location.x,location.y);
                NSLog(@"Object Positions %fl:%fl",tempBlock.position.x,tempBlock.position.y);
                NSLog(@"Object Color:%@ hited", tempBlock.strName);
            }
        }

    }
}

Первая проблема: это выглядит перевернутым! Когда я нажимаю на один из этих блоков в первой строке! Я получил блок в последней строке! Я действительно не понимаю этого! И хит не видится идеальным для меня! И когда я convertCoordinate , это происходит еще хуже!

Кто-то может мне помочь ?! И извините за плохой английский = /

Ответы [ 2 ]

1 голос
/ 07 октября 2009

Есть две вещи, которые нужно помнить ...

  • Источник координатной системы Cocos2D - левый нижний угол.
  • По умолчанию опорными точками элементов отображения являются их центры.

Вот как я решил эту проблему:

Установить точки привязки элементов также слева внизу.

[block setAnchorPoint:ccp(0, 0)];

Использовать convertCoordinate в ccTouchesBegan.

-(BOOL)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    UITouch *touch = [touches anyObject];
    CGPoint pt = [touch locationInView:[touch view]];
    CGPoint ptConv = [[Director sharedDirector] convertCoordinate:pt];
}

Рассчитать прямоугольник элемента и сравнить ...

CGSize size = [block contentSize];
CGPoint point = [block position];
rect = CGRectMake(point.x, point.y, size.width, size.height); 

if (CGRectContainsPoint(rect, ptConv)) 
{
    // touched
}

Похоже, единственный пропущенный вами шаг - это изменение точки привязки.

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

Надеюсь, это поможет.

0 голосов
/ 23 сентября 2009

Помните, что система координат в Cocos2D вверх ногами от системы Какао. (Действительно, какао для меня перевернуто, но это просто соглашение).

Я все время забываю об этом!

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