84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
我现在用cocos2d引擎设计游戏,并加载了全部的精灵(sprite),但是由于一部分精灵高度要大于320像素,所以很难将它们完全加载进来。为了方便,我打算实现ZOOM IN和ZOOM out效果,ZOOM IN可以瞬间让全部精灵最小化,ZOOM out则会让它们恢复最初的状态。 怎么样才能创造出这种效果吗?同时,希望大家也可以为我讲一下有关pinch zoom的内容。
原问题:Applying Zoom Effect In cocos2D gaming environment?
业精于勤,荒于嬉;行成于思,毁于随。
答: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 zoom UITouch* 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);
答:Michael Fredrickson
(最佳答案)
想实现zoom的效果很容易,只要设定游戏的main layer的scale属性即可,但是仍然有一些细节需要注意。
在缩放layer时,会整体提高layer的位置,如果在游戏中想要实现滚动的效果,你需要作出如下设定:
可以将layer中的anchorPoint设定成ccp(0.0f, 0.0f),然后算出layer上升的距离,再重新设定参数,让它回复原状。
实现Pinch zoom很简单,只要检测touchesMoved,然后调用滚动路线(scaling routine)即可。
答:Andrew
如果所有的精灵都来自同一个parent,你可以将其进行缩放设置,协调不同parent,保证它们之间的关联性。
答:mohammad alabid
以下代码可以将layer的位置缩放2倍,