XNA рдбреНрд░рд╛ рдпрд╛ рдПрдХ рдХрдг рдкреНрд░рдгрд╛рд▓реА рд▓рд┐рдЦреЗрдВред рднрд╛рдЧ I

рдФрд░ рдлрд┐рд░, рд╣реЗрдмреНрд░рд╛рд╡реЗрдЯреНрд╕ рдХреЛ рдирдорд╕реНрдХрд╛рд░!

рдХреБрдЫ рджрд┐рдиреЛрдВ рдкрд╣рд▓реЗ - рдореИрдВрдиреЗ XNA рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреВрд▓ рдЧреЗрдо рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╢реБрд░реВ рдХреА , рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдкрдирд╛ рд╕реНрдЯреВрдбрд┐рдпреЛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЦреБрдж рдХреЛ 2 рдбреА рдЧреЗрдо рддрдХ рд╕реАрдорд┐рдд рдХрд░ рд▓реЗрдВрдЧреЗред

рдЗрд╕ рдмрд╛рд░, рд╣рдо рдбреНрд░рд╛ рдкрд░ рдПрдХ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рд░рдЦреЗрдВрдЧреЗ рдФрд░ рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рдХрдг рд╕рд┐рд╕реНрдЯрдо рд▓рд┐рдЦреЗрдВрдЧреЗред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдХреМрди рд╕реЗ рд╡рд┐рд╖рдп рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ:

рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рдореИрдВ рдмрддрд╛рдКрдВрдЧрд╛:

рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдкрд╣рд▓реЗ рд╕рд┐рджреНрдзрд╛рдВрдд, рдлрд┐рд░ рдХреЛрдб pies ред

SpriteBatch.Begin () рд╡рд┐рдзрд┐



рд╣рдордиреЗ рдЪрд░реНрдЪрд╛ рдХреА рдХрд┐ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдХреИрд╕реЗ рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЖрдЗрдП рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдЦреЗрдВ:

spriteBatch.Begin ()


spriteBatch.Begin(SpriteSortMode, BlendState, SamplerState, DepthStencilState, RasterizerState, Effect, Matrix); 


рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд╕реНрдХреНрд░реАрди рдкрд░ рдХреБрдЫ рдХреИрд╕реЗ рдЦреАрдВрдЪрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдЕрдВрддрд┐рдо рд╡рд┐рдзрд┐ рдЕрдзрд┐рднрд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рд╣рдо рд╕рдм рдХреБрдЫ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

SpriteSortMode - рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ред рдХреБрдЫ рднреА рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИред

BlendState рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

Additive - "рдПрдбрд┐рдЯрд┐рд╡ рдорд┐рдХреНрд╕" рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧред рд╕реНрдкреНрд░рд╛рдЗрдЯ рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рддрд╛ рд╣реИред


AlphaBlend - "рдЕрд▓реНрдлрд╛ рдорд┐рд╢реНрд░рдг" рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧред рд╕реБрдкрд░рдЗрдореЛрдЬрд╝ рдПрдХ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреВрд╕рд░реЗ рдкрд░ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХрд░рддрд╛ рд╣реИред


NonPremultiplied - "рдЧреИрд░- premultipled рдЕрд▓реНрдлрд╛ рдХреЗ рд╕рд╛рде рд╕рдореНрдорд┐рд╢реНрд░рдг" рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧ, рдбреНрд░рд╛ рдЕрд▓реНрдлрд╛ рдЕрд▓реНрдлрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рджреВрд╕рд░реЗ рдкрд░ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИред


рдЕрдкрд╛рд░рджрд░реНрд╢реА - "рдЕрдкрд╛рд░рджрд░реНрд╢реА рдорд┐рд╢реНрд░рдг" рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░рдирд╛, рдПрдХ рдХреЛ рджреВрд╕рд░реЗ рдкрд░ рдлреИрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ "рдУрд╡рд░рд░рд╛рдЗрдЯрд┐рдВрдЧ"ред


