ユーザーが画面の左側または右側に触れたかどうかに応じて、SKNode を左右に移動したいゲームがあります。ユーザーが画面に触れている間、一定の動きをノードに適用するにはどうすればよいですか?
10 に答える
ivar を追加します。
CGPoint velocity;
モーションを設定します。たとえば、右に移動します。
velocity.x = 5;
ステップごとに速度を積分する:
-(void) update:(NSTimeInterval)currentTime
{
CGPoint pos = self.position;
pos.x += velocity.x;
pos.y += velocity.y;
self.position = pos;
}
追伸: アクションは時間ベース、つまり特定の期間後に終了することになっているため、連続操作、特に移動には悪いことで有名です。しかし、目的地に到着する前にアクションの時間がなくなったらどうなるでしょうか?
物理的な力またはアクションを使用するかどうかによって異なります。
このようなもの
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
for (UITouch *touch in touches) {
UITouch* touch = [touches anyObject];
CGPoint loc = [touch locationInNode:self];
if (loc.x > self.frame.size.width * 0.5) {
NSLog(@"move right");
// move the sprite using an action
// or set physics body and apply a force
}
else {
NSLog(@"move left");
}
}
}
アクションを使用する場合は、touchesEndedで、移動中のスプライトからすべてのアクションを削除します。
touchesBeganで小さな力を適用している場合、スプライトは停止するはずです。
がある場合SKNode
はphysicsBody
、それに力を加えます。
@interface GameScene()
@property (nonatomic) CGVector force;
@end
@implementation GameScene
- (void)update:(CFTimeInterval)currentTime {
[self.player.physicsBody applyForce:self.force];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
self.sideForce = CGVectorMake(3000, 0);
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
self.sideForce = CGVectorMake(0, 0);
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
self.sideForce = CGVectorMake(0, 0);
}
@end
そうでない場合は、LearnCocos2D の回答を使用してください。
物理ボディの速度プロパティを使用します。変数 right は、タッチのポイントからオブジェクト (この場合は自分自身) を差し引いたもので、関連する速度を提供します。
-(void)segmentedTouchBegan:(NSValue *)p{
CGPoint point = [p CGPointValue];
int right = (point.x - self.screenWidth/2.0f)/ABS((point.x - self.screenWidth/2.0f)); //1 if right -1 if left
self.physicsBody.velocity = CGVectorMake(SHIFT*right, 0);
}
-(void)segmentedTouchMoved:(NSValue *)p{
CGPoint point = [p CGPointValue];
int right = (point.x - self.screenWidth/2.0f)/ABS((point.x - self.screenWidth/2.0f)); //1 if right -1 if left
self.physicsBody.velocity = CGVectorMake(SHIFT*right, 0);
}
-(void)segmentedTouchEnded:(NSValue *)p{
self.physicsBody.velocity = CGVectorMake(0, 0);
}
左から右への固定位置でモーションを停止する必要がある場合。
これはSwiftとobjective-cの場合です。
あなたはphysicsBodyで使用する必要があります:
node.position = CGPoint(X: ..... , Y: .....) node.physicsBody = nil