2

私はいくつかの SKSpriteNodes があり、ユーザーが指の動きでそれらを打つことができるゲームを作ろうとしています。私はアップルの新しいスプライト キットを使用しています。

それを行うために、私はトリックを試しました - スプライトを配置します - 指がある場所に "X" (SKSpriteNode) を配置し、ユーザーが指を動かすと、この X スプライトの位置を変更します。

問題は、それが動いていない場合にのみ他のスプライトに当たることです.他のスプライトが動いている指の現在の速度に反応するようにしたいです-指の動きが速いほど、衝突が強くなるはずです.

助けていただけますか?

  • このトリックはこれを行う正しい方法ではないと感じていますが、コードも投稿しています。

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        if([touches count]==1)
        {
            self.X= [[SKSpriteNode alloc]initWithImageNamed:@"X"];
            self.X.name= @"X";
            UITouch *t= touches.allObjects[0];          
    
            self.X.position= [t locationInNode:self.GameNode];
            self.X.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:20];
            self.X.physicsBody.dynamic=YES; // Tried NO too...
            self.X.zPosition=1;
    
            [self.GameNode addChild:self.X];
        }
    }
    -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    {
        UITouch *t = touches.allObjects[0];
        self.X.position = [t locationInNode:self.GameNode];
    }
    -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
    {
        [self.X removeFromParent];
    }
    
4

3 に答える 3

8

いろいろ調べて実験した結果、やっと答えが出ました!

ソリューションの最初のステップはAyatollahAndyによって提供されました- 影響点を見つけます:

SKNode *node = [self nodeAtPoint:location];

この行は、指定された場所でヒットしたノードを取得します。nil が返された場合は、何もヒットしていません。

次に、オブジェクトを「ヒット」させたいので、ApplyImpulse が必要です。

[node.physicsBody applyImpulse:CGVectorMake(thrustV.x, thrustV.y) atPoint:location];

ここでは、衝撃点で作成したベクトルを使用してインパルスを適用したことがわかります。それだけです。かなり簡単です。これが他の人に役立つことを願っています。

共有は思いやりです。私の投稿を読んでくれてありがとう。

于 2013-10-25T09:21:02.337 に答える
0

これを実際に実行する時間はありませんでしたが、次のようなものはどうでしょうか: 上記のようにノード X を配置することを気にしないでください。

touchesBegan では、タッチの時間と位置を追跡します

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self];

    //store location of first touch
    self.firstTouch = location;

    //get time
    self.startTouch = [NSDate date];
}

touchesMoved で、いずれかのノードに触れたかどうかを確認します。触れている場合は、タッチの開始位置と終了位置に基づいて角度と速度を計算し、影響を受けたノードに速度を適用しますか?

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self];
    SKNode *node = [self nodeAtPoint:location];

    //if you've touched one of your nodes
    if ([node.name isEqualToString:@"whateverNode"]) {
     //work out time between touches
     NSTimeInterval timeBetween = [[NSDate date] timeIntervalSinceDate:self.startTouch];

     //work out angle between touches (if you want to send the impacted node in that direction)
     float angle = atan2f (location.y - self.firstTouch.y, location.x - self.firstTouch.y) ;

     //apply to node
     CGFloat thrust = 0.01/timeBetween; 

     CGPoint thrustVector = CGPointMake(thrust*cosf(angle),
               thrust*sinf(angle));
     [node.physicsBody applyTorque:thrustVector];
    }
}

最後の物理ビットは (完全に) 正しくない可能性があることに注意してください。

于 2013-10-10T20:43:34.733 に答える
0

このようなことができます。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    touchOn=YES;
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self.parent];
    touchPos =location;
    [self.physicsBody setVelocity:CGVectorMake(0, 0)];

}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    touchOn=YES;
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self.parent];
    touchPos =location;
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    touchOn=NO;
}
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    touchOn=NO;
}
-(void)update:(NSTimeInterval)dt {
    if (touchOn) {
        CGVector vector = CGVectorMake((touchPos.x-self.position.x)/dt, (touchPos.y-self.position.y)/dt);
        self.physicsBody.velocity=vector;
    }
}

ノードをサブクラス化し、時間の変化とともにシーンから更新を受け取る update というメソッドを作成します。また、touches メソッドを追加して、現在のタッチ位置を追跡します。

于 2013-11-20T20:56:52.797 に答える