SamplerState рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
AnisotropicClamp - anisotropic рдЫрд╛рдирдиреЗ рдФрд░ TextureUV - рдХреНрд▓реИрдВрдк рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ
AnisotropicWrap - anisotropic рдЫрд╛рдирдиреЗ рдФрд░ TextureUV - рд▓рдкреЗрдЯреЗрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ
...

рдореЛрдЯреЗ рддреМрд░ рдкрд░, рдХреНрд▓реИрдореНрдк - рдмрдирд╛рд╡рдЯ рдХреЛ рдлреИрд▓рд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдЯрд╛рдИрд▓реНрд╕ (рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ)ред

рд╣рдо рдмрдирд╛рд╡рдЯ 55x20 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ (рдХреНрд▓реИрдВрдк) рдкрд╛рдВрдЪ рдмрд╛рд░ рдлреИрд▓рд╛рддреЗ рд╣реИрдВ, рдЕрдВрддрд░ рдЕрдирд┐рд╕реЛрдЯреНрд░реЛрдкрд┐рдХ / рд░реИрдЦрд┐рдХ, рдкреНрд╡рд╛рдЗрдВрдЯ :

рдЕрдирд┐рд╕реЛрдЯреНрд░реЛрдкрд┐рдХ / рд░реИрдЦрд┐рдХ :


рдмрд┐рдВрджреБ :


рдбреЗрдкреНрде рд╕реНрдЯреИрдВрд╕рд┐рд▓рд╕реНрдЯреЗрдЯ - рдлрд┐рд░ рд╕реЗ рдЫрдВрдЯрдиреА, рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред
RasterizerState - 2D рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдкреНрд░рднрд╛рд╡ - рдПрдХ рд╢реЗрдбрд░ (рдкреНрд░рднрд╛рд╡) рдЬреЛ рдЦреАрдВрдЪреА рдЧрдИ рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ред
рдореИрдЯреНрд░рд┐рдХреНрд╕ - рдПрдХ рд╡рд╕реНрддреБ рдкрд░рд┐рд╡рд░реНрддрди рдореИрдЯреНрд░рд┐рдХреНрд╕ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк 2 рдбреА рдХреИрдорд░рд╛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)

рдЙрд╕ рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рд╢реБрд░реБрдЖрддреА рдФрд░ рдЕрдВрдд рдХреЗ рдмреАрдЪ рд╢рд╛рдорд┐рд▓ рд╣реИред

SpriteBatch.Draw () рд╡рд┐рдзрд┐



 spriteBatch.Draw(Texture2D texture, Vector2D position, Rectangle sourceDest, Color color, float angle, Vector2D origin, Vector2D scale, SpriteEffects effects, float layerDepth); 


рдмрдирд╛рд╡рдЯ - рдмрдирд╛рд╡рдЯ рд╣реА, рдЬрд┐рд╕реЗ рд╣рдо рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред

рд╕реНрдерд┐рддрд┐ - рд╕реНрдХреНрд░реАрди рдкрд░ рд╕реНрдерд┐рддрд┐ (рджреБрдирд┐рдпрд╛, рдЕрдЧрд░ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИ, рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ: "рдХреИрдорд░рд╛")ред

