在cocos2d中捏时如何缩放精灵?

时间:2011-04-05 11:42:06

标签: cocos2d-iphone

我正在开发一个应用程序,我必须显示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 个答案:

答案 0 :(得分:9)

最终我得到了解决方案,在这里它

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);
    }
}

答案 1 :(得分:2)

为了放大我工作的游戏,我使用一个类的组合来捕获捏合输入和一个类来将屏幕视为视口。这里真正的“秘密酱”是视口。

您需要将屏幕视为“框中的框”并应用线性变换来在屏幕的像素空间和游戏中对象的“游戏空间”之间进行映射。我通常在游戏中使用Box2D,所以游戏都是“米”。

视口的工作方式如下图所示: Viewport Concept

将世界空间限制(Wxmin,Wxmax)映射到屏幕坐标(0,Sxmax)的一般方法是通过y = mx + b公式的线性映射完成的。鉴于转型的两个已知点:

Wxmin(米)映射到(像素)0和 Wxmax(米)映射到(像素)Sxmax 求解y0 = m x0 + b和y1 = m x1 + b1得出:

m = Sxmax /(Wxmax-Wxmin)和 b = -Wxmin * Sxmax /(Wxmax - Wxmin)(= -m * Wxmin) 我们用x维度的尺度*(Wxmax-Wxmin)代替(Wxmax-Wxmin),在y维度上用*(Wymax-Wymin)/ aspectRatio代替。

值(Wxmax - Wxmin)= scale * 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(像素与米的比率),这是将屏幕空间(像素)中某些东西的大小映射到游戏中的某些内容的方法空间(米)。 这允许您在放大/缩小时动态更改精灵的大小。

有一篇大文章介绍了此here以及github上的代码。

这有用吗?