рджреВрд╕рд░реЗ рджрд┐рди рдореИрдВрдиреЗ рдЗрд╕
рдкреЛрд╕реНрдЯ рдХреЛ рд╡рд┐рдВрдбреЛрдЬ рдлреЛрди рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рджреЗрдЦрд╛, рдФрд░, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВрдиреЗ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдФрд░ рдПрдХреНрд╕рдПрдирдП рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдкрд░ рдПрдХ рднреА рд▓реЗрдЦ рдирд╣реАрдВ рджреЗрдЦрд╛ред рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╢рд╛рдирджрд╛рд░ рдЕрд╡рд╕рд░ рдореИрдВрдЧреЛ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде рдЖрдпрд╛ред
рдореИрдВ рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рднрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдФрд░ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛:
- рдЙрд╕реА рдкреГрд╖реНрда рдкрд░ рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдФрд░ XNA рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
- XNA рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЬреЗрд╕реНрдЪрд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ
- XNA рдХреИрдорд░рд╛ рдмреЗрд╕рд┐рдХреНрд╕
рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
рд╕реНрдЯрд╛рд╕ рдкрд╛рд╡рд▓реЛрд╡ рдХреА рд╢рд╛рдо рдХреЗ рд╕реНрдХреВрд▓ рдХреА рдкрд╣рд▓реА рдзрд╛рд░рд╛
рдХреЗ рд▓рд┐рдП рдЖрдЧрдВрддреБрдХреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдЗрдП рдкрд╣рд▓реЗ рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдЖрд╡реЗрджрди рдореЗрдВ рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдФрд░ XNA рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИред
рдпрд╣ рдбреЗрд╡рд▓рдкрд░ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИ?
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЧреЗрдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ:
- рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рд╕реЗ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рддреНрд╡рд░рд┐рдд UI рдирд┐рд░реНрдорд╛рдг
- рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреГрд╖реНрдареЛрдВ рдХреЗ рдмреАрдЪ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди
- рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдорд╛рдЬрд┐рдХ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП WebClient рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
- рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдорд┐рд╢реНрд░рдг рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдирд╛
рдФрд░ рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╕рднреА рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдФрд░ рдПрдХреНрд╕рдПрдирдП рджреЛрдиреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рднреА рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рди рдХреЗрд╡рд▓ рдЧреЗрдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, XNA рдореЗрдВ рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрднреБрдд рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЬреЗрд╕реНрдЪрд░ рд╕рдорд░реНрдерди рдФрд░ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╣реИрдВред рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдФрд░ XNA рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЧреИрд░-рдЧреЗрдорд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
рд╣реЙрд▓рд┐рдбреЗ рдлреЛрдЯреЛ рд╣реИ ред
рд╣рд╛рдЙрдЯреЛ: рдкрд╣рд▓рд╛ рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ + XNA рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдмрд╣реБрдд рдкреНрд░рд╕рд┐рджреНрдз рдЧрдгрд┐рддреАрдп рдЧреЗрдо рд▓рд╛рдЗрдл рдХреЛ рдЪреБрдирд╛, рдЬрд┐рд╕реЗ рдмрд╛рд░-рдмрд╛рд░ рд╣реИрдмреЗ (
1 ,
2 ,
3 рдФрд░ рдХрдИ рдЕрдиреНрдп) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЦреЗрд▓ рдПрдХ
"рд╢реВрдиреНрдп-рдЦрд┐рд▓рд╛рдбрд╝реА рдЦреЗрд▓" рд╣реИ , рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗрд╡рд▓ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ рдкреАрдврд╝реА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд╢рд┐рдХрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЖрда рдЖрд╕рдкрд╛рд╕ рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреА рдЬрд╛рддреА рд╣реИред
рдореИрдВ рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ 2 рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдФрд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреЛрд╕реНрдЯ рдирд╣реАрдВ рд╣реИред рддреЛ рдПрдХ рдЗрд╖реНрдЯрддрдо рдФрд░ рддреЗрдЬ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрдкрдХреЗ рд╣реЛрдорд╡рд░реНрдХ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛрдЧрд╛ред
рдЪрд░рдг 1. рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдирд╛ рдФрд░ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рдирд╛
рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп, рдЖрдкрдХреЛ
"Windows Phone Silverlight рдФрд░ XNA Application" рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред 2
рдореЗрдирдкреЗрдЬ рдФрд░
рдЧреЗрдордкреЗрдЬ рдкреЗрдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдореЗрдирдкреЗрдЬ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреЗрдЬ рд╣реИ рдЬрд┐рд╕ рдкрд░ "рдЧреЗрдо рдкреЗрдЬ рдореЗрдВ рдмрджрд▓реЗрдВ" рдмрдЯрди рд╕реНрдерд┐рдд рд╣реИ, рдЬрдм рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ
рдЧреЗрдордкреЗрдЬ рдкреЗрдЬ
рддрджрдиреБрд╕рд╛рд░ рдЦреБрд▓рддрд╛ рд╣реИред
GamePage рд╕рд┐рд░реНрдл рд╣рдорд╛рд░рд╛ XNA рдкреЗрдЬ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕рдХреА xaml рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдкреГрд╖реНрда рд▓реЗрдЖрдЙрдЯ рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реЛрдЧреА:
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм рд╣рдо рдЗрд╕ рдкреГрд╖реНрда рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛, рдЖрдЗрдП рдЗрд╕реЗ
рд╕реНрдЯрд╛рд░реНрдЯ рдмрдЯрди рджрдмрд╛рдХрд░ рдХрд░реЗрдВред
<Grid Name="Layout" LayoutUpdated="Layout_LayoutUpdated"> <Button Content="Start" Height="71" Name="button1" Width="160" Margin="25,717,295,12" Click="button1_Click" /> </Grid>
рдЖрдЗрдП рдЕрдм рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, "
рдЧреЗрдо рдкреЗрдЬ рдореЗрдВ рдмрджрд▓реЗрдВ " рдмрдЯрди рджрдмрд╛рдПрдВ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдиреАрд▓реА рд╕реНрдХреНрд░реАрди рджреЗрдЦреЗрдВ, рд╣рдорд╛рд░рд╛ рдмрдЯрди рдХрд╣реАрдВ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЪрд┐рдВрддрд╛ рдХреА рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рдЕрдм рд╣рдо рдЗрд╕реЗ рдареАрдХ рдХрд░ рджреЗрдВрдЧреЗред
рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ GamePage.xaml.cs, рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ XNA рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рднреА рддрд░реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ UIElementRenderer рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
UIElementRenderer uiRenderer;
рдЕрдм рдбреНрд░рд╛рдЗрдВрдЧ рдЪрдХреНрд░ рдореЗрдВ рд╣рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдФрд░ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
private void OnDraw(object sender, GameTimerEventArgs e) { SharedGraphicsDeviceManager.Current.GraphicsDevice.Clear(Color.White); uiRenderer.Render(); spriteBatch.Begin(); spriteBatch.Draw(uiRenderer.Texture, Vector2.Zero, Color.White); spriteBatch.End();
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛, рд╣рдордиреЗ uiRenderer рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрд╣реАрдВ рднреА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдХрдИ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВред рдореИрдВ рд╣рдорд╛рд░реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЕрдкрдбреЗрдЯ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рд░реЗрдВрдбрд░рд░ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рдпрджрд┐ рдпрд╣ рдЕрдиреБрдкрд╕реНрдерд┐рдд рдпрд╛ рдЕрд╕рдВрдЧрдд рд╣реИ, рддреЛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдПрдВ:
GamePage.xaml
<Grid Name="Layout" LayoutUpdated="Layout_LayoutUpdated">
GamePage.xaml.cs
private void Layout_LayoutUpdated(object sender, EventArgs e) { int width = (int)ActualWidth; int height = (int)ActualHeight;
рдЕрдм рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдПрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░рд╛ рдмрдЯрди рдЕрдм рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдЪрд▓рд┐рдП рдЕрдм рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рдмрдирд╛рддреЗ рд╣реИрдВред
2. XNA рдЖрдЙрдЯрдкреБрдЯ
рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдХреНрд╖реЗрддреНрд░ рдЖрдХрд╛рд░ рдореЗрдВ 100x100 рд╕реЗрд▓ рд╣реЛрдЧрд╛, рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ 30x30 рдкрд┐рдХреНрд╕реЗрд▓ред рдХреБрд▓ рд╣рдорд╛рд░рд╛ рдХреНрд╖реЗрддреНрд░ 3000x3000 рдкрд┐рдХреНрд╕реЗрд▓ рдХрд╛ рд╣реЛрдЧрд╛ред
рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╡рд░реНрдЧ рдмрдирд╛рдПрдБ:
public class Area { Texture2D point; Rectangle line; public Area(Texture2D point) { this.point = point; } public void Draw(SpriteBatch spriteBatch) { for (int i = 0; i < 100; i++) { line = new Rectangle(i*30, 0, 1, 3000); spriteBatch.Draw(point, line, Color.White); line = new Rectangle( 0, i*30, 3000, 1); spriteBatch.Draw(point, line, Color.White); } } }
XNA рдореЗрдВ рдПрдХ рд░реЗрдЦрд╛ рдЦреАрдВрдЪрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдХрд┐рд╕реА рднреА рд░рдВрдЧ рдпрд╛ рдмрдирд╛рд╡рдЯ рд╕реЗ рднрд░реА рдЖрдпрдд рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рд╣рдо 100 рдХреНрд╖реИрддрд┐рдЬ рдФрд░ 100 рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд░реЗрдЦрд╛рдПрдВ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдмрд┐рдВрджреБ рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рд╛рде рдмрд╛рдврд╝ рдореЗрдВ 1x1 рдЖрдХрд╛рд░ рдХреА рдХрд╛рд▓реА рдмрд┐рдВрджреА рдХреЗ рд╕рд╛рде рд╣реЛрддреА рд╣реИред
рдЕрдм рдЪрд▓рд┐рдП GamePage.xaml.cs рдореЗрдВ рд╣рдорд╛рд░реЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдмрдирд╛рдПрдБ рдФрд░ рдЖрд░рдВрдн рдХрд░реЗрдВ:
Texture2D point; Area area;
рдПрдХ рд╕рд╛рде XNA рдФрд░ рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд▓реЛрдбрд┐рдВрдЧ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╢реБрджреНрдз XNA рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рд▓реЛрдбрдХреЙрдиреНрдЯреЗрдВрдЯ) рдореЗрдВ рдерд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдк рдЬрдм рдЪрд╛рд╣реЗрдВ рддрдм рдЧреЗрдо рд╕рд╛рдордЧреНрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЧреНрд░рд╛рдлрд┐рдХ рд╕рд╛рдордЧреНрд░реА рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗрдЯ XNA рд░реЗрдВрдбрд░рд┐рдВрдЧ рдореЛрдб рдореЗрдВ рд╣реЛ (SetSharingMode рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ)ред рдпрджрд┐ рдЖрдк рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдЧреНрд░рд╛рдлрд┐рдХ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдЧрд╛ред рдЬрдм рдЖрдкрдиреЗ ContentManager рдмрдирд╛рдпрд╛ рд╣реЛ, рддреЛ рдЖрдк рдХрд┐рд╕реА рднреА рд╕рдордп рдЧреИрд░-рдЧреНрд░рд╛рдлрд╝рд┐рдХ рд╕рд╛рдордЧреНрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЖрдорддреМрд░ рдкрд░ OnNavigatedTo рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рд▓реЛрдб рдХрд░рддрд╛ рд╣реВрдВ:
protected override void OnNavigatedTo(NavigationEventArgs e) {
рдЕрдм OnDraw рд╡рд┐рдзрд┐ рдореЗрдВ рд╣рдорд╛рд░реЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдбреНрд░рд╛ рдХрд░реЗрдВ:
private void OnDraw(object sender, GameTimerEventArgs e) { SharedGraphicsDeviceManager.Current.GraphicsDevice.Clear(Color.CornflowerBlue); uiRenderer.Render(); spriteBatch.Begin(); area.Draw(spriteBatch) spriteBatch.End(); spriteBatch.Begin(); spriteBatch.Draw(uiRenderer.Texture, Vector2.Zero, Color.White); spriteBatch.End();
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВ рдПрдХ рдЕрд▓рдЧ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдмреИрдЪ рдореЗрдВ рдХреНрд╖реЗрддреНрд░ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ - рдореИрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдмрддрд╛рдКрдВрдЧрд╛ред
рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ: рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдмрдЯрди рдлрд╝реАрд▓реНрдб рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЪрд▓реЛ рдЫреЛрдЯреЗ рдХреЙрд╕реНрдореЗрдЯрд┐рдХ рдмрджрд▓рд╛рд╡ рдХрд░рддреЗ рд╣реИрдВ: рдмрдЯрди рдХреЗ рдиреАрдЪреЗ рдПрдХ рдкрд╛рд░рджрд░реНрд╢реА рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рдлреЗрдж рдмрдирд╛рдПрдВред
GamePage.xaml:
<Grid Name="Layout" LayoutUpdated="Layout_LayoutUpdated"> <Rectangle Height="100" HorizontalAlignment="Left" Margin="0,700,0,0" Name="rectangle1" Stroke="Black" StrokeThickness="1" VerticalAlignment="Top" Width="480" Fill="#B1000000" /> <Button Content="Start" Height="71" Name="button1" Width="160" Margin="25,717,295,12" Click="button1_Click" /> <Button Content="1 gen" Height="72" HorizontalAlignment="Left" Margin="254,716,0,0" Name="button2" VerticalAlignment="Top" Width="160" Click="button2_Click" /> </Grid>
GamePage.xaml.cs:
private void OnDraw(object sender, GameTimerEventArgs e) { SharedGraphicsDeviceManager.Current.GraphicsDevice.Clear(Color.White); uiRenderer.Render(); ...
3. рдЗрд╢рд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
XNA рдлреНрд░реЗрдорд╡рд░реНрдХ 10 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЗрд╢рд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдХрд╣рд╛рдиреА рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рдпреЛрдЧреНрдп рд╣реИ (рдЬреЛ рдореИрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ)ред рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ, рд╣рдо 2 рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрд╢рд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ: рдЯреИрдк (рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ) рдФрд░ рдлреНрд░реАрдбреНрд░реИрдЧ (рдлреНрд░реА рдореВрд╡рдореЗрдВрдЯ)ред
рд╣рдорд╛рд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЕрдВрдХ рдЬреЛрдбрд╝рдХрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдпрд╣рд╛рдВ рдбреЙрдЯреНрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдХреЛрдб рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛, рдЖрдк рд▓реЗрдЦ рдХреЗ рдирд┐рдЪрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рд╣рдо рдХреЗрд╡рд▓ AddDot рдкрджреНрдзрддрд┐ рдореЗрдВ рд░реБрдЪрд┐ рд▓реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдВрдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
public void AddDot(int x, int y, Vector2 shift) { DotX = (int)(x / DotSize ); DotY = (int)(y / DotSize ); DotsNow[DotX, DotY] = !DotsNow[DotX, DotY]; }
рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ, рд╣рдо рд╕реНрдкрд░реНрд╢ рдмрд┐рдВрджреБ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рдо рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╕реЗрд▓ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ OnNavigatedTo () рд╡рд┐рдзрд┐ рдореЗрдВ рдЬреЗрд╕реНрдЪрд░ рд╕рдорд░реНрдерди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
TouchPanel.EnabledGestures = GestureType.Tap | GestureType.FreeDrag;
рдЕрдм рдЖрдк рдЙрдиреНрд╣реЗрдВ OnUpdate рд▓реВрдк рдореЗрдВ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
private void OnUpdate(object sender, GameTimerEventArgs e) { while (TouchPanel.IsGestureAvailable) { GestureSample gesture = TouchPanel.ReadGesture(); if (gesture.GestureType == GestureType.Tap) { dots.AddDot((int)gesture.Position.X, (int)gesture.Position.Y); } } }
рдСрдирдбреНрд░рд╛рд╡ () рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реНрдХреНрд░реАрди рдкрд░ рд╣рдорд╛рд░реЗ рдЬреАрд╡рд┐рдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:
dots.Draw(spriteBatch);
рдпрджрд┐ рдЖрдк рдЕрднреА рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдмрд┐рдВрджреБ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рддреБрд░рдВрдд рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдЕрджреНрдпрддрди рдЧрддрд┐ рд╣реИред рдбреЙрдЯреНрд╕ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рджреЗрд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпреВрдкреАрдбреЗрдЯ ()ред рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЗрд╕ рд╡рд┐рд▓рдореНрдм рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:
i++; if (IsGameStarted && Math.IEEERemainder(i, 15) == 0) { i = 0; dots.Update(); }
рдЬрд╣рд╛рдБ IsGameStarted рдПрдХ рдзреНрд╡рдЬ рд╣реИ рдЬреЛ рдкреНрд░рд╛рд░рдВрдн рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рдореВрд▓реНрдп рдмрджрд▓рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рд╣реЛрдорд╡рд░реНрдХ рдЧреЗрдордЯрд╛рдЗрдо рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЗрд░реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЦреЗрд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдореИрджрд╛рди рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯрд╛ рд╣рд┐рд╕реНрд╕рд╛ рджреЗрдЦрддреЗ рд╣реИрдВред рдЪрд▓реЛ рдЗрд╕реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд▓реЗ рдЬрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдареАрдХ рдХрд░реЗрдВред
4. рдХреИрдорд░реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
рд╕рд░рд▓рддрдо рд╕рдиреНрдирд┐рдХрдЯрди рдореЗрдВ, рдПрдХ рдХреИрдорд░рд╛ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдПрдХ рдЫрд╡рд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реНрдХреНрд░реАрди рдкрд░ рд╣рдорд╛рд░реЗ рдЦреЗрд▓ рдХреА рджреБрдирд┐рдпрд╛ рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдХрдИ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП CreateScale (), CreateTranslation (), CreateRotationX ()ред рдмрд╕ CreateTranslation () рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЦреЗрд▓ рдХреА рджреБрдирд┐рдпрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрдирд╛рдиреЗ рдХреА рдХрд┐рддрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
while (TouchPanel.IsGestureAvailable) { GestureSample gesture = TouchPanel.ReadGesture(); if (gesture.GestureType == GestureType.Tap) { dots.AddDot((int)gesture.Position.X, (int)gesture.Position.Y, totalShift); } if (gesture.GestureType == GestureType.FreeDrag) { shift = gesture.Delta; totalShift += shift; } } matrix *= Matrix.CreateTranslation(totalShift.X, totalShift.Y, 0);
рдлрд┐рд░ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рдкреНрд░рдХреНрд╖реЗрдкрдг рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдкреНрд░рд╛рдЗрдЯ рдмреИрдЪ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкрд╛рд╕ рдХрд░реЗрдВ:
spriteBatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null, matrix); area.Draw(spriteBatch); dots.Draw(spriteBatch); spriteBatch.End();
рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рджреВрд╕рд░реЗ рд╕реНрдкреНрд░рд╛рдЗрдЯрдмреИрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА: рдпрджрд┐ рд╣рдо рд╕рднреА рдПрдХ рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░рд╛ рдмрдЯрди рдПрдХ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рднреА рдЪрд▓реЗрдЧрд╛, рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рд╣реЛрдорд╡рд░реНрдХ - рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдЧреЗрдо рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЛ рдПрдХ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдмреИрдЪ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред
рдПрдХ рд╕рдорд╕реНрдпрд╛ рдмрдиреА рд╣реБрдИ рд╣реИ - рдЕрдВрдХ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рд╣рдо рдЕрдкрдиреЗ рдХреИрдорд░реЗ рдХреА рдкрд╛рд░реА рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВред рдпрд╣ рд╕рд░рд▓ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреБрд▓рд╢рд┐рдлреНрдЯ рдХреЛ рднреА AddDot () рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
public void AddDot(int x, int y, Vector2 shift) { DotX = (int)(Math.Abs(x-shift.X) / DotSize ); DotY = (int)(Math.Abs(y-shift.Y) / DotSize ); DotsNow[DotX, DotY] = !DotsNow[DotX, DotY]; }
рдЕрдм рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЕрдВрдХ рдЬреЛрдбрд╝реЗ рдЬрд╛рдПрдВрдЧреЗред рд╣реЛрдорд╡рд░реНрдХ: рдЬрдм рдЖрдк рдХреНрд╖реЗрддреНрд░ рдХреЗ рдмрд╛рд╣рд░ рдПрдХ рдЬреАрд╡рд┐рдд рдХреЛрд╢рд┐рдХрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рднреА рдПрдХ рдЧрд▓рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реЛрдЧреА: рдпрд╛ рддреЛ рдПрдХ рджрд░реНрдкрдг рдмрд┐рдВрджреБ рдкрд░ рдЬреЛрдбрд╝рдХрд░ рдпрд╛ рд╕рд░рдгреА рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдкрд░реЗ рдЬрд╛рдХрд░ред рдХреНрд╖реЗрддреНрд░ рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдкрд░реЗ рдЬрд╛рдирд╛ рдЕрд╕рдВрднрд╡ рдмрдирд╛ рджреЗрддрд╛ рд╣реИред

рдЪреЗрд╢рд╛рдпрд░ рдмрд┐рд▓реНрд▓реАрдирд┐рд╖реНрдХрд░реНрд╖
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕рдм рд╣реИ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд┐рдВрдбреЛрдЬ рдлреЛрди рдФрд░ рд╣реЛрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЧреЗрдо рд▓рд╛рдЗрдл рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдЖрдк рдПрдХ-рджреЛ рдШрдВрдЯреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕рд┐рд░ рдлреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдмрдиреНрд╕ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдкреАрдврд╝реА рдХрд╛рдЙрдВрдЯрд░, рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рднрд░рдиреЗ рдФрд░ рдмрд╣реБрдд рдХреБрдЫред рдЖрдк рдореЗрд░рд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдорд╛рд░реНрдХреЗрдЯрдкреНрд▓реЗрд╕ рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ
рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдл рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрд░реЛрдд рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ ред
рдирдП рд╕рд╛рд▓ рдХреА рдЫреБрдЯреНрдЯрд┐рдпрд╛рдВ рдордирд╛рдПрдВ!