用手指在Cocos2d中旋转精灵
我需要帮助确定用手指旋转精灵。精灵旋转得很好,但是在初始触摸我的手指时,它本身以某种方式旋转了几度。用手指在Cocos2d中旋转精灵
此外,旋转仅在手指围绕精灵中心旋转时才起作用。
我试图模拟自行车车轮,并有一个齿轮精灵和一个踏板精灵作为齿轮精灵的孩子。当我触碰踏板并旋转它时,我想让自行车轮旋转。我还没有那么远。现在我正试图弄清楚如何摆脱这种装备的初始转变。
下面是完整的代码
#import "BicycleScene.h"
@implementation BicycleScene
+(id) scene
{
// 'scene' is an autorelease object.
CCScene *scene = [CCScene node];
// 'layer' is an autorelease object.
BicycleScene *layer = [BicycleScene node];
// add layer as a child to scene
[scene addChild: layer];
// return the scene
return scene;
}
-(id) init
{
if ((self=[super init])) {
CGSize winSize = [[CCDirector sharedDirector] winSize];
//place the bicycle sprite
bicycleSprite = [CCSprite spriteWithFile:@"bike_gear.png"];
bicycleSprite.position = ccp(bicycleSprite.contentSize.width/2 + 100, winSize.height/2);
[self addChild:bicycleSprite z:1];
//place the pedal sprite
pedalSprite = [CCSprite spriteWithFile:@"bike_pedal.png"];
[bicycleSprite addChild:pedalSprite z:1];
pedalSprite.position = ccp(150, 15);
//enable touch
self.isTouchEnabled = YES;
[self schedule:@selector(gameLoop:) interval:.1/100];
}
return self;
}
-(void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"Touch begun");
}
-(void)gameLoop:(ccTime) dt{
bicycleSprite.rotation = cocosAngle;
}
-(void) ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"Touch moved");
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView:[touch view]];
CGPoint previousLocation = [touch previousLocationInView:[touch view]];
CGPoint touchingPoint = [[CCDirector sharedDirector] convertToGL:location];
CGPoint previousTouchingPoint = [[CCDirector sharedDirector] convertToGL:previousLocation];
CGPoint vector = ccpSub(touchingPoint, bicycleSprite.position);
CGFloat rotateAngle = -ccpToAngle(vector);
previousAngle = cocosAngle;
cocosAngle = CC_RADIANS_TO_DEGREES(rotateAngle);
//bicycleSprite.rotation = cocosAngle;
}
@end
我稍微感到困惑,如果行:
CGPoint vector = ccpSub(touchingPoint, bicycleSprite.position);
实际上应该是:
CGPoint vector = ccpSub(touchingPoint, previousTouchingPoint);
我试过,很好,但它没没有工作。
我还上传了我的完整xcodeproj到4shared的人谁愿意到这里看看:http://www.4shared.com/file/5BaeW4oe/Healthy.html
@interface MainScene : CCLayer {
CCSprite *dial;
CGFloat dialRotation;
}
+ (id)scene;
@end
---------------------------------
@implementation MainScene
+ (id)scene
{
CCScene *scene = [CCScene node];
CCLayer *layer = [MainScene node];
[scene addChild:layer];
return scene;
}
- (id)init
{
if((self = [super init])) {
CCLOG(@"MainScene init");
CGSize size = [[CCDirector sharedDirector]winSize];
dial = [CCSprite spriteWithFile:@"dial.png"];
dial.position = ccp(size.width/2,dial.contentSize.height/2);
[self addChild:dial];
self.isTouchEnabled = YES;
[self scheduleUpdate];
}
return self;
}
- (void)dealloc
{
[super dealloc];
}
- (void)update:(ccTime)delta
{
dial.rotation = dialRotation;
}
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
}
- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
//acquire the previous touch location
CGPoint firstLocation = [touch previousLocationInView:[touch view]];
CGPoint location = [touch locationInView:[touch view]];
//preform all the same basic rig on both the current touch and previous touch
CGPoint touchingPoint = [[CCDirector sharedDirector] convertToGL:location];
CGPoint firstTouchingPoint = [[CCDirector sharedDirector] convertToGL:firstLocation];
CGPoint firstVector = ccpSub(firstTouchingPoint, dial.position);
CGFloat firstRotateAngle = -ccpToAngle(firstVector);
CGFloat previousTouch = CC_RADIANS_TO_DEGREES(firstRotateAngle);
CGPoint vector = ccpSub(touchingPoint, dial.position);
CGFloat rotateAngle = -ccpToAngle(vector);
CGFloat currentTouch = CC_RADIANS_TO_DEGREES(rotateAngle);
//keep adding the difference of the two angles to the dial rotation
dialRotation += currentTouch - previousTouch;
}
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
}
编辑:我很抱歉,我不能让这个留在代码模式。但这是解决方案,应该很容易在代码中实现。干杯!
要将文本格式设置为代码,请选择所需文本,然后单击带花括号的按钮。 – lins314159 2011-03-28 22:03:40
不错 - 谢谢 – Chev 2011-07-06 10:42:06
在ccTouchesBegan
,使用相同的代码,你在ccTouchesMoved
已经得到了确定角度,然后移动使用CCRotateTo
到那个角度。您需要一些处理用户移动他的手指,而CCRotateTo
处于活动状态,可能会停止当前操作并踢开另一个移动到新角度。
当您使用previousTouchingPoint而不是bicycleSprite.position时会发生什么?同样的行为?没有? – lins314159 2011-03-15 07:25:25
当我使用previousTouchingPoint而不是bicycleSprite.position时,齿轮也会跳跃很多,并且齿轮缓慢旋转时也会出现很多闪烁现象。 – tbag 2011-03-15 15:43:53
我刚刚测试了上面的代码,它完成了我期望的操作。问题是touchBegan没有移到正确的角度?或者它在初始移动时跳跃而不是逐渐移动到一个角度? – lins314159 2011-03-16 08:40:13