2013-03-20 30 views
0

我正嘗試使用加速度計在圓形邊界內移動精靈(球)。我可以毫無困難地將精靈​​(球)移動到空白屏幕上。但是現在我需要設置一個圓形邊界,以便在圓內限制運動。我有一個背景圖像,這是一種圖像的圓形類型。如果所有精靈(球)正在移動,那麼它應該只在這個圓形圖像內,我不希望球移出圓形圖像。我想知道如何在圓形背景圖像上設置邊界。請幫幫我。謝謝。如何使用cocos2d中的加速度計在圓形邊界內移動精靈

代碼:

if((self=[super init])) 
{ 
    bg=[CCSprite spriteWithFile:@"challenge-game.png"]; 
     bg.position=ccp(240,160); 
     bg.opacity=180; 
     [self addChild:bg]; 

    ball1=[CCSprite spriteWithFile:@"ball.png"]; 
    ball1.position=ccp(390,180); 
    [self addChild:ball1]; 

    ball2=[CCSprite spriteWithFile:@"ball1.png"]; 
    ball2.position=ccp(240,20); 
    [self addChild:ball2]; 

    ball3=[CCSprite spriteWithFile:@"ball2.png"]; 
    ball3.position=ccp(100,180); 
    [self addChild:ball3]; 

    size = [[CCDirector sharedDirector] winSize]; 
    self.isAccelerometerEnabled=YES; 
    [self scheduleUpdate]; 
    } 

-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration 
    { 
    ballSpeedY = acceleration.x*20; 
    ballSpeedX = -acceleration.y*10;  
    } 

-(void)updateBall1 { 
float maxY1 = size.height - ball1.contentSize.height/2; 
float minY1 = ball1.contentSize.height/2; 
float newY1 = ball1.position.y + ballSpeedY; 
newY1 = MIN(MAX(newY1, minY1), maxY1); 

float maxX1 = size.width - ball1.contentSize.width/2; 
float minX1 = ball1.contentSize.width/2; 
float newX1 = ball1.position.x + ballSpeedX; 
newX1 = MIN(MAX(newX1, minX1), maxX1); 
NSLog(@"MAXY: %f MINY: %f NEWY: %f",maxY1,minY1,newY1); 
ball1.position = ccp(newX1, newY1);  
} 

-(void)setPosition:(CGPoint)position 
{ 
float dx=position.x-240; 
float dy=position.y-160; 
float r=bg.contentSize.width/2-ball1.contentSize.width/2; 
if((dx*dx+dy*dy)>(r*r)) 
{ 
    position.x=100; 
    position.y=100; 
} 
[super setPosition:position]; 
} 

回答

0

不知道什麼剩餘的要求,但你有沒有考慮使用Box2D的和基於加速度計重力玩弄圍繞移動精靈?在這種情況下,您可以簡單地創建一個代表允許的世界的圓形對象。

如果這不合適,我猜你可以強制你的精靈位置始終在你的圓圈內(重寫setPosition並確保x和y總是帶有由數學公式給出的圓)。

像這樣的東西(請注意,你需要決定在何處放置你的球,當它是關於圓外移動):在上面的代碼

-(void) setPosition:(CGPoint)pos 
{ 
    float dx = pos.x - centerX; 
    float dy = pos.y - centerY; 

    if ((dx * dx + dy * dy) > (r * r)) 
    { 
     // Change pos.x and pos.y to stay within the circle. 
    } 

    [super setPosition:pos]; 
} 

而且,圓的半徑(r )實際上應該是你的目標圓的半徑減去你的球的半徑。

又如使用update

// In your scene/layer initialization register update callback, like this 
[self scheduleUpdate]; 


// Then modify your update method 
- (void) update:(ccTime)delta 
{ 
    // Your update logic 

    // Here you take care of your sprite. 
    float dx = ballSprite.position.x - centerX; 
    float dy = ballSprite.position.y - centerY; 

    if ((dx * dx + dy * dy) > (r * r)) 
    { 
     // Change the position of ballSprite to stay within the circle. 
     ballSprite.position = ccp(newX, newY); 
    } 
} 
+0

感謝您的答覆。沒有它的正義COCOS2D。我如何覆蓋setPosition方法?它屬於哪一類?幫我。提前致謝。 – BudHawk 2013-03-22 04:40:02

+0

'CCNode'有一個屬性'position',它由內部'setPosition:(CGPoint)'方法處理。如果您要將CCSprite擴展到您想要限制的對象,只需添加一個方法' - (void)setPosition:(CGPoint)position' implementation file(.m)。 'position'參數是精靈想要移動的目標位置。現在,確保'position.x'和'position.y'在一個圓圈內。如果不是,則更正x和y並調用'[super setPosition:position]'。 – gberginc 2013-03-22 06:00:27

+0

我正在使用CCSprite添加圖像。 – BudHawk 2013-03-22 06:39:05

相關問題