objective-c - Cocos2d中如何实现zoom效果?

浏览:41日期:2023-12-18

问题描述

我现在用cocos2d引擎设计游戏,并加载了全部的精灵(sprite),但是由于一部分精灵高度要大于320像素,所以很难将它们完全加载进来。为了方便,我打算实现ZOOM IN和ZOOM out效果,ZOOM IN可以瞬间让全部精灵最小化,ZOOM out则会让它们恢复最初的状态。怎么样才能创造出这种效果吗?同时,希望大家也可以为我讲一下有关pinch zoom的内容。

原问题:Applying Zoom Effect In cocos2D gaming environment?

问题解答

回答1:

答:Michael Fredrickson(最佳答案)想实现zoom的效果很容易,只要设定游戏的main layer的scale属性即可,但是仍然有一些细节需要注意。在缩放layer时,会整体提高layer的位置,如果在游戏中想要实现滚动的效果,你需要作出如下设定:可以将layer中的anchorPoint设定成ccp(0.0f, 0.0f),然后算出layer上升的距离,再重新设定参数,让它回复原状。

- (void) scale:(CGFloat) newScale scaleCenter:(CGPoint) scaleCenter { // scaleCenter is the point to zoom to.. // If you are doing a pinch zoom, this should be the center of your pinch. // Get the original center point. CGPoint oldCenterPoint = ccp(scaleCenter.x * yourLayer.scale, scaleCenter.y * yourLayer.scale); // Set the scale. yourLayer.scale = newScale; // Get the new center point. CGPoint newCenterPoint = ccp(scaleCenter.x * yourLayer.scale, scaleCenter.y * yourLayer.scale); // Then calculate the delta. CGPoint centerPointDelta = ccpSub(oldCenterPoint, newCenterPoint); // Now adjust your layer by the delta. yourLayer.position = ccpAdd(yourLayer.position, centerPointDelta);}

实现Pinch zoom很简单,只要检测touchesMoved,然后调用滚动路线(scaling routine)即可。

- (void) ccTouchesMoved:(NSSet*)touches withEvent:(UIEvent*)event { // Examine allTouches instead of just touches. Touches tracks only the touch that is currently moving... // But stationary touches still trigger a multi-touch gesture. NSArray* allTouches = [[event allTouches] allObjects]; if ([allTouches count] == 2) { // Get two of the touches to handle the zoomUITouch* touchOne = [allTouches objectAtIndex:0];UITouch* touchTwo = [allTouches objectAtIndex:1];// Get the touches and previous touches.CGPoint touchLocationOne = [touchOne locationInView: [touchOne view]];CGPoint touchLocationTwo = [touchTwo locationInView: [touchTwo view]]; CGPoint previousLocationOne = [touchOne previousLocationInView: [touchOne view]];CGPoint previousLocationTwo = [touchTwo previousLocationInView: [touchTwo view]];// Get the distance for the current and previous touches.CGFloat currentDistance = sqrt( pow(touchLocationOne.x - touchLocationTwo.x, 2.0f) +pow(touchLocationOne.y - touchLocationTwo.y, 2.0f));CGFloat previousDistance = sqrt(pow(previousLocationOne.x - previousLocationTwo.x, 2.0f) + pow(previousLocationOne.y - previousLocationTwo.y, 2.0f));// Get the delta of the distances.CGFloat distanceDelta = currentDistance - previousDistance;// Next, position the camera to the middle of the pinch.// Get the middle position of the pinch.CGPoint pinchCenter = ccpMidpoint(touchLocationOne, touchLocationTwo);// Then, convert the screen position to node space... use your game layer to do this.pinchCenter = [yourLayer convertToNodeSpace:pinchCenter];// Finally, call the scale method to scale by the distanceDelta, pass in the pinch center as well.// Also, multiply the delta by PINCH_ZOOM_MULTIPLIER to slow down the scale speed. // A PINCH_ZOOM_MULTIPLIER of 0.005f works for me, but experiment to find one that you like.[self scale:yourlayer.scale - (distanceDelta * PINCH_ZOOM_MULTIPLIER) scaleCenter:pinchCenter]; } }

答:Andrew如果所有的精灵都来自同一个parent,你可以将其进行缩放设置,协调不同parent,保证它们之间的关联性。

答:mohammad alabid以下代码可以将layer的位置缩放2倍,

[layer setScale:2];layer.position=ccp(240/2+40,160*1.5);double dx=(touchLocation.x*2-240);double dy=(touchLocation.y*2-160);layer.position=ccp(inGamePlay.position.x-dx,inGamePlay.position.y-dy);

相关文章: