Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«iOS. ΠŸΡ€ΠΈΠ΅ΠΌΡ‹ программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 35

Автор Π’Π°Π½Π΄Π°Π΄ Нахавандипур

/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π²ΠΈΠ΄Ρ‹ */

NSUInteger const NumberOfViews = 2;


self.squareViews = [[NSMutableArray alloc] initWithCapacity: NumberOfViews];

NSArray *colors = @[[UIColor redColor], [UIColor greenColor]];


CGPoint currentCenterPoint = self.view.center;

CGSize eachViewSize = CGSizeMake(50.0f, 50.0f);

for (NSUInteger counter = 0; counter < NumberOfViews; counter++){


UIView *newView =

[[UIView alloc] initWithFrame:

CGRectMake(0.0f, 0.0f, eachViewSize.width, eachViewSize.height)];


newView.backgroundColor = colors[counter];

newView.center = currentCenterPoint;


currentCenterPoint.y += eachViewSize.height + 10.0f;


[self.view addSubview: newView];


[self.squareViews addObject: newView];


}


self.animator = [[UIDynamicAnimator alloc]

initWithReferenceView: self.view];


/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ тяготСниС */

UIGravityBehavior *gravity = [[UIGravityBehavior alloc]

initWithItems: self.squareViews];

[self.animator addBehavior: gravity];


/* Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ столкновСний */

UICollisionBehavior *collision = [[UICollisionBehavior alloc]

initWithItems: self.squareViews];

collision.translatesReferenceBoundsIntoBoundary = YES;

[self.animator addBehavior: collision];

}


ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΊΠ°ΠΊ Π½Π° рис. 2.1.


Рис. 2.1. Π’Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ повСдСния тяготСния ΠΈ столкновСния


Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ обнаруТСния столкновСний Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ, Ссли свойство translatesReferenceBoundsIntoBoundary ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ YES. Но Ρ‡Ρ‚ΠΎ, Ссли ΠΌΡ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΡ‡Π΅Ρ€Ρ‚ΠΈΡ‚ΡŒ собствСнныС Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ столкновСний? Π—Π΄Π΅ΡΡŒ ΠΈ пригодится ΠΌΠ΅Ρ‚ΠΎΠ΄ экзСмпляра addBoundaryWithIdentifier: fromPoint: toPoint:, относящийся ΠΊ повСдСнию столкновСния. Π’ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ слСдуСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ этому ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ:

β€’ addBoundaryWithIdentifier β€” строковый ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ для вашСй Π³Ρ€Π°Π½ΠΈΡ†Ρ‹. Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ впослСдствии Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ столкновСнии. Π’Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ boundaryWithIdentifier: ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π² ΠΎΡ‚Π²Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ относится ΠΊ Ρ‚ΠΈΠΏΡƒ UIBezierPath ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ довольно слоТныС, сильно искривлСнныС Π³Ρ€Π°Π½ΠΈΡ†Ρ‹. Но Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ программистов ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ простыС Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠ»ΠΈ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈ сдСлаСм;

β€’ fromPoint β€” Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹, относится ΠΊ Ρ‚ΠΈΠΏΡƒ CGPoint;

β€’ toPoint β€” конСчная Ρ‚ΠΎΡ‡ΠΊΠ° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹, относится ΠΊ Ρ‚ΠΈΠΏΡƒ CGPoint.


Π˜Ρ‚Π°ΠΊ, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ провСсти Π³Ρ€Π°Π½ΠΈΡ†Ρƒ Π² Π½ΠΈΠΆΠ½Π΅ΠΉ части ΠΎΠΏΠΎΡ€Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π²ΠΈΠ΄Π° с ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠΌ), Π½ΠΎ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° совпадала с Π½ΠΈΠΆΠ½ΠΈΠΌ ΠΊΡ€Π°Π΅ΠΌ. ВмСсто этого Π²Π°ΠΌ Π½ΡƒΠΆΠ½Π° Π³Ρ€Π°Π½ΠΈΡ†Π°, располоТСнная Π½Π° 100 Ρ‚ΠΎΡ‡Π΅ΠΊ Π²Ρ‹ΡˆΠ΅ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ края. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС свойство повСдСния столкновСния translatesReferenceBoundsIntoBoundary Π½Π΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΈΠ½ΡƒΡŽ Π³Ρ€Π°Π½ΠΈΡ†Ρƒ, Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΡƒΡŽ с ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ ΠΎΠΏΠΎΡ€Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°. НуТно Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ addBoundaryWithIdentifier: fromPoint: toPoint:, Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:


/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ столкновСний */

UICollisionBehavior *collision = [[UICollisionBehavior alloc]

initWithItems: self.squareViews];

[collision

addBoundaryWithIdentifier:@"bottomBoundary"

fromPoint: CGPointMake(0.0f, self.view.bounds.size.height β€” 100.0f)

toPoint: CGPointMake(self.view.bounds.size.width,

self.view.bounds.size.height β€” 100.0f)];


[self.animator addBehavior: collision];


Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли ΠΌΡ‹ объСдиним это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ с тяготСниСм, ΠΊΠ°ΠΊ Π΄Π΅Π»Π°Π»ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅, Ρ‚ΠΎ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ°Π΄Π°Ρ‚ΡŒ Π² ΠΎΠΏΠΎΡ€Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ свСрху Π²Π½ΠΈΠ·, Π½ΠΎ Π½Π΅ достигнут Π΅Π³ΠΎ Π΄Π½Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ провСдСнная Π½Π°ΠΌΠΈ ниТняя Π³Ρ€Π°Π½ΠΈΡ†Π° находится Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅. Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… этого Ρ€Π°Π·Π΄Π΅Π»Π° я Ρ‚Π°ΠΊΠΆΠ΅ Ρ…ΠΎΡ‡Ρƒ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ обнаруТСния столкновСний ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ элСмСнтами, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΠΌΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ столкновСния. Класс UICollisionBehavior ΠΈΠΌΠ΅Π΅Ρ‚ свойство collisionDelegate, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ Π² качСствС Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° ΠΏΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ столкновСний Ρƒ элСмСнтов, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ столкновСния. Π­Ρ‚ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚-Π΄Π΅Π»Π΅Π³Π°Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ UICollisionBehaviorDelegate. Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π’ΠΎΡ‚ Π΄Π²Π° Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΈΠ· этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²:

β€’ collisionBehavior: beganContactForItem: withBoundaryIdentifier: atPoint: β€” вызываСтся Π² Π΄Π΅Π»Π΅Π³Π°Ρ‚Π΅, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· элСмСнтов, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ столкновСния, ударяСтся ΠΎΠ± ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π³Ρ€Π°Π½ΠΈΡ†, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… ΠΊ этому повСдСнию;

β€’ collisionBehavior: endedContactForItem: withBoundaryIdentifier: atPoint: β€” вызываСтся, ΠΊΠΎΠ³Π΄Π° элСмСнт, ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ²ΡˆΠΈΠΉΡΡ с Π³Ρ€Π°Π½ΠΈΡ†Π΅ΠΉ, отскочил ΠΎΡ‚ Π½Π΅Π΅ ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ элСмСнта с Π³Ρ€Π°Π½ΠΈΡ†Π΅ΠΉ прСкратился.


Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π°ΠΌ Π΄Π΅Π»Π΅Π³Π°Ρ‚ Π² дСйствии ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ€Π°ΡΡˆΠΈΡ€ΠΈΠΌ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΠΊΠΈ Π΄ΠΎΡΡ‚ΠΈΠ³Π°ΡŽΡ‚ Π½ΠΈΠΆΠ½Π΅ΠΉ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΎΠΏΠΎΡ€Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°, ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ ΠΈΡ… красными, ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ Π½Π° 200 %, Π° ΠΏΠΎΡ‚ΠΎΠΌ заставляСм Ρ€Π°ΡΡΡ‹ΠΏΠ°Ρ‚ΡŒΡΡ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ Π²Π·Ρ€Ρ‹Π²Π΅, ΠΈ ΠΈΡΡ‡Π΅Π·Π°Ρ‚ΡŒ ΠΈΠ· Π²ΠΈΠ΄Ρƒ:


NSString *const kBottomBoundary = @"bottomBoundary";


@interface ViewController () <UICollisionBehaviorDelegate>

@property (nonatomic, strong) NSMutableArray *squareViews;

@property (nonatomic, strong) UIDynamicAnimator *animator;

@end


@implementation ViewController


β€” (void)collisionBehavior:(UICollisionBehavior*)paramBehavior

beganContactForItem:(id <UIDynamicItem>)paramItem

withBoundaryIdentifier:(id <NSCopying>)paramIdentifier

atPoint:(CGPoint)paramPoint{


NSString *identifier = (NSString *)paramIdentifier;


if ([identifier isEqualToString: kBottomBoundary]){


[UIView animateWithDuration:1.0f animations: ^{

UIView *view = (UIView *)paramItem;


view.backgroundColor = [UIColor redColor];

view.alpha = 0.0f;

view.transform = CGAffineTransformMakeScale(2.0f, 2.0f);

} completion: ^(BOOL finished) {

UIView *view = (UIView *)paramItem;

[paramBehavior removeItem: paramItem];

[view removeFromSuperview];

}];


}


}


β€” (void)viewDidAppearBOOL)animated{

[super viewDidAppear: animated];


/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π²ΠΈΠ΄Ρ‹ */

NSUInteger const NumberOfViews = 2;


self.squareViews = [[NSMutableArray alloc] initWithCapacity: NumberOfViews];

NSArray *colors = @[[UIColor redColor], [UIColor greenColor]];


CGPoint currentCenterPoint = CGPointMake(self.view.center.x, 0.0f);

CGSize eachViewSize = CGSizeMake(50.0f, 50.0f);

for (NSUInteger counter = 0; counter < NumberOfViews; counter++){


UIView *newView =

[[UIView alloc] initWithFrame:

CGRectMake(0.0f, 0.0f, eachViewSize.width, eachViewSize.height)];


newView.backgroundColor = colors[counter];

newView.center = currentCenterPoint;


currentCenterPoint.y += eachViewSize.height + 10.0f;

[self.view addSubview: newView];


[self.squareViews addObject: newView];


}


self.animator = [[UIDynamicAnimator alloc]

initWithReferenceView: self.view];


/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ тяготСниС */

UIGravityBehavior *gravity = [[UIGravityBehavior alloc]

initWithItems: self.squareViews];

[self.animator addBehavior: gravity];


/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ столкновСний */

UICollisionBehavior *collision = [[UICollisionBehavior alloc]

initWithItems: self.squareViews];

[collision

addBoundaryWithIdentifier: kBottomBoundary

fromPoint: CGPointMake(0.0f, self.view.bounds.size.height β€” 100.0f)

toPoint: CGPointMake(self.view.bounds.size.width,

self.view.bounds.size.height β€” 100.0f)];

collision.collisionDelegate = self;


[self.animator addBehavior: collision];


}


Объясню, Ρ‡Ρ‚ΠΎ происходит Π² ΠΊΠΎΠ΄Π΅. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΡ‹ создаСм Π΄Π²Π° Π²ΠΈΠ΄Π° ΠΈ ΠΊΠ»Π°Π΄Π΅ΠΌ ΠΈΡ… ΠΎΠ΄ΠΈΠ½ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π­Ρ‚ΠΈ Π²ΠΈΠ΄Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π΄Π²Π° ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ€Π°Π·Π½ΠΎΡ†Π²Π΅Ρ‚Π½Ρ‹Ρ… ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°: Π²Ρ‚ΠΎΡ€ΠΎΠΉ находится Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ. Оба ΠΎΠ½ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΊ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρƒ Π²ΠΈΠ΄Π°. Как ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, ΠΌΡ‹ добавляСм ΠΊ Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€Ρƒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ тяготСния. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ анимация Π½Π°Ρ‡Π½Π΅Ρ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ, Π²ΠΈΠ΄Ρ‹ станут ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ ΡΠΏΠΎΠ»Π·Π°Ρ‚ΡŒ ΠΏΠΎ ΠΎΠΏΠΎΡ€Π½ΠΎΠΌΡƒ Π²ΠΈΠ΄Ρƒ свСрху Π²Π½ΠΈΠ·. ΠœΡ‹ Π½Π΅ Π·Π°Π΄Π°Π΅ΠΌ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΎΠΏΠΎΡ€Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° Π² качСствС Π³Ρ€Π°Π½ΠΈΡ† столкновСния, Π° ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌ Π³Ρ€Π°Π½ΠΈΡ†Ρƒ столкновСния, располагая Π΅Π΅ Π² 100 Ρ‚ΠΎΡ‡ΠΊΠ°Ρ… Π½Π°Π΄ Π½ΠΈΠΆΠ½Π΅ΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅ΠΉ экрана. Π£ нас получаСтся нСвидимая линия, проходящая ΠΏΠΎ экрану слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ. Она Π½Π΅ позволяСт Π²ΠΈΠ΄Π°ΠΌ бСсконСчно ΠΏΠ°Π΄Π°Ρ‚ΡŒ Π²Π½ΠΈΠ· ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ ΠΎΠΏΠΎΡ€Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΌΡ‹ Π·Π°Π΄Π°Π΅ΠΌ Π²ΠΈΠ΄ с ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠΌ Π² качСствС Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° повСдСния столкновСния. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ обновлСния ΠΎΡ‚ этого повСдСния, ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‰ΠΈΠ΅, ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ Π»ΠΈ столкновСниС ΠΈ Ссли ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ, Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π°. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ ΠΎ Ρ„Π°ΠΊΡ‚Π΅ столкновСния, Ρ‚ΠΎ, вСроятно, Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π±Ρ‹Π»ΠΎ Π»ΠΈ это столкновСниС с Π³Ρ€Π°Π½ΠΈΡ†Π΅ΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, созданной Π½Π°ΠΌΠΈ) ΠΈΠ»ΠΈ с ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· элСмСнтов сцСны. НапримСр, Ссли Π²Ρ‹ создали Π² ΠΎΠΏΠΎΡ€Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ мноТСство Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… стСн, Π° малСнькиС Π²ΠΈΠ΄Ρ‹-ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ с этими стСнами, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½ΠΎΠΉ эффСкт (скаТСм, Π²Π·Ρ€Ρ‹Π²), зависящий ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, с Ρ‡Π΅ΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ столкновСниС. О Ρ‚ΠΎΠΌ, с ΠΊΠ°ΠΊΠΈΠΌ элСмСнтом ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ столкновСниС, Π²Ρ‹ смоТСтС ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΈΠ· Π΄Π΅Π»Π΅Π³Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅ Π²ΠΈΠ΄Π° ΠΈ Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚ΠΎΠΉ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ столкнулся элСмСнт. Зная, ΠΊΠ°ΠΊΠΎΠΉ это Π±Ρ‹Π» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ дальшС.