Вам не нужно писать много кода, чтобы мяч отскакивал от края экрана. Физическая среда может справиться со всем вышеперечисленным, вам просто нужно правильно создать экземпляры спрайтов.
Во-первых, вам нужно будет установить физику сцены как таковую:
self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
В файле .h вашей сцены создайте две категории битовых масок:
static const uint8_t ballCategory = 1;
static const uint8_t wallCategory = 2;
И присвойте физическому телу сцены категорию:
self.physicsBody.categoryBitMask = wallCategory;
Затем создайте свой спрайт:
SKSpriteNode *spriteNode = [SKSpriteNode spriteNodeWithImageNamed:@"ball.png"];
spriteNode.name = @"ball";
spriteNode.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:25];
spriteNode.position = CGPointMake(10.0,10.0); //or anything you want
spriteNode.physicsBody.dynamic = YES;
spriteNode.physicsBody.affectedByGravity = NO;
spriteNode.physicsBody.categoryBitMask = ballCategory;
spriteNode.physicsBody.collisionBitMask = wallCategory;
spriteNode.physicsBody.restitution = 1.0;
spriteNode.physicsBody.friction = 0.0;
spriteNode.physicsBody.linearDamping = 0.0;
spriteNode.physicsBody.angularDamping = 0.0;
[self addChild:spriteNode];
Вместо того, чтобы давать spriteNode [SKAction moveTo: duration:]
, примените импульс к его физическому телу.
CGVector impulse = CGVectorMake(1.0,1.0);
[spriteNode.physicsBody applyImpulse:impulse];
И вуаля! Мяч будет отскакивать от стен, и ничто его не остановит.
Вот как должен выглядеть файл .h:
#import <SpriteKit/SpriteKit.h>
static const uint8_t ballCategory = 1;
static const uint8_t wallCategory = 2;
@interface BallBounce : SKScene
@end
А вот как должен выглядеть файл .m:
#import "BallBounce.h"
@implementation BallBounce
-(instancetype)initWithSize:(CGSize)size
{
if (self = [super initWithSize:size])
{
self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
self.physicsBody.categoryBitMask = wallCategory;
SKSpriteNode *spriteNode = [SKSpriteNode spriteNodeWithColor:[UIColor greenColor] size:CGSizeMake(50, 50)];
spriteNode.name = @"ball";
spriteNode.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:25];
spriteNode.position = CGPointMake(10.0,10.0); //or anything you want
spriteNode.physicsBody.dynamic = YES;
spriteNode.physicsBody.affectedByGravity = NO;
spriteNode.physicsBody.categoryBitMask = ballCategory;
spriteNode.physicsBody.collisionBitMask = wallCategory;
spriteNode.physicsBody.restitution = 1.0;
spriteNode.physicsBody.friction = 0.0;
spriteNode.physicsBody.linearDamping = 0.0;
spriteNode.physicsBody.angularDamping = 0.0;
[self addChild:spriteNode];
CGVector impulse = CGVectorMake(100.0,100.0);
[spriteNode.physicsBody applyImpulse:impulse];
}
return self;
}
@end
person
ZeMoon
schedule
05.12.2013