Проблема с Retina и ccTouchBegan в Cocos2D - PullRequest
0 голосов
/ 10 июня 2011

Я работал в xCode над игрой в cocos2D, и у меня есть одна проблема, которую я не могу решить.

По сути, я использую SneakyButton, который представляет собой пользовательский класс, который захватывает события касания, поэтому вы можете использоватьфайл PNG или радиус круга, чтобы что-то сделать.В моем случае огонь пули.

Когда я запускаю проект на устройстве в режиме SD (масштаб 1x) для iOS (для сетчатки до iPhone 4) отображается все работает нормально.

Однако, когда я запускаю проект в режиме дисплея Retina (2-кратный масштаб) на устройстве ... Я устанавливаю масштаб 2X в делегате для приложения.PNG можно увидеть.Все работает отлично, за исключением касаний, которые не отображаются.

Я сузил его до этой части кода.

'
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    if (active) return NO;

    CGPoint location = [[CCDirector sharedDirector] convertToGL:[touch locationInView:[touch view]]];
    location = [self convertToNodeSpace:location];
        //Do a fast rect check before doing a circle hit check:
    if(location.x < -radius || location.x > radius || location.y < -radius || location.y > radius){
        return NO;
    }else{
        float dSq = location.x*location.x + location.y*location.y;
        if(radiusSq > dSq){
            active = YES;
            if (!isHoldable && !isToggleable){
                value = 1;
                [self schedule: @selector(limiter:) interval:rateLimit];
            }
            if (isHoldable) value = 1;
            if (isToggleable) value = !value;
            return YES;
        }
    }
return NO;
}
'
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event
{
    if (!active) return;

    CGPoint location = [[CCDirector sharedDirector] convertToGL:[touch locationInView:[touch view]]];
    location = [self convertToNodeSpace:location];
        //Do a fast rect check before doing a circle hit check:
    if(location.x < -radius || location.x > radius || location.y < -radius || location.y > radius){
        return;
    }else{
        float dSq = location.x*location.x + location.y*location.y;
        if(radiusSq > dSq){
            if (isHoldable) value = 1;
        }
        else {
            if (isHoldable) value = 0; active = NO;
        }
    }
}
'
- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
{
    if (!active) return;
    if (isHoldable) value = 0;
    if (isHoldable||isToggleable) active = NO;
}

- (void)ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event
{
    [self ccTouchEnded:touch withEvent:event];
}

@end
'

Я думаю, что моя проблема в радиусе части кода ... Кто-нибудь сталкивался с этим раньше, или у вас есть какие-либо идеи о том, какую часть этого кода мне нужно модифицировать, чтобы он работал?Это мой последний камень преткновения перед завершением этого 6-месячного проекта!Помогите!Спасибо заранее!

1 Ответ

0 голосов
/ 10 июня 2011

где вы устанавливаете радиус?или как ты это получил?Если вы получаете радиус из самого png-файла, убедитесь, что вы используете ограничивающий прямоугольник для радиуса, а не для параметра sizeize, который дает радиус спрайта до применения любого масштабирования.

...