Как увеличить спрайты при сжатии в cocos2d? - PullRequest
3 голосов
/ 05 апреля 2011

Я работаю над приложением, в котором мне нужно отобразить от 50 до 70 изображений (спрайтов). У меня есть свиток, который будет прокручивать все эти изображения, но я также хочу увеличить эти изображения, также я следовал "http://ganbarugames.com/2010/12/detecting-touch-events-in-cocos2d-iphone/" этот учебник. Я хочу в точности то же самое, но этот учебник сделал эту функцию масштабирования только для одного спрайта, но я хочу, чтобы на каждом спрайте, что мне делать? Пожалуйста, помогите мне?

-(void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event
  {
    CGPoint touchPoint = [touch locationInView:[touch view]];

    touchPoint = [[CCDirector sharedDirector]convertToGL:touchPoint];
   self.position = ccp((-(currentScreen-1)*scrollWidth)+(touchPoint.x-startSwipe),0);

--> NSArray *touchArray = [touches allObjects];
if([touchArray count] > 1)
{
    UITouch *fingerOne = [touchArray objectAtIndex:0];
    UITouch *fingerTwo = [touchArray objectAtIndex:1];

    CGPoint pointOne = [fingerOne locationInView:[fingerOne view]];
    CGPoint pointTwo = [fingerTwo locationInView:[fingerTwo view]];

pointOne = [[CCDirector sharedDirector] convertToGL:pointOne];
    pointTwo = [[CCDirector sharedDirector] convertToGL:pointTwo];

    float distance = sqrt(pow(pointOne.x - pointTwo.x, 2.0) + pow(pointOne.y - pointTwo.y, 2.0));

    float scale = distance / [CCDirector sharedDirector].winSize.width * 5;
    [backgroundScroll setScale:scale];
}

} вот код, который я использую, но он показывает мне стрелку, упомянутую в коде, что «UITouch» может не отвечать на -allObjects '

пожалуйста, помогите мне ........

Ответы [ 2 ]

9 голосов
/ 06 апреля 2011

наконец, я получил решение, и вот оно

UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(makepinch:)];  

[[[CCDirector sharedDirector] openGLView] addGestureRecognizer:pinch];

поместите его код в ваш метод init, а затем добавьте

-(void)makepinch:(UIPinchGestureRecognizer*)pinch
{
    if(pinch.state == UIGestureRecognizerStateEnded)
    {

        currentScale = pinch.scale;
    }
    else if(pinch.state == UIGestureRecognizerStateBegan && currentScale != 0.0f)
    {

        pinch.scale = currentScale;
    }
    if(pinch.scale != NAN && pinch.scale != 0.0)
    {
        pinch.view.transform = CGAffineTransformMakeScale(pinch.scale, pinch.scale);
    }
}
2 голосов
/ 09 декабря 2013

Для масштабирования игр, над которыми я работаю, я использую комбинацию класса a, чтобы захватить ввод с помощью пинча, и класса, который рассматривает экран как окно просмотра.Настоящим «секретным соусом» здесь является область просмотра.

Вам нужно обращаться с экраном, как будто это «прямоугольник в коробке», и применять линейные преобразования для отображения между пиксельным пространствомэкран и «игровое пространство» объектов в вашей игре.Я обычно использую Box2D под игрой, поэтому все игры в «метрах».

Окно просмотра работает так, как показано на схеме ниже: Viewport Concept

Общий метод отображения границ мирового пространства(Wxmin, Wxmax) на координаты экрана (0, Sxmax) осуществляется путем линейного отображения с формулировкой ay = mx + b.Учитывая две известные точки для преобразования:

Wxmin (метры) отображается на (пиксель) 0, а Wxmax (метры) отображается на (пиксель) Sxmax Solving y0 = m x0 + b и y1 = m x1 + b1 дает:

m = Sxmax / (Wxmax - Wxmin) и b = -Wxmin * Sxmax / (Wxmax - Wxmin) (= -m * Wxmin) Заменим (Wxmax - Wxmin)с масштабом * (Wxmax-Wxmin) для измерения x и масштабом * (Wymax-Wymin) / aspectRatio в измерении y.

Значение (Wxmax - Wxmin) = масштаб * worldSizeMeters (xDimension)

Значение Wxmin = центр области просмотра - 1/2 ширины области просмотра

и т. Д.

В коде:

void Viewport::CalculateViewport()
{
   // Bottom Left and Top Right of the viewport
   _vSizeMeters.width = _vScale*_worldSizeMeters.width;
   _vSizeMeters.height = _vScale*_worldSizeMeters.height/_aspectRatio;

   _vBottomLeftMeters.x = _vCenterMeters.x - _vSizeMeters.width/2;
   _vBottomLeftMeters.y = _vCenterMeters.y - _vSizeMeters.height/2;
   _vTopRightMeters.x = _vCenterMeters.x + _vSizeMeters.width/2;
   _vTopRightMeters.y = _vCenterMeters.y + _vSizeMeters.height/2;

   // Scale from Pixels/Meters
   _vScalePixelToMeter.x = _screenSizePixels.width/(_vSizeMeters.width);
   _vScalePixelToMeter.y = _screenSizePixels.height/(_vSizeMeters.height);

   // Offset based on the screen center.
   _vOffsetPixels.x = -_vScalePixelToMeter.x * (_vCenterMeters.x - _vScale*_worldSizeMeters.width/2);
   _vOffsetPixels.y = -_vScalePixelToMeter.y * (_vCenterMeters.y - _vScale*_worldSizeMeters.height/2/_aspectRatio);

   _ptmRatio = _screenSizePixels.width/_vSizeMeters.width;

   Notifier::Instance().Notify(Notifier::NE_VIEWPORT_CHANGED);

}

Сам класс Viewport предоставляет методыдля вычисления точек из одного пространства в другое, а также для вычисления ptmRatio (отношение пикселей к метрам), которое отображает размер чего-либо в пространстве экрана (в пикселях) на что-то в игровом пространстве (в метрах). Это позволяет вам динамически изменять размер ваших спрайтов при увеличении / уменьшении.

Существует большая статья, описывающая здесь и код github .

Было ли это полезно?

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