我正在开发一个应用程序,我必须显示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'
请帮帮我........
答案 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,所以游戏都是“米”。
视口的工作方式如下图所示:
将世界空间限制(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(像素与米的比率),这是将屏幕空间(像素)中某些东西的大小映射到游戏中的某些内容的方法空间(米)。 这允许您在放大/缩小时动态更改精灵的大小。
这有用吗?