0

加速度計を使用して、円形の境界内でスプライト (ボール) を移動しようとしています。空の画面で問題なくスプライト(ボール)を移動できます。しかし、今度は円形の境界を設定して、動きが円内に制限されるようにする必要があります。円のような画像の背景画像があります。そして、スプライト(ボール)が動いている場合、それはこの円形の画像内にのみあるはずであり、ボールが円形の画像の外に出ないようにします。円形の背景画像に境界線を設定する方法を知りたいです。私を助けてください。ありがとう。

コード:

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];
 }
4

1 に答える 1

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);
    }
}
于 2013-03-21T12:25:41.527 に答える