sourceDest - рдмрдирд╛рд╡рдЯ рд╕реЗ рдПрдХ рдЖрдпрдд (рдмрдирд╛рд╡рдЯ рдХрд╛ рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рдЬреЛ рд╣рдо рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдпрджрд┐ рд╕рднреА, рддреЛ рдирдпрд╛ рдЖрдпрдд (0, 0, width_texture, height_texture )

рд░рдВрдЧ - рд╡рд╕реНрддреБ рдХрд╛ рд░рдВрдЧред

рдХреЛрдг - рдШреБрдорд╛рд╡ рдХрд╛ рдХреЛрдгред

рдЙрддреНрдкрддреНрддрд┐ - рдмрдирд╛рд╡рдЯ рдХреА рддрдерд╛рдХрдерд┐рдд рдСрдлрд╕реЗрдЯ рдпрд╛ "рджреНрд░рд╡реНрдпрдорд╛рди рдХрд╛ рдХреЗрдВрджреНрд░"ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ NxM рдкрд┐рдХреНрд╕реЗрд▓ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рд╡рдЯ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИред

рд╕реНрдХреЗрд▓ - X рдФрд░ Y рдореЗрдВ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЖрдХрд╛рд░

рдкреНрд░рднрд╛рд╡ - рдПрдХ рдмрдирд╛рд╡рдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рднрд╛рд╡, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдЖрдк рдЗрд╕рдХреА рджрд░реНрдкрдг рдЫрд╡рд┐ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЗрдпрд░рдбреЗрдк - рдкрд░рдд рдХреА рдЧрд╣рд░рд╛рдИред

рдореБрдЦреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ - рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ред

рдХрдг рдкреНрд░рдгрд╛рд▓реА



рдЪрд▓реЛ рдХрдгреЛрдВ рдХреА рдПрдХ рд╕рд░рд▓ рдкреНрд░рдгрд╛рд▓реА рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдПрдХ рдирд┐рд╢рд╛рди (рдирд┐рд╢рд╛рди, рдЯреНрд░реЗрди, рдкреВрдВрдЫ) рд╣реИ, рдЬреЛ рдорд╛рдЙрд╕ рдХреЗ рдЖрдВрджреЛрд▓рди рд╕реЗ рд░рд╣реЗрдЧрд╛ред

рдЕрдЧрд▓рд╛ рдХреЛрдб рд╣реИред

рд╣рдо рдПрдХ рдирдпрд╛ рдХрдг рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ, рдпрд╣ рд╣рдорд╛рд░рд╛ рдПрдХрд▓ рдХрдг (рдзреБрдЖрдВ, рдЪрд┐рдВрдЧрд╛рд░реА, рдкреИрд╕рд╛ ) рд╣реЛрдЧрд╛, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Media; using System.Diagnostics; namespace ParticleSystem { public class Particle { public Texture2D Texture { get; set; } //    public Vector2 Position { get; set; } //   public Vector2 Velocity { get; set; } //   public float Angle { get; set; } //    public float AngularVelocity { get; set; } //   public Vector4 Color { get; set; } //   public float Size { get; set; } //  public float SizeVel { get; set; } //    public float AlphaVel { get; set; } //    public int TTL { get; set; } //    public Particle(Texture2D texture, Vector2 position, Vector2 velocity, float angle, float angularVelocity, Vector4 color, float size, int ttl, float sizeVel, float alphaVel) //  { Texture = texture; Position = position; Velocity = velocity; Angle = angle; Color = color; AngularVelocity = angularVelocity; Size = size; SizeVel = sizeVel; AlphaVel = alphaVel; TTL = ttl; } public void Update() //   { TTL--; //    //       Position += Velocity; Angle += AngularVelocity; Size += SizeVel; Color = new Vector4(Color.X, Color.Y, Color.Z, Color.W - AlphaVel); //  . ,    Vector4,    Color,  : Color.R/G/B   Byte ( 0x00  0xFF),     ,  float  Vector4 } public void Draw(SpriteBatch spriteBatch) { Rectangle sourceRectangle = new Rectangle(0, 0, Texture.Width, Texture.Height); //   :  Vector2 origin = new Vector2(Texture.Width / 2, Texture.Height / 2); //  spriteBatch.Draw(Texture, Position, sourceRectangle, new Color(Color), Angle, origin, Size, SpriteEffects.None, 0); //   } } } 


рдЕрдм, рдЖрдкрдХреЛ рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЦреЗрд▓ рдХреЗ рд╕рднреА рдХрдгреЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░реЗ, рдЪрд▓реЛ рдЗрд╕реЗ рдХрдг рдХрдг рдХрд╣рддреЗ рд╣реИрдВ, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реВрдЪреА:

 using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Media; using System.Diagnostics; namespace ParticleSystem { class ParticleController { public List<Particle> particles; private Texture2D dot; //   private Texture2D smoke; //   private Random random; public ParticleController() { this.particles = new List<Particle>(); random = new Random(); } public void LoadContent(ContentManager Manager) { dot = Manager.Load<Texture2D>("spark"); smoke = Manager.Load<Texture2D>("smoke"); } public void EngineRocket(Vector2 position) // ,     { for (int a = 0; a < 2; a++) //  2     { Vector2 velocity = AngleToV2((float)(Math.PI * 2d * random.NextDouble()), 0.6f); float angle = 0; float angleVel = 0; Vector4 color = new Vector4(1f, 1f, 1f, 1f); float size = 1f; int ttl = 40; float sizeVel = 0; float alphaVel = 0; GenerateNewParticle(smoke, position, velocity, angle, angleVel, color, size, ttl, sizeVel, alphaVel); } for (int a = 0; a < 1; a++) //  1    { Vector2 velocity = AngleToV2((float)(Math.PI * 2d * random.NextDouble()), .2f); float angle = 0; float angleVel = 0; Vector4 color = new Vector4(1.0f, 0.5f, 0.5f, 0.5f); float size = 1f; int ttl = 80; float sizeVel = 0; float alphaVel = .01f; GenerateNewParticle(dot, position, velocity, angle, angleVel, color, size, ttl, sizeVel, alphaVel); } for (int a = 0; a < 10; a++) //  10 ,    тАФ     { Vector2 velocity = Vector2.Zero; float angle = 0; float angleVel = 0; Vector4 color = new Vector4(1.0f, 0.5f, 0.5f, 1f); float size = 0.1f + 1.8f * (float)random.NextDouble(); int ttl = 10; float sizeVel = -.05f; float alphaVel = .01f; GenerateNewParticle(smoke, position, velocity, angle, angleVel, color, size, ttl, sizeVel, alphaVel); } } private Particle GenerateNewParticle(Texture2D texture, Vector2 position, Vector2 velocity, float angle, float angularVelocity, Vector4 color, float size, int ttl, float sizeVel, float alphaVel) //    { Particle particle = new Particle(texture, position, velocity, angle, angularVelocity, color, size, ttl, sizeVel, alphaVel); particles.Add(particle); return particle; } public void Update(GameTime gameTime) { for (int particle = 0; particle < particles.Count; particle++) { particles[particle].Update(); if (particles[particle].Size <= 0 || particles[particle].TTL <= 0) //         ,   { particles.RemoveAt(particle); particle--; } } } public void Draw(SpriteBatch spriteBatch) { spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Additive); //    Addictive for (int index = 0; index < particles.Count; index++) //    { particles[index].Draw(spriteBatch); } spriteBatch.End(); } public Vector2 AngleToV2(float angle, float length) { Vector2 direction = Vector2.Zero; direction.X = (float)Math.Cos(angle) * length; direction.Y = -(float)Math.Sin(angle) * length; return direction; } } } 


рдФрд░ рдореБрдЦреНрдп рд╡рд░реНрдЧ рдореЗрдВ, рд╣рдо рд▓реЛрдбрдХреЙрдиреНрдЯреЗрдВрдЯ, рдЕрдкрдбреЗрдЯ, рдЙрдкрдпреБрдХреНрдд рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдбреНрд░рд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЙрд╕реА рд╕рдордп рдкреНрд░рддреНрдпреЗрдХ рдЕрджреНрдпрддрди рдХреЗ рд▓рд┐рдП рдХрдгреЛрдВ рдХреА рдкреАрдврд╝реА рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

 particleController.EngineRocket(new Vector2(Mouse.GetState().X, Mouse.GetState().Y)); 


рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдорд╛рдЙрд╕ рдХреЛ рд╣рд┐рд▓рд╛рддреЗ рд╣реИрдВ, рдкреНрд░рд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ:


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдРрд╕реА рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдФрд░ рднреА рд╕реБрдВрджрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд╢реЗрдб рдЬреЛрдбрд╝реЗрдВред рд▓реЗрдХрд┐рди рд▓реЗрдЦ рдХрд╛ рдЖрдпрддрди рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╢реЗрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред

рдореИрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдбреЗрдореЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдВред

рдЕрдЧрд▓реА рдмрд╛рд░ рддрдХ;)

UPD: рд▓реЗрдЦ рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧред

Source: https://habr.com/ru/post/In128286/


All Articles